ワークシート Function Test Procedure(FTP) 用の VBA スクリプトがあります。このスクリプトは、32 個の個別に名前が付けられた範囲に格納されている値を取得し、別のワークシート Results に貼り付けます。同じスクリプトを Acceptance Test Procedure(ATP) に使用しようとすると、FTP からの結果が繰り返され、元の FTP Results の下にコピーされます。私はまだ VBA の初心者で、あまり理解していませんが、他のプログラミング言語は理解しています。なぜこれが FTP のように ATP で機能しないのか理解できません。
機能テスト手順スクリプト
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
2 番目の関数は次のエラー メッセージを返します。
「実行時エラー '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
曖昧さをなくすために、範囲を使用するときはシートを参照する必要があります。2行のコードを結合します
Sheets("Acceptance Test Procedure").Select
Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Results").Range("A" & NextRow)
これに:
Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _ Destination:=Sheets("Results").Range("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
。