VBA 脚本从一张表复制到另一张表

VBA 脚本从一张表复制到另一张表

我有一个用于工作表功能测试程序 (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可能存在命名范围FTPSec1FTPSec2、...。FTPSec32

在验收测试程序代码中,通过模仿此处的语法,您假设命名范围ATPSec1ATPSec2、...ATPSec32在工作簿中已定义。如果没有,您的代码将抛出错误,因为 Excel 不知道Range("ATPSec1")所指的内容。

要检查这是否确实是问题所在,请按Ctrl+打开 Excel 中的名称管理器F3。在这里,您将看到工作簿中的所有命名范围。我怀疑您会看到 FTP 范围,但看不到 ATP 范围。

要解决此问题,您必须执行以下操作之一:

  • 在工作簿中定义范围ATPSec1ATPSec2、...。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

相关内容