我有一个用于工作表功能测试程序 (FTP) 的 VBA 脚本,它将获取存储在 32 个单独命名的范围内的值并将它们粘贴到单独的工作表“结果”中。当我尝试将同一脚本用于验收测试程序 (ATP) 时,它会重复 FTP 的结果并将其复制到原始 FTP 结果下方。我对 VBA 还不熟悉,对其了解不多,但我确实了解其他编程语言。我不明白为什么它对 ATP 不起作用,就像对 FTP 一样。
功能测试程序脚本
Sub Copy_Filtered_Sections()
Dim Section As Long, NextRow As Long
For Section = 1 To 32
NextRow = Sheets("Results").Range("A" & Rows.Count).End(xlUp).Row + 1 'Next empty row
Sheets("Function Test Procedure").Select
Range("FTPSec" & Section).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Results").Range("A" & NextRow)
' Range("FTPSec" & Section).Columns("G:H").SpecialCells(xlCellTypeVisible).Copy _
' Destination:=Sheets("Results").Range("N" & NextRow)
Next Section
End Sub
验收测试程序脚本
Sub Copy_ATP_Tables()
Dim SectionATP As Long, NextRow As Long
For SectionATP = 1 To 32
NextRow = Sheets("Results").Range("A" & Rows.Count).End(xlUp).Row + 1 'Next empty row
Sheets("Acceptance Test Procedure").Select
Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Results").Range("A" & NextRow)
' Range("FTPSec" & Section).Columns("G:H").SpecialCells(xlCellTypeVisible).Copy _
' Destination:=Sheets("Results").Range("N" & NextRow)
Next SectionATP
End Sub
第二个函数返回以下错误消息:
“运行时错误‘1004’:对象‘_Global’的方法‘Range’失败”在行“Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Results").Range("A" & NextRow)
答案1
我认为问题在于工作簿中为 FTP 指定了范围,但没有为 ATP 指定。在功能测试程序代码中,第一次迭代时,类似的行
Range("FTPSec" & Section).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Results").Range("A" & NextRow)
调用命名范围 的 A 至 H 列中的可见单元格。您的工作簿中FTPSec1
可能存在命名范围FTPSec1
、FTPSec2
、...。FTPSec32
在验收测试程序代码中,通过模仿此处的语法,您假设命名范围ATPSec1
、ATPSec2
、...ATPSec32
在工作簿中已定义。如果没有,您的代码将抛出错误,因为 Excel 不知道Range("ATPSec1")
所指的内容。
要检查这是否确实是问题所在,请按Ctrl+打开 Excel 中的名称管理器F3。在这里,您将看到工作簿中的所有命名范围。我怀疑您会看到 FTP 范围,但看不到 ATP 范围。
要解决此问题,您必须执行以下操作之一:
在工作簿中定义范围
ATPSec1
、ATPSec2
、...。ATPSec32
通过名称管理器创建新的命名范围来执行此操作;或更改 ATP 代码,以便 VBA 识别相关范围,大概使用您最初定义范围时使用的相同标准。
答案2
为了消除歧义,使用范围时应参考工作表。合并两行代码
Sheets("Acceptance Test Procedure").Select
Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Results").Range("A" & NextRow)
更改为:
Sheets(“验收测试程序”)。范围(“ATPSec”&SectionATP)。列(“A:H”)。SpecialCells(xlCellTypeVisible)。复制 _ 目标:=Sheets(“结果”)。范围(“A”&NextRow)
因此,您可以像限定目标一样限定源。
如果这不能消除错误,您必须手动调试。在 VBA 编辑器中,进入子程序(F8)以初始化变量。然后单击直接访问窗口并键入
SetctionATP = 1
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).address
这应该会返回一个有效范围。下一步
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).Columns("A:H").address
您可以通过改变来测试其他命名范围SectionATP
。