VBA スクリプトをあるシートから別のシートにコピーする

VBA スクリプトをあるシートから別のシートにコピーする

ワークシート 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があると考えられます。FTPSec1FTPSec2FTPSec32

受け入れテスト手順コードでは、ここでの構文を模倣することで、名前付き範囲ATPSec1、、ATPSec2... がATPSec32ブックに定義されていると想定しています。定義されていない場合は、Excel が参照先を認識できないため、コードでエラーが発生しますRange("ATPSec1")

これが実際に問題であるかどうかを確認するには、Ctrl+を押して Excel で名前マネージャーを開きますF3。ここで、ワークブック内のすべての名前付き範囲が表示されます。おそらく、FTP 範囲は表示されますが、ATP 範囲は表示されないと思います。

この問題を解決するには、次のいずれかを実行する必要があります。

  • ワークブックに 範囲ATPSec1ATPSec2、...を定義します。これを行うには、名前マネージャーを使用して新しい名前付き範囲を作成します。または、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

関連情報