Excelマクロ

【マクロ配布】Excelファイルの特定キーワードを含むシートをまとめてPDF変換について解説

ビジネス代行の梅澤です。以前に公開しました”シート毎PDF変換”のVBAをキーワードに、弊社のページにいらっしゃる方がかなりの数いました。


ExcelのPDF化に悩まれていらっしゃる方が多くいらっしゃることがわかりましたので、今回はシート名に特定キーワードを含む場合、PDFに変換するVBAを配布いたします。


当サイトで配布したコードについて自己責任でご使用下さい。

【マクロ配布】シート毎PDF変換について解説 どうぞお越しいただきありがとうございます。”ビジネス代行の梅澤”です。社内DXは進んでいますでしょうか。中小企業ですと、なかなか取り組...

1.配布用ダウンロードリンク

今回はユーザーフォームを使用してのマクロになりますので、VBAに不慣れな方は、下記リンクからDLする事をお勧めします。

VBAをDLする

また、マクロをExcelにインポートする手順がわからない方、そもそもマクロを初めて使用する方は、下記の記事に画像付きで手順を解説しています。

【VBA基礎】公開中のマクロのインポート方法について解説 ビジネス代行の梅澤です。VBAの事はよくわからないけれど、公開されているマクロを利用したいと思っている方もいらっしゃるかと思いますので...

2.コード

Private Sub btn_Click()

Dim Button, T, i, L As Integer
    Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String
     
    Application.DisplayAlerts = False  '確認メッセージを無効化します。
    
    
    Button = MsgBox("EXCELファイル(指定ワード)一括PDF変換を行いますか?", vbYesNo + vbQuestion, "確認")
    If Button = vbYes Then
            
            OpenExcelFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")  'ダイアログを表示取り込むフォルダーにあるファイルを選択します。
           
            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:=False, UpdateLinks:=0  'EXCELファイルを読み取り専用で読み込む
            Call シート名に指定ワードを含む場合PDF化 '下記別マクロ呼出し。
            
            ActiveWindow.Close  '読み込んだファイルを閉じます。
            
            ExFileName = Dir() '次のファイルを指定する。
 
            Loop
            
            MsgBox "PDFファイルに一括変換しました。"
    Else
        MsgBox "処理を中断します"
    End If
    
    Application.DisplayAlerts = True  '確認メッセージを有効化します。
    
    Unload UF1
    
    
End Sub


Sub シート名に指定ワードを含む場合PDF化()

 Dim FIND_STR As Variant
 Dim find_flg As Boolean  ' 見つかったシートが1枚目か否か判定するフラグ
 Dim sh As Object
 Dim ws As Worksheet
  
  '検索する文字列
  FIND_STR = TB

  'Falseを代入
  find_flg = False
  
  '全てのシートをループ
  For Each sh In Sheets
    'シート名が検索ワードを含み、かつ表示されている時
    If sh.Name Like "*" & FIND_STR & "*" And sh.Visible Then
    
      '見つかった1枚目のシートの場合
      If find_flg = False Then
        'シートを選択
        sh.Select Replace:=True
        'Trueを代入
        find_flg = True
      Else
        '見つかった2枚目以降のシートの場合
        '1シート目のシート選択を継続
        sh.Select Replace:=False
      End If
      
      '選択中のシートをPDF化
      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
      FileName:=Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & "_" & "(" & FIND_STR & ")" & ".pdf"
 
    End If
     
  Next sh
  
End Sub

2.プログラム全体の流れ

全体の流れ
  • ダイアログボックスを開いて、実行フォルダを指定。
  • フォルダ内のExcelファイルを開く。
  • 現在開いているシート内に指定ワードを含むシートがあるかを検索
  • 該当シートがある場合は、該当シートのみをPDF化(該当シートが複数ある場合は、まとめてPDF化)

今回作成しましたコードも、2つのプロシージャを作成し、1つは呼び出し用として作成しています。

≪EXCELファイルPDF化_シート毎≫の “Call シート目に指定ワードを含む場合PDF化を実行”の部分で呼び出して実行をしています。

下の画像がフロー図です。

3.プログラムの解説

1.上記コードを分解して解説していきます。

呼び出し元は<シート毎PDF変換>で解説していますので、そちらをご参考ください。

【マクロ配布】シート毎PDF変換について解説 どうぞお越しいただきありがとうございます。”ビジネス代行の梅澤”です。社内DXは進んでいますでしょうか。中小企業ですと、なかなか取り組...
Sub シート名に指定ワードを含む場合PDF化()

 Dim FIND_STR As Variant
 Dim find_flg As Boolean  ' 見つかったシートが1枚目か否か判定するフラグ
 Dim sh As Object
 Dim ws As Worksheet
  
  '検索する文字列
  FIND_STR = TB

  'Falseを代入
  find_flg = False
  

