83本目 請求書を作成してPDFで保存

VBA100本ノック

VBA100本ノック 83本目の投稿です。Excelの神髄さんの模範解答はコチラ


問題

VBA100本ノック 83本目

「売上」シートにある、
全取引先のPDF請求書を作成してください。
Thisworkbookパスの下に「請求書」フォルダを作成し、
ファイル名「取引先名_yyyymm.pdf」で出力。
yyyymmは実行日。
※商品行は10行を超えません。
※取引先名はファイルに使えない文字は使っていません。

↓イメージ

解答

Sub フォルダ作成()
    Dim wb As Workbook:             Set wb = ThisWorkbook
    Dim ws売上 As Worksheet:     Set ws売上 = Sheets("売上")
    Dim wsマスタ As Worksheet:    Set wsマスタ = Sheets("取引先マスタ")
    Dim ws請求書 As Worksheet: Set ws請求書 = Sheets("請求書")
    If Dir(wb.Path & "\請求書", vbDirectory) = "" Then
        MkDir wb.Path & "\請求書" '請求書フォルダが無ければ作成
    End If
    ws請求書.Range("A2:A5,A10:D24").ClearContents 'とりあえず一旦データ削除
    
    Dim i As Long, j As Long: j = 10
    Dim k As Long
    For i = 2 To ws売上.Cells(Rows.Count, 1).End(xlUp).Row
        ws請求書.Cells(j, 1).Value = ws売上.Cells(i, 3).Value
        ws請求書.Cells(j, 3).Value = ws売上.Cells(i, 4).Value
        ws請求書.Cells(j, 4).Value = ws売上.Cells(i, 5).Value
        j = j + 1
        If ws売上.Cells(i, 1).Value <> ws売上.Cells(i + 1, 1).Value Then 'もし一つ下とデータが違ったら
            k = WorksheetFunction.Match(ws売上.Cells(i, 1), wsマスタ.Range("A:A"), 0)
            ws請求書.Range("A2") = wsマスタ.Cells(k, 2)
            ws請求書.Range("A3") = wsマスタ.Cells(k, 3)
            ws請求書.Range("A4") = wsマスタ.Cells(k, 4)
            ws請求書.Range("A5") = wsマスタ.Cells(k, 5)
            ws請求書.ExportAsFixedFormat xlTypePDF, wb.Path & "\請求書\" & _
                  ws請求書.Range("A2").Value & Format(Date, "yyyymm") & ".pdf" 'PDF作成
            ws請求書.Range("A2:A5,A10:D24").ClearContents 'データを削除
            j = 10
        End If
    Next i

End Sub


フォルダ作成は今までずっとFSOさんを使ってきましたが、
今回はMkDir関数さんを使ってみました。


フォルダを一つ作るだけ、とかならこっちの方が手っ取り早い?


新人君
新人君

色んな方法を知っておくことも
大切ですね!

ブチョ
ブチョ

いや、一つを極めることの方が
1000倍重要だ!

新人君
新人君

・・・お、おん…

Dir関数

指定したパターンまたはファイル属性に一致するファイル、ディレクトリ、フォルダーの名前、またはドライブのボリューム ラベルを表す String を返します。

同名のフォルダがないとわかってる場合はこれ1行。


ただし基本的にはIFを入れてあげたほうが良いかな。

ブチョ
ブチョ

もし既にフォルダがあったら
作る必要ないもんね!

新人君
新人君

そういうことっすね!

PDF作成((wb.)ExportAsFixedFormat メソッド)

動画で紹介した神髄さんのサイトはこちら

ブック、シート、セルなどをPDFとして出力可能。
親となるオブジェクトをしっかりと指定してあげてください。

ここさえ出来たらあとは今までの復習でした!

あとがたり

おはこんばんちは。uぷ主です。
83本目、請求書とPDFを作成する問題でした。

いや~、実務であるあるな感じの問題でした。

会社とか社員とか支店とかをループして…
実績を作ったり、印刷したり、PDFを作ったり…

この問題ができるかどうかで実務力が問われそうな感じですかね!


がっつり組み込んだファンクションとかを作るって言うよりかは、
こうやってちまちま行とか列とかを指定してやっても全然いいですからね。

なんならuぷ主は初期の頃、
For i = 1 to 3732
みたいな感じでループ回数指定してましたから。

そんなコードでも、動いたら
「おおー!すげえー!」ってなるのがuぷ主の会社。

動きゃいいんです。w

今回も非常に実践的で勉強になる問題でした。
ありがとうございました。

そして最後までご視聴ありがとうございました。

コメント

タイトルとURLをコピーしました