プロが教える店舗&オフィスのセキュリティ対策術

チェックボックスで選択た複数のシートを1つのpdfにできるようにしたいのですが、ご指導いただければ幸いです。
シートは「1月講座室予約表」から「12月講座室予約表」まであります。

CheckBox1は1月講座室予約表、CheckBox2は2月講座室予約表・・・に対応させたいです。

次のコードを書いてみたのですが、「Sheets(Array(MySht(i))).Select」のところが「インデックスが有効範囲にありません」と表示されてしまいます。

Private Sub CommandButton1_Click()

Dim MySht(11) As Variant

For i = 1 To 12
If Me.Controls("CheckBox" & i).Value = True Then

MySht(i) = i&"月講座室予約表"


End If
Next i

Sheets(Array(MySht(i))).Select


ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
FileName:=ActiveWorkbook.Path & "¥" & "予約表" & Format(Date, "yyyymmdd") & ".pdf"


End Sub

A 回答 (5件)

既に複数の回答がついていますが、ご質問者のオリジナルのコードから最低限の修正でご希望の挙動になるようにするなら、以下ではいかがでしょうか



Private Sub CommandButton1_Click()
Dim MySht() As Variant
Dim i As Long
Dim j As Long

j = -1
For i = 1 To 12
If Me.Controls("CheckBox" & i).Value = True Then
j = j + 1
ReDim Preserve MySht(j)
MySht(j) = i & "月講座室予約表"
End If
Next i
Sheets(MySht).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ActiveWorkbook.Path & "\" & "予約表" & Format(Date, "yyyymmdd") & ".pdf"
End Sub

残念ながらオリジナルのコードにはbonaronさんの回答にあるようなエラー回避の判定がありません。
このため、どのチェックボックスにもチェックを入れなかった場合、上記のVBAではエラーになります。
「チェックボックスに一つもチェックが入らなかったら」を判別してエラーを回避するロジックを追加してください。
    • good
    • 0

シート名を配列に入れる、ということで


シート名に使用できない文字をデリミッターにする、
という小技を使ってみました。

Private Sub CommandButton1_Click()
Dim MySht As Variant
Dim strName As String
Dim i As Long

For i = 1 To 12
 If Me.Controls("CheckBox" & i).Value = True Then
  strName = strName & "/" & i & "月講座室予約表"
 End If
Next i
If strName = "" Then
 MsgBox "選択されていません"
 Exit Sub
End If
MySht = Split(Mid(strName, 2), "/")
Sheets(MySht).Select

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ActiveWorkbook.Path & "\" & "予約表" & Format(Date, "yyyymmdd") & ".pdf"

End Sub
    • good
    • 0

>複数のシートを1つのpdfに



#2は頓珍漢な回答でしたね
ActiveSheetとなっていたので コード見て勘違いしました。。。
#1 +
ActiveWorkbookとすれば良いかと思います

Dim i As Integer
For i = 1 To 12
If Me.Controls("CheckBox" & i).Value = True Then
Sheets(i & "月講座室予約表").Select False
End If
Next i
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
FileName:=ActiveWorkbook.Path & "\" & "予約表" & Format(Date, "yyyymmdd") & ".pdf"
    • good
    • 0
この回答へのお礼

ご丁寧になりがとうございます。
いろいろ勉強してみます。

お礼日時:2022/10/05 15:10

ご質問の部分(エラー)は#1に書いた通りですが、全体を見ると



シート選択を実行したいのかなと思いきやActiveSheet・・・
(複数選択してもActiveSheetは1つです)

仮に複数のPDF出力が実行されても
"¥" & "予約表" & Format(Date, "yyyymmdd") & ".pdf"
同じ名前のファイルで結果最後のシートのみのPDFが残る(1ファイルのみ)

CheckBoxで選択したシートをPDFにエキスポートするなら、それこそ選択する必要は無いと思います(名前はシート名+日付)

Dim i As Integer
For i = 1 To 12
If Me.Controls("CheckBox" & i).Value = True Then
Sheets(i & "月講座室予約表").ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ActiveWorkbook.Path & "\" & i & "月講座室予約表" & Format(Date, "yyyymmdd") & ".pdf"
End If
Next i

なんとなく配列が出てきた意図が分かりました
配列を使う場合は、(インデックスが分かり難いかも知れませんが)

Dim MySht() As String
Dim i As Integer
For i = 1 To 12
If Me.Controls("CheckBox" & i).Value = True Then
ReDim Preserve MySht(i - 1)
MySht(i - 1) = i & "月講座室予約表"
End If
Next i

For i = 0 To UBound(MySht)
Sheets(MySht(i)).ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ActiveWorkbook.Path & "\" & MySht(i) & Format(Date, "yyyymmdd") & ".pdf"
Next

①②共に同じ結果が得られると思います
    • good
    • 0

こんばんは


配列に拘りますか?2度手間になるだけなので・・
普通に書いた方が良いと思います

For i = 1 To 12
If Me.Controls("CheckBox" & i).Value = True Then
Sheets(i & "月講座室予約表").Select False
End If
Next i

配列にしてもそのまま選択にしても エラー対策が必要と思われる処理ですね
配列を使いたい・・
1つアドバイスを書くのなら、配列に配列は入れられません なので
文字列を作る必要がありますが、あれこれ面倒だと推測します
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!