用于保留先前迭代的循环

时间:2019-01-06 07:45:19

标签: excel vba

我在VBA方面经验不足,因此很难对其进行故障排除。运行代码时,它输出Array(i<=i)而不是Array(i)

我已经测试了条件,发现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 :(得分:0)

使用Selection.ExportAsFixedFormat等代替ActiveSheet。 ActiveSheet始终仅是一张工作表,而您的选择包括许多工作表。 经过进一步研究,我发现您可能必须包括对每个工作表进行选择,例如Ws.UsedRange.Select。看看this thread

答案 1 :(得分:0)

您可能没有意识到,但是您可以在每个变量中将变量用作控制变量,以迭代变量数组。使用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