VBA シートが一個しか出力されないものとしっかり結合して出力するのと分かれる
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 551
フォルダ内のエクセルファイルをPDF出力するマクロを作成しました。
出力したい条件としては、シート名にDBを含むシートは除いて、すべてをPDF出力、複数シートがある場合は結合してPDF出力
と言った作業が行いたく以下のマクロを作成しました。
Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換
Dim Button, T, i, L As Integer
Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String
Application.DisplayAlerts = False '確認メッセージを無効化します。
Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認")
If Button = vbYes Then
OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。
If OpenExcelFileName <> "False" Then
ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。
ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く)
MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。"
Else
MsgBox "キャンセルされました"
Exit Sub 'キャンセルでプログラムを終了します。
End If
ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。
Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。
Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む
ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?)
Set wb = ActiveWorkbook
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
'ActiveWorkbook の記述はいらなかった
'レポートの記述にいらないスペースがあったかも
Dim sheet_count As Integer
sheet_count = Worksheets.Count
Dim ArrayShName() As String
ReDim ArrayShName(sheet_count)
Dim mySheet As Worksheet
On Error Resume Next 'エラー無視
Dim k As Long
k = 0
Dim j As Integer
For j = 1 To Worksheets.Count
If Worksheets(j).Name <> "DB" Then
ArrayShName(k) = Worksheets(j).Name
k = k + 1
End If
Next
Worksheets(ArrayShName).Select
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=ExcelFilePath & ExFileName, _
OpenAfterPublish:=True
ActiveWindow.Close '読み込んだファイルを閉じます。
ExFileName = Dir() '次のファイルを指定する。
Loop
MsgBox "PDFファイルに一括変換しました。"
Else
MsgBox "処理を中断します"
End If
Application.DisplayAlerts = True '確認メッセージを有効化します。
End Sub
ただ現状タイトルにも記載して重複で申し訳ないんですが、
複数シートがあるファイルをPDF出力する際シートが一つしか出力されないものと全て出力されるものと分かれてしまい
その原因がどこにあるのかわからず困っております。
調べ方であったり、ここの記述がおかしい!など手掛かりになるヒント、アドバイスを頂けると幸いです。
宜しくお願い致します。
参考記事:https://ateitexe.com/excel-vba-sheets-to-merge-pdf/
OS:macOS Catalina バージョン10.15.3
Excelバージョン: Microsoft Excel for Mac バージョン16.39
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
以下のように修正してうまくいきませんか?
修正前) ActiveSheet.ExportAsFixedFormat
修正後) wb.ExportAsFixedFormat
マイクロソフトのドキュメントではExportAsFixedFormatメソッドはWorkbookオブジェクトのメソッドだと書いてありました。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.exportasfixedformat
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Worksheets(ArrayShName).Select
の後に、
Stop
と書いて一次停止し、
意図したシートがちゃんと選択できているか
確認してみてください。
あと、コツとしては、
単一ブックで試してみることです。
繰り返すことはコンピューターは得意ですので、
とりあえず、1つだけで試す。
上手くいきそうなら3つで試す。
その後は10個でやってみる。
その中で、うまくいくファイルとそうでないファイルの違いを
探してみてください。
追記
Stopで止めたとき、
ローカルウィンドウの
ArrayShNameの中身を確認してください。
変数名の左に「⁺」があると思うので、それをクリックで中身が展開できます。
とりあえず、
新規ブックに以下のコードを記入し、
その後テストしたいファイルを開いた後、
コードを実行してみてください。
Option Explicit
Sub test()
Dim wb As Workbook
Set wb = Workbooks(Workbooks.Count) '最後に開いたブックの取得
If MsgBox(wb.Name & "を操作します。", vbYesNo) = vbNo Then Exit Sub
Dim v() As String
Dim ws As Worksheet
Dim i As Long, j As Long
ReDim v(wb.Worksheets.Count)
For i = 1 To wb.Worksheets.Count
Set ws = Worksheets(i)
If ws.Name <> "DB" Then
v(j) = ws.Name
j = j + 1
End If
Next
If j > 1 Then
ReDim Preserve v(j - 1)
Debug.Print Join(v, ",")
wb.Activate
wb.Worksheets(v).Select
End If
End Sub
動作確認は、
ステップインで、一行づつ実行しながら、
ローカルウィンドウで変数の中身が意図するものになっているか
確認しながら、最終的にはシートを選択するのですから、
意図した結果が、画面上に反映されているか確認してください。
やみくもに、本番コードに追記していっても、
時間がかかるばっかりかと思いますよ。
まずは、ひとつづテーマを絞って解決していって、
自信が出来たら、本番コードに追加していってみては?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
こんにちは。
sheet_count = Worksheets.Count
:
For j = 1 To Worksheets.Count
If Worksheets(j).Name <> "DB" Then
ArrayShName(k) = Worksheets(j).Name
Worksheets を wb.Worksheets としても変わりませんか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/08/06 09:01
ご指摘通り修正させて頂いたんですが、全てのシートはPDF化されるものの
DBという出力したくないシートも一緒にPDF化されてしまう感じですね....
2020/08/06 10:42
調べた限り、ExportAsFixedFormatメソッドに対応しているオブジェクトは下記の通りです。
Range
Chart
Worksheet
Chartsheet
Workbook
Project
注意すべきは、「WorkSheetsオブジェクト」が無いことです。
なので、指定方法を変えなければなりません。
Selection.ExportAsFixedFormat ←これで解決するはずです。
SelectionはRangeオブジェクトなのでExportAsFixedFormatメソッドに対応しています。
仕組みとしては、「WorkSheetsオブジェクトが渡せないなら、複数シートの全セルを含むRangeオブジェクトを渡してやろう」ということです。
Macでうまくいくかはわかりませんが、Windowsでは動作確認済です。
動作確認に使用したサンプルソースは下記に残しておきます。
```VBA
Sub EXCELファイルPDF化03()
Dim FolderPath As String
FolderPath = "ここにフォルダパス 例)C:\User\hoge\"
Dim fileName As String
fileName = Dir(FolderPath & "*.xls?")
' ワークブックを開き、「DB」シート以外のシートを選択状態にする
Do While fileName <> ""
Dim wb As Workbook
Set wb = Workbooks.Open(fileName:=FolderPath & fileName, ReadOnly:=True, UpdateLinks:=0)
Dim sh As Variant
Dim isSelected As Boolean: isSelected = False
For Each sh In Worksheets
If sh.name <> "DB" Then
' 既に選択しているシートがあれば、選択範囲を維持したまま拡張する
If isSelected Then
sh.Select False
Else
sh.Select
isSelected = True
End If
End If
Next
' Dir関数で取得したファイル名から拡張子を取り除く
Dim fileBaseName As String
fileBaseName = Left(fileName, InStr(fileName, ".") - 1)
' ワークシートをPDFファイルへエクスポート
Selection.ExportAsFixedFormat Type:=xlTypePDF, fileName:=FolderPath & fileBaseName & ".pdf"
wb.Close
fileName = Dir()
Loop
End Sub
```
2020/08/06 10:56
サンプルコードに漏れがありました。
全てのシートを選択状態にしたあと、Cells.Select を実行しなければなりません。
Cells.Select を実行しない場合、Range("A1")のアドレスになるので白紙のPDFが出力されます。
Cells.Selectメソッドは「DB」シート以外であれば、どのシートで実行しても大丈夫です。
2020/08/06 12:27
非常に丁寧でわかりやすい解説ありがとうございます!
検証までして頂き本当にありがとうございます。
Selectionというのは調べても見かけなかったですね....
そこで下記のコードで実行して見たところ1シートだけほぼ白紙のPDFが出力されました。
Cells.Selectの記述場所がおかしいでしょうか?
ご丁寧にお答え頂いてるところ恐縮ですがお返事頂けると幸いです。
宜しくお願い致します。
```VBA
Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換
Dim Button, T, i, L As Integer
Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String
Application.DisplayAlerts = False '確認メッセージを無効化します。
Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認")
If Button = vbYes Then
OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。
If OpenExcelFileName <> "False" Then
ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。
ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く)
MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。"
Else
MsgBox "キャンセルされました"
Exit Sub 'キャンセルでプログラムを終了します。
End If
ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。
Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。
Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む
ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?)
Set WB = ActiveWorkbook
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Dim sheet_count As Integer
sheet_count = Worksheets.Count
Dim ArrayShName() As String
ReDim ArrayShName(sheet_count)
Dim mySheet As Worksheet
On Error Resume Next 'エラー無視
Dim k As Long
k = 0
Dim j As Integer
For j = 1 To Worksheets.Count
If Worksheets(j).Name <> "DB" Then
ArrayShName(k) = Worksheets(j).Name
k = k + 1
End If
Next
Worksheets(ArrayShName).Cells.Select
Selection.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=ExcelFilePath & ExFileName, _
OpenAfterPublish:=True
ActiveWindow.Close '読み込んだファイルを閉じます。
ExFileName = Dir() '次のファイルを指定する。
Loop
MsgBox "PDFファイルに一括変換しました。"
Else
MsgBox "処理を中断します"
End If
Application.DisplayAlerts = True '確認メッセージを有効化します。
End Sub
2020/08/06 13:34
ではなく、
Worksheets(ArrayShName).Select
Cells.Select
としてみてください。
それで駄目なら、想定通りのセルが選択されているかデバッグしてみてください。
選択したセルに色を付ける処理を加えるといった方法でデバッグできると思います。
また、on error resume nextは外した方が無難です。
WorkSheetsオブジェクトなど、オブジェクトのコレクションを扱う処理においては沼にはまってしまいがちです。
というのも、あくまでオブジェクトのコレクションなので内部的には繰り返し処理がされている都合上、「あれ、1シートだけ適用されていない」など想定外のエラーが発生するためです。
2020/08/06 17:07
on error resume nextをコメントアウトした上で以下のようにコードを書き換えたところ
実行エラー9 インデックスの有効範囲ではないとのエラーが出ました。
この場合はちゃんとシートを見にいってくれなくなってるという事でしょうか?
ちなみにon error resume nextをつけた場合で試してみると
PDF出力されるようにはなったのですが出力されてほしくないDBのシートもPDF出力されてしまう状態です。
Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換
Dim Button, T, i, L As Integer
Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String
Application.DisplayAlerts = False '確認メッセージを無効化します。
Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認")
If Button = vbYes Then
OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。
If OpenExcelFileName <> "False" Then
ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。
ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く)
MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。"
Else
MsgBox "キャンセルされました"
Exit Sub 'キャンセルでプログラムを終了します。
End If
ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。
Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。
Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む
ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?)
Set WB = ActiveWorkbook
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Dim sheet_count As Integer
sheet_count = Worksheets.Count
Dim ArrayShName() As String
ReDim ArrayShName(sheet_count)
Dim mySheet As Worksheet
'On Error Resume Next 'エラー無視
Dim k As Long
k = 0
Dim j As Integer
For j = 1 To Worksheets.Count
If Worksheets(j).Name <> "DB" Then
ArrayShName(k) = Worksheets(j).Name
k = k + 1
End If
Next
Worksheets(ArrayShName).Select
Cells.Select
WB.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=ExcelFilePath & ExFileName, _
OpenAfterPublish:=True
ActiveWindow.Close '読み込んだファイルを閉じます。
ExFileName = Dir() '次のファイルを指定する。
Loop
MsgBox "PDFファイルに一括変換しました。"
Else
MsgBox "処理を中断します"
End If
Application.DisplayAlerts = True '確認メッセージを有効化します。
End Sub
2020/08/06 19:20
WBはWorkbookオブジェクトなので、全シート全セルが出力されるようです。
誤) WB.ExportAsFixedFormat
正) Selection.ExportAsFixedFormat
インデックスの有効範囲ではないエラーが出る原因は、存在しないワークシートへアクセスしようとしているからです。
誤) ReDim ArrayShName(sheet_count)
正) ReDim ArrayShName(sheet_count - 2)
実は 配列(5) のような指定をすると、 配列(0 to 5) を指定したことと同じになります。
なので、配列(5) を指定した場合は6つの要素を持つ配列ということになります。
なぜ問題になるのかというと、全てのシート名を入れたとしても配列が下記のようになるからです。
(”Sheet1”, ”Sheet2”, ”Sheet3”, ”DB” ””)
そうすると、WorkSheets(””)を指定することになるので、インデックスが有効ではないとなります。
DBシートは飛ばすので、-2してあげる必要があります。
2020/08/06 19:41
頂いたコード試させてもらったところ無事全てのPDF出力に成功致しました!
本当にありがとうございます!!
理解に及んでいない部分多々ありますがわからない部分は調べ理解を深めていこうと思います。
こんな未熟な質問にも最後までご丁寧にお付き合い頂きありがとうございました!
貴重な時間をお使い頂きホントに感謝致します。
ありがとうございます。
2020/08/06 19:48
お役に立てたようで幸いです。
勉強頑張ってください!
2020/08/07 12:39
すいません、日が変わり再度マクロ実行してみるとインデックスの有効範囲ではないエラーが出るのですが何が原因かわからず手詰まりの状態です。
ReDim ArrayShName(sheet_count - 2)のように書き直してはいるのですが.....
先日もしかしたらon error resume nextは外さず実行して成功したと思っていたのかもしれません。
どこに原因があるかお忙しい中大変申し訳ないですが、ご教授頂けると幸いです。
```VBA
Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換
Dim Button, T, i, L As Integer
Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String
Application.DisplayAlerts = False '確認メッセージを無効化します。
Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認")
If Button = vbYes Then
OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。
If OpenExcelFileName <> "False" Then
ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。
ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く)
MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。"
Else
MsgBox "キャンセルされました"
Exit Sub 'キャンセルでプログラムを終了します。
End If
ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。
Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。
Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む
ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?)
Set WB = ActiveWorkbook
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Dim sheet_count As Integer
sheet_count = Worksheets.Count
Dim ArrayShName() As String
ReDim ArrayShName(sheet_count - 2)
Dim mySheet As Worksheet
Dim k As Long
k = 0
Dim j As Integer
For j = 1 To Worksheets.Count
If Worksheets(j).Name <> "DB" Then
ArrayShName(k) = Worksheets(j).Name
k = k + 1
End If
Next
Worksheets(ArrayShName).Select
Cells.Select
Selection.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=ExcelFilePath & ExFileName, _
OpenAfterPublish:=True
ActiveWindow.Close '読み込んだファイルを閉じます。
ExFileName = Dir() '次のファイルを指定する。
Loop
MsgBox "PDFファイルに一括変換しました。"
Else
MsgBox "処理を中断します"
End If
Application.DisplayAlerts = True '確認メッセージを有効化します。
End Sub
2020/08/07 15:11
ファイル内に必ずDBシートがある。
という前提のコードになっています。
DBシートが無いファイルがあるか、
1シートだけのファイルがあるか、
おそらくどちらかだと思います。
2020/08/07 15:19
DBシートがないファイルもあるのが確認できました。
DBシートがない場合のファイルも見てほしい場合if文の記述を変えてあげる感じでしょうか?
もしくはon error resume nextでゴリ押しすることも可能だったりするのでしょうか?
2020/08/07 15:36
でゴリ押しした場合、おそらくPDF化出来ていないページが出てきます。
ここで一番ネックになっているのは、配列の要素数です。
それを解決するためにはいくつかの手段があります。
1.Collection型に変更する
2.配列の要素数を動的に変化させる
3.配列を使わないように工夫する
2020/08/07 15:37
追加で色々書いてしまって大変申し訳ありませんがアドバイス頂けると幸いです。
お忙しい中恐縮ですが宜しくお願い致します。
2020/08/07 15:39
なるほどon error resume nextはそういったことも含め使わない方が良いということですね
僕の色々調べてきた中では配列を使うのは前提で進めた方が理解が進みそうな気がしています!
なので配列の要素数を動的に変化させるというのを重点に調べていくのが良い感じでしょうか?
2020/08/07 17:06
Preserveキーワードを付けないと配列内に既にある要素が消えてしまうので注意してください。
Redim Preserve 配列(i)
また、Collectionを使うやり方だと以下のようになります。
Dim l As New Collection
l.Add(データ又はオブジェクト) ’要素の追加
l(1) ’先頭要素の取得
2020/08/07 17:19
流石にこんな単純にプラスして記述するだけではない感じでしょうか?
的外れな回答してしまってるとは思うのですが何卒お返事頂けると幸いです!
```VBA
Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換
Dim Button, T, i, L As Integer
Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String
Application.DisplayAlerts = False '確認メッセージを無効化します。
Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認")
If Button = vbYes Then
OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。
If OpenExcelFileName <> "False" Then
ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。
ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く)
MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。"
Else
MsgBox "キャンセルされました"
Exit Sub 'キャンセルでプログラムを終了します。
End If
ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。
Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。
Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む
ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?)
Set WB = ActiveWorkbook
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Dim sheet_count As Integer
sheet_count = Worksheets.Count
Dim ArrayShName() As String
ReDim Preserve ArrayShName(sheet_count - 2)
Dim mySheet As Worksheet
'On Error Resume Next 'エラー無視
Dim k As Long
k = 0
Dim j As Integer
For j = 1 To Worksheets.Count
If Worksheets(j).Name <> "DB" Then
ArrayShName(k) = Worksheets(j).Name
k = k + 1
End If
Next
Worksheets(ArrayShName).Select
Cells.Select
Selection.ExportAsFixedFormat _
Type:=xlTypePDF, _
fileName:=ExcelFilePath & ExFileName, _
OpenAfterPublish:=True
ActiveWindow.Close '読み込んだファイルを閉じます。
ExFileName = Dir() '次のファイルを指定する。
Loop
MsgBox "PDFファイルに一括変換しました。"
Else
MsgBox "処理を中断します"
End If
Application.DisplayAlerts = True '確認メッセージを有効化します。
End Sub
ReDim ArrayShName(sheet_count - 2)を
ReDim Preserve ArrayShName(sheet_count - 2)に書き換えました!
2020/08/07 17:44
まず、0個の要素を持てる配列を宣言します。
次に、必要になったときに要素を1つずつ追加する。
ということは、少しだけロジックをいじらないとダメです。
当初の質問内容から外れてきたため、
新しく質問を立て直してはいかがでしょうか。
プログラム全体を通してメンターになってほしいなどあれば、teratailの規約から反れてしまいますので、私のプロフィールにあるメールアドレスへご連絡いただければ対応します。
2020/08/07 17:55
そうですね、自分の考えを整理して新たに質問を立て直して見たいと思います!
ご指摘ありがとうございます!