FIND_STR=TB
TB←はユーザーフォームのテキストボックスで入力した文字列です。
(Text Boxの略)
検索する文字列を一度変数に代入しています。

find_flg=False
こちらはboolean型で、フラグの設定を行っています。デフォルトではFalseを代入しています。

BD 梅澤

boolean型は、true/false 判定用に使用します。

  '全てのシートをループ
  For Each sh In Sheets
    'シート名が検索ワードを含み、かつ表示されている時
    If sh.Name Like "*" & FIND_STR & "*" And sh.Visible Then
    
      '見つかった1枚目のシートの場合
      If find_flg = False Then
        'シートを選択
        sh.Select Replace:=True
        'Trueを代入
        find_flg = True
      Else
        '見つかった2枚目以降のシートの場合
        '1シート目のシート選択を継続
        sh.Select Replace:=False
      End If
      
      '選択中のシートをPDF化
      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
      FileName:=Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & "_" & "(" & FIND_STR & ")" & ".pdf"
 
    End If
     
  Next sh
  
End Sub

For Each sh In Sheets
開いているファイルの最初から最後までのすべてのシートを変数”sh”へ順番に代入

If sh.Name Like “*” & FIND_STR & “*” And sh.Visible Then
もし現在のシート名に”検索する文字列”が含まれていて、かつ表示状態の場合

BD 梅澤

For Each … In Sheets のコードは、非表示のシートもすべて対象ですでので、分岐検索時に表示状態のみを対象にしています

'見つかった1枚目のシートの場合
      If find_flg = False Then
        'シートを選択
        sh.Select Replace:=True
        'Trueを代入
        find_flg = True
      Else
        '見つかった2枚目以降のシートの場合
        '1シート目のシート選択を継続
        sh.Select Replace:=False
      End If

If find_flg = False Then
変数”find_flg”にはデフォルトで Falseを代入してあります。

sh.Select Replace:=True
これは現在のシートのみを選択状態にする指示です。

プログラム上で実行した場合、人間が画面操作しているの場合とは挙動の違いがあります。

人間がシートを見ていく場合は、シートを選択する必要がありますが、プログラムの場合は必要ありません。

1シートずつ、シート名のチェックを行っていますが、シート選択をしているわけではないので、シート選択の指示を入れています。

さらに、Excelを開くと、すでにどこかしらのシートが選択状態にあるかと思います。

この指示がないと、既に選択状態のシート+現在のシートが選択されて、目的とする成果物ができあがりませんので、大切な指示です。

BD 梅澤

下に入れ子のIfのイメージ図をアップいたしました。

'選択中のシートをPDF化
      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
      FileName:=Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & "_" & "(" & FIND_STR & ")" & ".pdf"

選択中のシートをPDF化する指示をしています。

シート名の”.”から後ろに”_”と”検索する文字列”を生成するPDFのファイル名に足す指示をしています。

BD 梅澤

ファイル名の拡張子部分以外に”.”が入る場合は、ファイル名の最初の”.”より後ろが、生成するPDFの名前になってしまうので、注意です。

3.目的

このVBAを開発した目的は、膨大な数のエクセルファイルから特定のワードを含むシートのみを印刷する業務がありました。

手作業で行うには非常に時間がかかるので、何とかならないかと思い、作成しました。

BD 梅澤

ネット上を検索したりして、なんとかなりそうだと思ったので作成してみました。

4.まとめ

まとめ
  1. ユーザーフォームを使用するので、コピペではなく、DLして使用する。
  2. 指定キーワードを含むシートをまとめて選択し、PDF化するので、該当シートが複数ある場合はまとめてPDF化する
  3. 指定したフォルダ内のすべてのファイルに対して実行

今回はユーザーフォームを活用した、VBAを作成してみました。
ユーザーフォームを使うとプログラミング初心者でも、非常に使いやすくなりますので今後も公開したいと考えています。

ABOUT ME
ビジネス代行 梅澤
入社後に長時間労働に悩んでいたところ、印刷ワークフローシステムに出会う。 ここで初めてDXを実感する。 VBAを学習し、更なる業務効率改善に取り込んでいる。
お問い合わせ

些細なことでも構いません。お困りごと・ご相談など、お気軽にご連絡下さい。
どんなご質問でもお答えいたします。お問い合わせお待ちしております。

まずはお気軽にご連絡ください。
✉ お問い合わせはコチラ