Скрипт VBA скопирован с одного листа на другой

Скрипт VBA скопирован с одного листа на другой

У меня есть рабочий скрипт VBA для рабочего листа Function Test Procedure (FTP), который берет значения, хранящиеся в 32 индивидуально именованных диапазонах, и вставляет их на отдельный рабочий лист Results. Когда я попытался использовать тот же скрипт для Acceptance Test Procedure (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': Метод 'Range' объекта '_Global' не выполнен" в строке "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")ссылается.

Чтобы проверить, что проблема действительно в этом, откройте Name Manager в Excel, нажав Ctrl+ F3. Здесь вы увидите все именованные диапазоны в рабочей книге. Я подозреваю, что вы увидите диапазоны FTP, но не диапазоны ATP.

Чтобы решить эту проблему, необходимо выполнить одно из следующих действий:

  • Определите диапазоны ATPSec1, ATPSec2, ..., ATPSec32в вашей рабочей книге. Сделайте это, создав новые именованные диапазоны через Name Manager; или

  • Измените свой код для 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("Результаты").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.

Связанный контент