1

У меня есть рабочий VBA-скрипт для процедуры функциональной проверки рабочего листа (FTP), который будет принимать значения, хранящиеся в 32 именованных диапазонах, и вставлять их в отдельный рабочий лист, Результаты. Когда я пытался использовать этот же сценарий для процедуры приемочного тестирования (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).Столбцы ("А: Н").SpecialCells (xlCellTypeVisible).Копировать _ Назначение: = Листы ("Результаты").Диапазон ("A" и NextRow)

2 ответа2

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") .

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

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

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

  • Измените свой код для ATP, чтобы VBA идентифицировал соответствующие диапазоны, предположительно используя те же критерии, которые вы использовали бы для определения диапазонов в первую очередь.

0

Чтобы устранить неоднозначность, вы должны обратиться к листу при использовании диапазона. Объединить две строки кода

    Sheets("Acceptance Test Procedure").Select
    Range("ATPSec" & SectionATP).Columns("A:H").SpecialCells(xlCellTypeVisible).Copy _
    Destination:=Sheets("Results").Range("A" & NextRow)

к этому:
Листы ("Процедура приемочных испытаний").Диапазон ("ATPSec" & SectionATP).Столбцы ("А: Н").SpecialCells (xlCellTypeVisible).Копировать _ Назначение: = Листы ("Результаты").Диапазон ("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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .