Excel VBA:通过代码将名称分配给单元格,相对于另一个命名单元格

时间:2015-05-25 17:39:30

标签: excel vba excel-vba

我有一段代码在给定的单元格之后添加一定数量的单元格(向下)(在下面的示例中名为cell_22c)。 (每节添加11个单元格 - nbDR是节的数量)。在插入每11个单元格之后,我希望我的代码命名单元格“cell_22c_j”,其中j将是“for”循环中的数字,也取决于nbDR。我已经研究了Names功能并尝试使用录制的宏,但我没有设法引用现有的单元格!代码:

Dim nbDR as integer
Dim i as integer
Dim j as integer
For j = 1 to nbDR
    For i = 1 To 11
            Range("cell_22c")(7).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Next i
    ActiveWorkbook.Worksheets("Overview").Names.Add Name:="cell_22c_" & j, _
        RefersToR1C1:="=Overview!R45C38"
next j

它应插入11行,然后在该部分中命名一个单元格。再插入11个并在新部分中命名一个单元格等。

我相信我的代码很好,除了RefersTo部分,显然,这是我需要帮助的部分(我认为)。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

这是你在尝试什么?我已经对代码进行了评论,但如果您有任何问题请告诉我

Sub Sample()
    Dim nbDR As Long, i As Long, j As Long
    Dim rw As Long, col As Long
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("Overview")

    '~~> Change this to whatever you want
    nbDR = 5

    With ws
        '~~> Get the current row and coloumn of the named range
        rw = .Range("cell_22c").Row
        col = .Range("cell_22c").Column

        For j = 1 To nbDR
            For i = 1 To 11
                '~~> Insert 1 cell below
                .Range("cell_22c").Offset(1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Next i

            ws.Names.Add Name:="cell_22c_" & j, _
            RefersToR1C1:="=" & ws.Name & "!R" & rw + 11 & "C" & col

            '~~> the below is only for testing purpose
            'Range("cell_22c_" & j).Value = "cell_22c_" & j
        Next j
    End With
End Sub

修改:如果范围(“cell_22c”)有多个行/列,则相应地更改rw/col的值,例如

rw = .Range("cell_22c").Row + .Range("cell_22c").Rows

然后

.Range("cell_22c").Offset(1) 

变为

.Range("cell_22c").Offset(rw+1)

同样,如果需要,也可以处理col

答案 1 :(得分:2)

有些理解你的代码试图完成的内容受到项目超级秘密性质的阻碍,但我相信它基本上可以归结为以下内容。

Dim nbDR As Long, j As Long
With ActiveWorkbook.Worksheets("Overview")
    .Range("cell_22c")(7).Resize(11 * nbDR, 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    For j = 1 To nbDR
        .Range("cell_22c")(7 + j * 11).Name = "cell_22c_" & j
    Next j
End With

无需循环插入行。只需一次插入所有这些,然后循环并以尽可能最短的方式分配名称。