我在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循环中犯了一个逻辑错误。
答案 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