2017-06-19 1 views
0

複数のワークシートを選択してPDFにエクスポートするVBAスクリプトを作成しようとしています。私はまだコーディングするのはかなり新しいですが、私はPDF部分のコーディング(1つのタブで作業するようにしています)でうまくいきます。私が問題を抱えているのは、複数のワークシートを選択することです。私はワークシート名を見て、それを選択するかどうかを決定する動的配列を使用しています。私がワークシートを選択する部分に着くまで、すべてのことがうまく動作します。私はランタイムエラー '9'を取得します:下付き文字が範囲外です。私はいくつかのDebug.Printsをコードに入れて、配列にワークシート名が含まれていることを確認してください。以下は私のコードです。複数のExcelワークシートをVBAを使用して1つのpdfに印刷し、ランタイムエラー '9'を取得する:タブを選択すると範囲外の添字

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 
+0

半野生の推測:ReDim Sheetstoprint(0 Toサイズ)をReDim Sheetstoprint(1 To size)に変更してください –

+0

あなたは素晴らしいです。それはうまくいった。私はこれに2日を費やし、それを完全に逃した。ありがとうございました。 –

+0

私は自分の努力の中で頻繁に現れるので、私はキャッチするのに慣れている間違いです。 ;-)それは喜んで助けた。 –

答えて

0

あなたは解決策を得ていないというあなたの探求の中で、複雑すぎることがあると思います。

これが私の作品:

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 
0

他の答えは、おそらくそれについて移動する良い方法ですが、完全を期すために、私はあなたのコード内で何が起こっているかを説明します。

size変数を、ブック内の単語「セグメント」を含むシートの数に設定します。私のテストケースでは、単語を含む3枚のシート(合計7枚)がありました。したがって、size変数は3に設定されます。配列Sheetstoprintを0から3にディメンション化すると、(インデックス0、インデックス1、インデックス2、およびインデックス3)合計4つのシート名が保持されますその基準に合致する3枚のシート。または、より一般的には、「セグメント」のようなn枚のシートがある場合は、サイズn + 1の配列の寸法を決めています。

:私は遠くダウンコードで i変数を注文し直す必要があったので、私はこれを変更

ReDim Sheetstoprint(1 To size) 

ReDim Sheetstoprint(0 To size) 

を変えそして補うためにこれを修正するには

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 

To:

そして、私が期待しているシートを選択するとうまくいくようです。

関連する問題