断开代码中指定的地址与命名范围之间的连接以及生成的命名范围地址

时间:2011-02-15 18:18:19

标签: excel-vba excel-2003 vba excel

我正在尝试在Excel 2003中编写VBA脚本(不是我选择的版本),以将工作表上的预定义范围划分为十个命名范围。工作表名称是“paste_data”,我想要将脚本限制为的单元格的“块”是A4:AO111。有时,当我运行脚本时,它可以工作,但在其他时候,它似乎将有效的起始单元格从A4移动到另​​一个单元格。这是一个糟糕结果的例子(对不起,因为我是新手,我无法发布图片):

指定范围 table.emergency.count 指的是范围V6:AO25,它应该引用范围V4:AO23。

我的代码在这里:

Sub tables_assign()
Dim j As Integer
Dim range_ref, range_name, rref As String
Dim tbles(1 To 10) As String
Dim rw1, rw2 As Integer
'##########################################################################################
'CREATION AND NAMING OF TABLES
'##########################################################################################
tbles(1) = "table.emergency.score": tbles(2) = "table.emergency.count": tbles(3) = "table.eol.score": tbles(4) = "table.eol.count": tbles(5) = "table.inpatient.score": tbles(6) = "table.inpatient.count": tbles(7) = "table.outpatient.score": tbles(8) = "table.outpatient.count": tbles(9) = "table.sds.score": tbles(10) = "table.sds.count"
For j = 1 To 10
    If j Mod 2 <> 0 Then
        If j = 1 Then
            rw1 = 4
            rw2 = 23
        Else
            rw1 = 4 + 22 * Application.WorksheetFunction.Ceiling((j / 2 - 1), 1)
            rw2 = 23 + 22 * Application.WorksheetFunction.Ceiling((j / 2 - 1), 1)
        End If
        rref = Trim(Application.WorksheetFunction.Substitute("=paste_data!A" & Str(rw1) & ":T" & Str(rw2), " ", ""))
        ActiveWorkbook.Names.Add tbles(j), rref
    Else
        If j = 2 Then
            rw1 = 4
            rw2 = 23
        Else
            rw1 = 4 + 22 * (j / 2 - 1)
            rw2 = 23 + 22 * (j / 2 - 1)
        End If
        rref = Trim(Application.WorksheetFunction.Substitute("=paste_data!V" & Str(rw1) & ":AO" & Str(rw2), " ", ""))
        ActiveWorkbook.Names.Add tbles(j), rref
    End If
Next j
End Sub

有没有人知道为什么会这样?我的预感是工作表的'usedrange'是罪魁祸首。

1 个答案:

答案 0 :(得分:0)

在定义的名称中使用相对引用时,定义与activecell相关。为避免这种情况,请使用绝对引用,例如$ V $ 4:$ AO $ 23。使用绝对引用时,命名范围将始终指向相同的单元格。

实施例: 选择单元格A1并将名称test_relative定义为“= A1”。现在选择单元格B10并重新打开已定义的名称框,选择test_relative,您将看到类似“= Sheet1!B10”的内容

要修复代码,请在范围引用中插入$

rref = Trim(Replace("=paste_data!$A$" & Str(rw1) & ":$T$" & Str(rw2), " ", ""))

另请注意

Dim rw1, rw2 As Integer

尺寸rw1作为变体。使用

Dim rw1 As Integer, rw2 As Integer