한 시트에서 다른 시트로 복사된 VBA 스크립트

한 시트에서 다른 시트로 복사된 VBA 스크립트

개별적으로 명명된 32개의 범위에 저장된 값을 가져와 별도의 워크시트인 결과에 붙여넣는 워크시트 Function Test Procedure(FTP)에 대해 작동하는 VBA 스크립트가 있습니다. Acceptance Test Procedure(ATP)에 동일한 스크립트를 사용하려고 시도하면 FTP의 결과가 반복되어 원래 FTP 결과 아래에 복사됩니다. 저는 아직 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

두 번째 함수는 다음 오류 메시지를 반환합니다.

"런타임 오류 '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이름 관리자를 통해 새로운 명명된 범위를 생성하면 됩니다. 또는

  • VBA가 관련 범위를 식별하도록 ATP에 대한 코드를 변경하십시오. 아마도 처음에 범위를 정의하는 데 사용했던 것과 동일한 기준을 사용했을 것입니다.

답변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" 및 다음 행)

따라서 대상을 한정하는 것과 동일한 방식으로 소스를 한정합니다.
그래도 오류가 제거되지 않으면 수동으로 디버깅해야 합니다. VBA 편집기에서 하위(F8) 키를 눌러 변수를 초기화합니다. 그런 다음 직접 액세스 창을 클릭하고 다음을 입력하세요.

SetctionATP = 1
? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).address

유효한 범위가 반환되어야 합니다. 다음

? Sheets("Acceptance Test Procedure").Range("ATPSec" & SectionATP).Columns("A:H").address

를 변경하여 다른 명명된 범위를 테스트할 수 있습니다 SectionATP.

관련 정보