質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2163閲覧

VBA シートが一個しか出力されないものとしっかり結合して出力するのと分かれる

taka-hoop

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/05 02:59

フォルダ内のエクセルファイルをPDF出力するマクロを作成しました。
出力したい条件としては、シート名にDBを含むシートは除いて、すべてをPDF出力、複数シートがある場合は結合してPDF出力
と言った作業が行いたく以下のマクロを作成しました。

VBA

1 2Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換 3 4 Dim Button, T, i, L As Integer 5 Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String 6 7 Application.DisplayAlerts = False '確認メッセージを無効化します。 8 9 10 Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認") 11 If Button = vbYes Then 12 13 OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。 14 15 If OpenExcelFileName <> "False" Then 16 ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。 17 ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く) 18 19 MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。" 20 Else 21 MsgBox "キャンセルされました" 22 Exit Sub 'キャンセルでプログラムを終了します。 23 24 End If 25 26 ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。 27 28 29 Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。 30 31 Workbooks.Open fileName:=ExcelFilePath & ExFileName, ReadOnly:=True, UpdateLinks:=0 'EXCELファイルを読み取り専用で読み込む 32 ExFileName = Left(ExFileName, InStr(ExFileName, ".") - 1) ' ファイル名から拡張子を取り除く(.xls?) 33 Set wb = ActiveWorkbook 34 35 With ActiveSheet.PageSetup 36 .Zoom = False 37 .FitToPagesWide = 1 38 .FitToPagesTall = 1 39 End With 40 41 'ActiveWorkbook の記述はいらなかった 42 'レポートの記述にいらないスペースがあったかも 43 44 Dim sheet_count As Integer 45 sheet_count = Worksheets.Count 46 Dim ArrayShName() As String 47 ReDim ArrayShName(sheet_count) 48 Dim mySheet As Worksheet 49 50 On Error Resume Next 'エラー無視 51 52 Dim k As Long 53 k = 0 54 55 Dim j As Integer 56 For j = 1 To Worksheets.Count 57 If Worksheets(j).Name <> "DB" Then 58 ArrayShName(k) = Worksheets(j).Name 59 k = k + 1 60 End If 61 Next 62 63 Worksheets(ArrayShName).Select 64 ActiveSheet.ExportAsFixedFormat _ 65 Type:=xlTypePDF, _ 66 fileName:=ExcelFilePath & ExFileName, _ 67 OpenAfterPublish:=True 68 69 ActiveWindow.Close '読み込んだファイルを閉じます。 70 71 ExFileName = Dir() '次のファイルを指定する。 72 73 Loop 74 75 MsgBox "PDFファイルに一括変換しました。" 76 Else 77 MsgBox "処理を中断します" 78 End If 79 80 Application.DisplayAlerts = True '確認メッセージを有効化します。 81 82End Sub

ただ現状タイトルにも記載して重複で申し訳ないんですが、
複数シートがあるファイルをPDF出力する際シートが一つしか出力されないものと全て出力されるものと分かれてしまい
その原因がどこにあるのかわからず困っております。

調べ方であったり、ここの記述がおかしい!など手掛かりになるヒント、アドバイスを頂けると幸いです。

宜しくお願い致します。

参考記事:https://ateitexe.com/excel-vba-sheets-to-merge-pdf/

OS:macOS Catalina バージョン10.15.3
Excelバージョン: Microsoft Excel for Mac バージョン16.39

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

以下のように修正してうまくいきませんか?
修正前) ActiveSheet.ExportAsFixedFormat
修正後) wb.ExportAsFixedFormat

マイクロソフトのドキュメントではExportAsFixedFormatメソッドはWorkbookオブジェクトのメソッドだと書いてありました。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbook.exportasfixedformat

投稿2020/08/05 23:43

ELBE

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-hoop

2020/08/06 00:01

ご回答ありがとうございます! ご指摘通り修正させて頂いたんですが、全てのシートはPDF化されるものの DBという出力したくないシートも一緒にPDF化されてしまう感じですね....
ELBE

2020/08/06 01:42

