我有一個用於工作表功能測試程式 (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("結果").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("驗收測試程序").Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Results").Range(" A" 和下一行)
因此,您可以像限定目的地一樣限定來源。
如果這不能消除錯誤,您必須手動調試。在 VBA 編輯器中,單步執行 (F8) 來初始化變數。然後點擊進入直接存取視窗並輸入
SetctionATP = 1
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).address
這應該會傳回一個有效範圍。下一個
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).Columns("A:H").address
您可以透過改變 來測試其他命名範圍SectionATP
。