簡體   English   中英

使用VBA將多個Excel工作表打印到一個pdf並獲得運行時錯誤'9':選擇選項卡時下標超出范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM