Для сохранения цикла предыдущей итерации - PullRequest
0 голосов
/ 06 января 2019

У меня нет особого опыта работы с VBA, поэтому мне было трудно решить эту проблему. При запуске кода он выводит Array(i<=i) вместо Array(i)

Я проверил условие for и обнаружил, что Array(0) правильно возвращает результат. Однако Array(1) напечатает Array(1) с Array(0) и так далее.

Цель этого кода состоит в том, чтобы сгруппировать рабочие листы на основе их имени и распечатать их в формате pdf на основе группировки, то есть всех листов, начиная с I1, в один файл PDF.

Sub Test()
    FolderPath = "C:\Example"

    Dim aWS()
    Dim n As Integer
    Dim ws As Worksheet
    Dim DocTypes()

    DocTypes = Array("I1","I2","I3")

    For i = LBound(DocTypes) To UBound(DocTypes)
        For Each ws In Worksheets
            If Left(ws.Name, 2) = DocTypes(i) Then
                n = n + 1
                ReDim Preserve aWS(1 To n) 'Add 1 to to array length
                aWS(n) = ws.Name 'Add worksheet name meeting If condition 
            End If
        Next ws  

        Sheets(aWS).Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FolderPath & 
            DocTypes(i), _
            openafterpublish:=True, ignoreprintareas:=False
    Next i
End Sub

То, что я ожидаю, это:

i = 0 to 2

Сначала Array(i) = "I1", поэтому выведите все листы, начинающиеся с "I1", в формате pdf

Затем перейдите к i = 1

Здесь Array(i) = "I2", поэтому выведите все листы, начинающиеся с "I2", в формате pdf

Однако, когда я делаю шаг вперед, кажется, что он не следует этой логике, и я не понимаю, почему. Я думаю, что это связано с выбором, из этого следует, что, если был выбран i=0, то к выбору был добавлен i=1, эта проблема имела бы смысл. Я пытался повторно выбрать один лист прямо перед Next i, чтобы пропустить это, но это не сработало. Это заставляет меня думать, что я допустил логическую ошибку в своих циклах for.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Возможно, вы не знаете, но вы можете использовать вариант в качестве управляющей переменной для каждого для итерации массива вариантов. Использование redim для расширения массива на 1 элемент предполагает, что вы должны использовать словарь сценариев в качестве промежуточного шага для вашего массива. Метод .Items словаря сценариев возвращает массив элементов, поэтому вы легко можете получить свой массив, который будете использовать впоследствии. Вот ваш код, исправленный для использования scripting.dictionary и переменной управления вариантом. В вашем конкретном случае мы в основном используем scripting.dictionary в качестве списка, делая ключ и элемент одинаковыми.

Option Explicit

Sub Test()

    Const FolderPath                        As String = "C:\Example"

    Dim aWS                                 As Scripting.Dictionary
    Dim ws                                  As excel.Worksheet
    Dim DocTypes()                          As Variant
    Dim DocType                             As Variant

    DocTypes = Array("I1", "I2", "I3")

    For Each DocType In DocTypes

        Set aWS = New Scripting.Dictionary

        For Each ws In Worksheets

            If DocType = left(ws.Name, 2) Then

                aWS.Add Key:=ws.Name, Item:=ws.Name

            End If

        Next ws

        Sheets(aWS.Items).Select
        ActiveSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            FileName:=FolderPath & DocType, _
            openafterpublish:=True, _
            ignoreprintareas:=False
    Next

End Sub
0 голосов
/ 06 января 2019

Используйте Selection.ExportAsFixedFormat и т. Д. Вместо ActiveSheet. ActiveSheet - это всегда только один лист, в то время как ваш выбор состоит из многих. После дальнейшего изучения я обнаружил, что вам может потребоваться сделать выбор для каждой из рабочих таблиц, например Ws.UsedRange.Select. Взгляните на эту тему .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...