我正在尝试在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'是罪魁祸首。
答案 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