色々と調べましたが、どうやらExportAsFixedFormatメソッドがエラーを起こしているようです。 調べた限り、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 ```
ELBE

2020/08/06 01:56

訂正: サンプルコードに漏れがありました。 全てのシートを選択状態にしたあと、Cells.Select を実行しなければなりません。 Cells.Select を実行しない場合、Range("A1")のアドレスになるので白紙のPDFが出力されます。 Cells.Selectメソッドは「DB」シート以外であれば、どのシートで実行しても大丈夫です。
taka-hoop

2020/08/06 03: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
ELBE

2020/08/06 04:34

Worksheets(ArrayShName).Cells.Select ではなく、 Worksheets(ArrayShName).Select Cells.Select としてみてください。 それで駄目なら、想定通りのセルが選択されているかデバッグしてみてください。 選択したセルに色を付ける処理を加えるといった方法でデバッグできると思います。 また、on error resume nextは外した方が無難です。 WorkSheetsオブジェクトなど、オブジェクトのコレクションを扱う処理においては沼にはまってしまいがちです。 というのも、あくまでオブジェクトのコレクションなので内部的には繰り返し処理がされている都合上、「あれ、1シートだけ適用されていない」など想定外のエラーが発生するためです。
taka-hoop

2020/08/06 08: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
ELBE

2020/08/06 10:20

まず、DBシートまで出力される問題は下記部分を修正すると直ります。 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してあげる必要があります。
taka-hoop

2020/08/06 10:41

ご返答ありがとうございます! 頂いたコード試させてもらったところ無事全てのPDF出力に成功致しました! 本当にありがとうございます!! 理解に及んでいない部分多々ありますがわからない部分は調べ理解を深めていこうと思います。 こんな未熟な質問にも最後までご丁寧にお付き合い頂きありがとうございました! 貴重な時間をお使い頂きホントに感謝致します。 ありがとうございます。
ELBE

2020/08/06 10:48

おめでとうございます! お役に立てたようで幸いです。 勉強頑張ってください!
taka-hoop

2020/08/07 03: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
ELBE

2020/08/07 06:11

シートが2シート以上ある。 ファイル内に必ずDBシートがある。 という前提のコードになっています。 DBシートが無いファイルがあるか、 1シートだけのファイルがあるか、 おそらくどちらかだと思います。
taka-hoop

2020/08/07 06:19

返答ありがとうございます! DBシートがないファイルもあるのが確認できました。 DBシートがない場合のファイルも見てほしい場合if文の記述を変えてあげる感じでしょうか? もしくはon error resume nextでゴリ押しすることも可能だったりするのでしょうか?
ELBE

2020/08/07 06:36

on error resume next でゴリ押しした場合、おそらくPDF化出来ていないページが出てきます。 ここで一番ネックになっているのは、配列の要素数です。 それを解決するためにはいくつかの手段があります。 1.Collection型に変更する 2.配列の要素数を動的に変化させる 3.配列を使わないように工夫する
taka-hoop

2020/08/07 06:37

シートも1シートしかないファイルも存在しました..... 追加で色々書いてしまって大変申し訳ありませんがアドバイス頂けると幸いです。 お忙しい中恐縮ですが宜しくお願い致します。
taka-hoop

2020/08/07 06:39

ご返答ありがとうございます! なるほどon error resume nextはそういったことも含め使わない方が良いということですね 僕の色々調べてきた中では配列を使うのは前提で進めた方が理解が進みそうな気がしています! なので配列の要素数を動的に変化させるというのを重点に調べていくのが良い感じでしょうか?
ELBE

2020/08/07 08:06

配列を要素数を動的に変化させる方法です。 Preserveキーワードを付けないと配列内に既にある要素が消えてしまうので注意してください。 Redim Preserve 配列(i) また、Collectionを使うやり方だと以下のようになります。 Dim l As New Collection l.Add(データ又はオブジェクト) ’要素の追加 l(1) ’先頭要素の取得
taka-hoop

2020/08/07 08: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)に書き換えました!
ELBE

2020/08/07 08:44

こういう考え方をしなければいけません。 まず、0個の要素を持てる配列を宣言します。 次に、必要になったときに要素を1つずつ追加する。 ということは、少しだけロジックをいじらないとダメです。 当初の質問内容から外れてきたため、 新しく質問を立て直してはいかがでしょうか。 プログラム全体を通してメンターになってほしいなどあれば、teratailの規約から反れてしまいますので、私のプロフィールにあるメールアドレスへご連絡いただければ対応します。
taka-hoop

2020/08/07 08:55

ご返答ありがとうございます! そうですね、自分の考えを整理して新たに質問を立て直して見たいと思います! ご指摘ありがとうございます!
guest

0

こんにちは。

VBA

1 sheet_count = Worksheets.Count 2 : 3 For j = 1 To Worksheets.Count 4 If Worksheets(j).Name <> "DB" Then 5 ArrayShName(k) = Worksheets(j).Name

Worksheets を wb.Worksheets としても変わりませんか?

投稿2020/08/05 04:05

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-hoop

2020/08/05 05:26

こんにちは!ご回答ありがとうございます! アドバイス通り記述してみましたが変化なしでした.... 記述場所はFor文の中だけで良かったでしょうか?
DreamTheater

2020/08/05 05:37

sheet_countに代入しているところもです。 自分はVBAを書くとき、目的のオブジェクトが現在アクティブであることを前提としないよう心がけています。  自分自身ならThisWorkbook.Sheets("XXX").YYY、他のブックならWorkbooks("???").Sheets("XXX").YYYと明示的に書く。  長すぎる場合はオブジェクト変数にセットするかWith句を使う。
taka-hoop

2020/08/05 05:54

ご返答ありがとうございます! Worksheetsの記述部分に色々wb.の記述を足してみたのですが変化なしでした.... 今回一つしか出力されていないシートはなんらかの理由でシートが一つしかアクティブになってないよ的な事でしょうか?
DreamTheater

2020/08/05 06:02

ブックを伴わないWorksheetsや、ブックとワークシートを伴わないRange等を使用して、想定外のシートがアクティブだったことで失敗するケースを経験したことがあるので、、、 > なんらかの理由でシートが一つしかアクティブになってない それもありますし、別のブックがアクティブになっていたら、それこそ期待した結果になりませんから。
radames1000

2020/08/06 02:10

ちょっと気になったのでコメントです。 > なんらかの理由でシートが一つしかアクティブになってない 複数シートがアクティブになることはありません。 アクティブとセレクトの違いを意識しておくのは大事です。 https://excel-ubara.com/excelvba1/EXCELVBA327.html
taka-hoop

2020/08/06 10:42

ご返答ありがとうございます! シートの件詳しく返答いただきありがとうございます! とても参考になります!意識して勉強させていただきます。
guest

0

Worksheets(ArrayShName).Select

の後に、

Stop

と書いて一次停止し、
意図したシートがちゃんと選択できているか
確認してみてください。

あと、コツとしては、
単一ブックで試してみることです。
繰り返すことはコンピューターは得意ですので、
とりあえず、1つだけで試す。
上手くいきそうなら3つで試す。
その後は10個でやってみる。
その中で、うまくいくファイルとそうでないファイルの違いを
探してみてください。


追記

Stopで止めたとき、
ローカルウィンドウの
ArrayShNameの中身を確認してください。
変数名の左に「⁺」があると思うので、それをクリックで中身が展開できます。

とりあえず、
新規ブックに以下のコードを記入し、
その後テストしたいファイルを開いた後、
コードを実行してみてください。

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim wb As Workbook 5 6 Set wb = Workbooks(Workbooks.Count) '最後に開いたブックの取得 7 If MsgBox(wb.Name & "を操作します。", vbYesNo) = vbNo Then Exit Sub 8 9 Dim v() As String 10 Dim ws As Worksheet 11 Dim i As Long, j As Long 12 13 ReDim v(wb.Worksheets.Count) 14 For i = 1 To wb.Worksheets.Count 15 Set ws = Worksheets(i) 16 If ws.Name <> "DB" Then 17 v(j) = ws.Name 18 j = j + 1 19 End If 20 Next 21 22 If j > 1 Then 23 ReDim Preserve v(j - 1) 24 Debug.Print Join(v, ",") 25 wb.Activate 26 wb.Worksheets(v).Select 27 End If 28End Sub

動作確認は、
ステップインで、一行づつ実行しながら、
ローカルウィンドウで変数の中身が意図するものになっているか
確認しながら、最終的にはシートを選択するのですから、
意図した結果が、画面上に反映されているか確認してください。

やみくもに、本番コードに追記していっても、
時間がかかるばっかりかと思いますよ。
まずは、ひとつづテーマを絞って解決していって、
自信が出来たら、本番コードに追加していってみては?

参考>>
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う

投稿2020/08/05 03:25

編集2020/08/05 10:22
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka-hoop

2020/08/05 03:48

ご回答ありがとうございます! Stopを記述してみて試してみたところ 上手く成功したやつはシートが一つ選択されたあとそのまま全て保存作業に入り全シートがPDF化 1つしか出ないやつはシートが一つ選択されたあと一つだけ保存作業に入り1つのシートがPDF化されました。 かなり曖昧な伝え方で大変申し訳ないのですが、意図したシートがちゃんと選択できているかの確認はどのように見るのでしょうか?Debug.Printなどを用いた方が良いですか? あと単一ブックで試すと言うのはフォルダにファイルを一つずつ分けて作業していくとわかりやすいよ的な理解で大丈夫ですか? 質問多くて大変恐縮ですが、宜しくお願い致します。
mattuwan

2020/08/05 05:43

>かなり曖昧な伝え方で大変申し訳ないのですが、意図したシートがちゃんと選択できているかの確認はどのように見るのでしょうか? エクセルの画面を見ればいいのでは?
mattuwan

2020/08/05 05:47

>あと単一ブックで試すと言うのはフォルダにファイルを一つずつ分けて作業していくとわかりやすいよ的な理解で大丈夫ですか? それでもいいですし、 僕なら少しずつ確認しながら作ります。 まずは、1つのブックを処理するプログラムを作り、 動作確認がしっかり取れたら、 別のプロシージャからそのプロシージャを繰り返し呼び出します。 機能別にプロシージャを作り、 再利用するイメージです。
taka-hoop

2020/08/05 06:14

ご返答ありがとうございます! そうか!まず今全部シートが出力されないエクセルファイルでシート全部が出力できるマクロが作れれば何かしら兆しが見えてくると言う事でしょうか!?
mattuwan

2020/08/05 06:16

とりあえず、追記します。
mattuwan

2020/08/05 06:44 編集

>そうか!まず今全部シートが出力されないエクセルファイルでシート全部が出力できるマクロが作れれば何かしら兆しが見えてくると言う事でしょうか!? 違います。 taka-hoopさんは、 意図するシートを「選択(Select)」し、 選択されたシートをPDFにエクスポートしようとしているのですから、 VBA語でエクセル君を遠隔操作(文字だけで指示)で、 シートを選択させられるようにならなければ、先に進めないと言っているのです。
taka-hoop

2020/08/05 07:07

ご返答ありがとうございます! すいません、頂いたコードで新規ブックを作成してテストしたいファイル開いた後にコードを実行したところ If ws.Name <> "DB" Then この部分で実行時エラー91が出るのですが どこかが上手くオブジェクト変数に格納できてない現象なのでしょうか?
taka-hoop

2020/08/05 07:14

後、stopで止めた時のデバッグの仕方やっとわかりました!ありがとうございます! 1つのシートしか出力されないファイルのArrayShNameの中身なんですがシートDB以外全部とれてます....
mattuwan

2020/08/05 07:40

失礼しました。 貼り付けてから、そちらの書き方に合わせたので、 修正しきれてませんでした。 修正しました。
mattuwan

2020/08/05 07:47

エラーが出たら、 エラー番号やエラーメッセージをそのままWebで検索してください。 たいていの原因や対応はわかるはずです。 いつあるかわからない回答を待つより、 自分で調べた方が解決が早いと思います。 待つ時間がもったいないです。 とにかく自分で調べられるようになれると勉強がはかどります。 もちろん、掲示板だとかゆいところに手が届くのですが。
taka-hoop

2020/08/05 08:22

ご返答ありがとうございます! お忙しい中修正までありがとうございます! エラーでの検索は行ってはいるのですが自身の環境に照らし合わせ?て柔軟に対応するのが現状苦手な部分なのかなと思っております。 ところで一つ気になった点としては一度返信していて重複していて大変恐縮なのですが、 stopで止めた時1つのシートしか出力されないファイルのArrayShNameの中身なんですがシートDB以外全部とれていました! 自分の中ではこのArrayShNameの中身にシートの情報が入っていないから出力されないのかなと思っていたのですが、どういった検索を行うとヒント等に辿り着けるかアドバイス頂けると幸いです!
mattuwan

2020/08/05 08:48 編集

>stopで止めた時1つのシートしか出力されないファイルのArrayShNameの中身なんですがシートDB以外全部とれていました! 僕が書いたコードと、taka-hoopさんの書いたコードと、結果は、同じだったでしょうか? 僕の書いたコードで、 ReDim Preserve v(j - 1) の後に、 debug.print join(v,",") と入れて実行してみてください。 イミディエイトウィンドウに文字列が書き出されると思います。 同じように、 taka-hoopさんが書いたコードの Worksheets(ArrayShName).Select の行の前に debug.print join(ArrayShName,",") stop と書いてイミディエイトウィンドウを確認してください。 違いがありますでしょうか? 結果をお知らせください。そのままコピペで。
mattuwan

2020/08/05 08:51

ちなみに実行時エラー91は、 変数「ws」がNothingのままだったので(何も代入してなかった)、 シートでもなんでもないものに対して、Nameプロパティを取得しようとしたので、 エラーになってました。
taka-hoop

2020/08/05 08:55

ご返答ありがとうございます。 コードは以下のように記述し Debug.Print Join(ArrayShName, ",") Stop Worksheets(ArrayShName).Select ActiveSheet.ExportAsFixedFormat _ Type:=xlTypePDF, _ fileName:=ExcelFilePath & ExFileName, _ OpenAfterPublish:=True イミディエイトウィンドウには 表紙,検索,表示箇所,行動,順位,,と表示されています。(出力されて欲しいシートは全部とれてます)
mattuwan

2020/08/05 10:08 編集

了解です。 僕が書いたコードではどうなります? やっぱりエラーですか? 違いで原因を特定したいので。
taka-hoop

2020/08/05 10:20

ご返答ありがとうございます! 頂いたコードで新規ブックを作成してテストしたいファイル開いた後にコードを実行したところ コンパイルエラーが出てイミディエイトウィンドウには何も表示されておりません!
mattuwan

2020/08/05 10:23

失礼しました。 修正し、動作確認しました。 ご確認願います。
taka-hoop

2020/08/05 10:34

ご返答ありがとうございます! 何度も修正大変ありがとうございます! 再度頂いたコード実行したところ、イミディエイトウィンドウには 表紙,検索,表示箇所,行動,順位,,と表示されています。(出力されて欲しいシートは全部とれてます) なので一緒ですね!
mattuwan

2020/08/05 10:59

表紙,検索,表示箇所,行動,順位 こちらでは、上記のようになりました。 taka-hoopさんのコードでは、 表紙,検索,表示箇所,行動,順位,, となります。 対象のブックを開いた状態で、 イミディエイトウィンドウに worksheets(split("表紙,検索,表示箇所,行動,順位,,"、”,").select[Enter] ※[Enter]は、Enterキー押下の意 としてみてください。 エラーになります。 実際のコードでエラーが出ないのは、 On Error Resume Next 'エラー無視 ↑これを書いているからです。 on error ステートメントはできるだけ使わないようにしましょう。 エラーが出て欲しい場面でも出なくなるので、 不具合の原因がつかみにくくなります。 つまり、作った配列の中に、シート名として不都合な 長さ0の文字列が含まれていることが原因です。 で、ひとつしかシートが出ない原因は、 1)ワークブックは、必ずどれか一つは必ず選択された状態 2)シートを選択する命令がエラーで選択自体が無効 ということで、ファイルを開いたときに選択されているシートのみ エクスポートされているということです。 回避策としては、 ReDim Preserve v(j - 1) のように中身を保持したまま、不要な配列要素を除外するようにしてください。
taka-hoop

2020/08/05 11:34

ご返答ありがとうございます! 細かにご丁寧な説明本当にありがとうございます! 一応なんですが自分の作ったマクロで対象のファイルを開いたまま頂いたコードイミディエイトウィンドウで試すとコンパイルエラーが出ます。(On Error Resume Next記述が残っていても) あと詳細に説明してもらってて大変申し訳ないのですが、最後のReDim Preserve v(j - 1)で中身を保持したまま、不要な配列要素を除外する ここが理解するのがとても難しいです。 どういった風に調べたり何かとっかかりになるアドバイスが頂けると幸いです!
mattuwan

2020/08/05 21:30

僕のサンプルで、ステップ実行しながら、ローカルウィンドウで配列の中身と要素数を確認して見てください。 あとは、 動的配列変数 preserveキーワード 等で検索してください。
mattuwan

2020/08/06 10:56

解決したようでなによりです。 PDFにエクスポートしたくないシートは非表示にしておくと、 ブック全体でエクスポートしてもPDFに含まれないようです。 SelectしたりActiveSheetを指定したりするところがどうも引っかかってましたが、 そうすることで、それらのキーワードを使わなくても良くなります。 また、開いたブックは、読み取り専用で開いても普通に開いても、 保存しないで閉じれば結果は同じです。 参考になれば。
taka-hoop

2020/08/07 01:22

ご返答ありがとうございます! SelectしたりActiveSheetを指定の部分はまだ私自身も全然理解できてない部分が多いですが 補足での情報ありがとうございます!とても参考になります! いつもご丁寧に対応頂き本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問