У меня есть рабочий скрипт 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
.