![](/img/trans.png)
[英]Printing Array of Long to Cells in VBA and getting subscript out of range error
[英]Printing multiple excel worksheets to one pdf using VBA and getting Run-time error '9': subscript out of range when selecting tabs
我正在嘗試創建一個VBA腳本,該腳本將選擇多個工作表,然后將這些工作表導出為PDF。 我對編碼還是很陌生,但是我對PDF部分的編碼很好(讓它在單個選項卡上工作)。 我遇到麻煩的地方是選擇多個工作表。 我正在使用動態數組來查看工作表名稱並確定是否選擇它。 一切正常,直到我到達選擇工作表的那一部分。 我收到運行時錯誤“ 9”:下標超出范圍。 我在代碼中放入了多個Debug.Prints,並確實看到我的數組包含工作表名稱。 下面是我的代碼。
Sub pdf_Print()
Dim c As Integer
Dim d As Integer
Dim size As Integer
Dim i As Integer
Dim s As Integer
Dim wba As Workbook
Dim wa As Worksheet
Dim b As Integer
Set wba = ActiveWorkbook
'Debug prints active workbook name for Debugging
Debug.Print wba.Name
'Gets number of tabs to print
size = GetPrintTabs(wba)
'Setup Array for tabs to print
Dim Sheetstoprint() As Variant
ReDim Sheetstoprint(0 To size)
'Debug print Array size
Debug.Print size
'Stores tab names in Array
For Each wa In ActiveWorkbook.Worksheets
If (wa.Name Like "*segment*" And wa.Visible = True) Then
Sheetstoprint(i) = wa.Name
i = i + 1
Debug.Print Sheetstoprint(i)
End If
Next wa
'Debug to ensure show which tabs are in Array
For b = LBound(Sheetstoprint) To UBound(Sheetstoprint)
Debug.Print Sheetstoprint(b)
Next
'Select sheets in Array
ActiveWorkbook.Worksheets(Sheetstoprint).Select
End Sub
Public Function GetPrintTabs(awb As Workbook) As Integer
Dim wsa As Worksheet
Dim i As Integer
For Each wsa In awb.Worksheets
If (wsa.Name Like "*segment*" And wsa.Visible = True) Then
i = i + 1
End If
Next wsa
GetPrintTabs = i
Debug.Print "size =" & i
End Function
我想您可能會因為過於復雜而無法獲得解決方案。
這對我有用:
Sub SelectMultipleSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Dim SheetsToPrint() As Variant
Dim i As Integer
If (ws.Name Like "*segment*" And ws.Visible = True) Then
ReDim Preserve SheetsToPrint(i)
SheetsToPrint(i) = ws.Name
i = i + 1
End If
Next
Worksheets(SheetsToPrint).Select
End Sub
其他答案可能是解決問題的更好方法,但是為了完整起見,我將解釋代碼中發生的事情。
您將size
變量設置為等於工作簿中包含單詞“ segment”的工作表數。 在我的測試用例中,我有3張紙(共7張)包含單詞。 因此,將size
變量設置為3。將數組Sheetstoprint
尺寸從0設置為3時,盡管只具有4個工作表名稱(索引0,索引1,索引2和索引3),但仍允許保留它們。符合條件的三張紙。 或更籠統地說,如果您有n個像“ segment”一樣的工作表,則您正在確定尺寸為n + 1的數組的尺寸。
為了糾正這一點,我改變了
ReDim Sheetstoprint(0 To size)
至
ReDim Sheetstoprint(1 To size)
為了補償,我不得不在代碼中更遠的位置對i
變量進行重新排序,因此我對此進行了更改:
For Each wa In ActiveWorkbook.Worksheets
If (wa.Name Like "*segment*" And wa.Visible = True) Then
Sheetstoprint(i) = wa.Name
i = i + 1
Debug.Print Sheetstoprint(i)
End If
Next wa
至:
For Each wa In ActiveWorkbook.Worksheets
If (wa.Name Like "*segment*" And wa.Visible = True) Then
i = i + 1
Sheetstoprint(i) = wa.Name
Debug.Print Sheetstoprint(i)
End If
Next wa
通過選擇我期望的工作表,它似乎可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.