請求書作成①

請求書を作成します
作成方法は3パターン
①同ブックに別シートとして請求書を作成する
②作成する請求書を別ブックとする
③売上データ・作成する請求書を別ブックとする

YouTubeで売上明細を作成する動画を作りましたが、
これを応用して請求書作ることができます


売上明細処理は、すでにあるシートに売り上げデータを転記するプログラムですが、
今回は、この売上明細処理にシートを追加する処理を加えました

売上明細作成のプログラム

Sub Uriage_Keisan()
Dim Tenmei  As String   '作成する店名 文字列
Dim i As Long                '売上データの行数
Dim j As Long                '作成する売上表の行数
Dim k As Long               '売上の項目の位置(列)
Dim SaisyuGyo As Long  '売上データの最終行

'Application.ScreenUpdating = False  '画面の更新を止める
                                     'ちらつき防止

Call Sheet_Clear                               '全店名別シートのClear

With Worksheets("売上明細")

    SaisyuGyo = .Cells(Rows.Count, 3).End(xlUp).Row
    
    For i = 3 To SaisyuGyo
        Tenmei = .Cells(i, 3)
                 
                '売上表に転記
                Worksheets(Tenmei).Activate
                j = Cells(Rows.Count, 2).End(xlUp).Row
                For k = 4 To 7
                    Cells(j + 1, k - 2) = .Cells(i, k)   '商品名~金額
                Next k
                
    Next i
        
End With

Worksheets("売上明細").Activate

'Application.ScreenUpdating = True  '画面の更新を再開する

End Sub

Sub Sheet_Clear()    '全店名別シートのClear

Dim Tenmei  As String   '作成する店名 文字列
Dim Tenmei_No As Long   '店名一覧の行数

    For Tenmei_No = 3 To 7
    
        Tenmei = Worksheets("店名一覧").Cells(Tenmei_No, 2)
        With Worksheets(Tenmei)
        
            '5行目以降をすべて消去
            .Rows("5:" & Rows.Count).ClearContents
            '5行目以降最終行まで消去するなら
'           .Rows("5:" & .Cells(Rows.Count, 3).End(xlUp).Row) _
'           .ClearContents
           
        End With
    Next Tenmei_No
    
End Sub

シートの追加

売上明細処理のデータを転記する前にこのフローチャートのプログラムを加えます
指定会社名のシートがなければシートを追加し、あれば指定シートをアクティブします

Sheet_ClearとKaisyaJyouhouプロシージャ

Sheet_Clearは、
作り直しました

顧客マスターから
Kaisyameiを取り出し
そのシートがあれば、
そのシートの明細行のみをClearします
(シートの有無の判断は、
シートの追加と同じ)

次のシート検索のために、
オブジェクト変数をクリア

請求書作成の先頭で、
このプロシージャを呼び出す

引数はKaisyamei
顧客マスターからKaisyameiを検索し、そのデータをアクティブシートに代入する
シート作成時に呼び出す

パターン1プログラム

'売上明細→同ブック全会社請求書
Sub Seikyusyo_Sakusei0()

    Dim Kaisyamei  As String   '請求先会社名
    Dim i As Long              '売上データの行数
    Dim j As Long              '作成する売上表の行数
    Dim k As Long              '売上の項目の位置(列)
    Dim SaisyuGyo As Long      '売上データの最終行
    
    Dim WS As Worksheet
    
    'Application.ScreenUpdating = False  '画面の更新を止める ちらつき防止
      
'*****************************
     '請求書作成
'*****************************
    Call Sheet_Clear                                    '全請求書シートの明細消去
    
    With ThisWorkbook.Worksheets("売上明細")
    
        SaisyuGyo = .Cells(Rows.Count, 3).End(xlUp).Row  '明細最終行
        
        For i = 3 To SaisyuGyo
            Kaisyamei = .Cells(i, 3)
            
        '*****************************
    'この部分を加える ↓

         '会社名の請求書シートがあるかどうか?
            On Error Resume Next                    'エラーがあっても次に進む
            Set WS = Worksheets(Kaisyamei)
            
            If WS Is Nothing Then                      'シートなければ、作成する

                Worksheets("請求書ひな形").Copy after:=Worksheets(Worksheets.Count)
                Worksheets(Worksheets.Count).Name = Kaisyamei
                
                Call KaisyaJyouhou(Kaisyamei)           '会社情報転記(請求書Header)
            
            Else
                Worksheets(Kaisyamei).Activate      'シートあれば、アクティブに
                Set WS = Nothing                       'オブジェクト変数をクリア
            End If
            On Error GoTo 0                            'エラー処理を戻す

    ' ここまで ↑
        '*****************************
        
            '請求書に転記
            j = Cells(29, 2).End(xlUp).Row   '請求書最終行
            For k = 4 To 6
                Cells(j + 1, k - 2) = .Cells(i, k)   '最終行+1へ追加
            Next k
                
        Next i
        
    End With

    'Application.ScreenUpdating = True  '画面の更新を再開する

End Sub

Sub Sheet_Clear()
    
       Dim SaisyuGyo As Long, Gyo As Long, i As Long
       Dim Kaisyamei As String
       Dim WS As Worksheet
       Dim KM As Worksheet
    
       Set KM = Worksheets("顧客マスター")
       
       '顧客マスター最終行
       SaisyuGyo = KM.Cells(Rows.Count, 2).End(xlUp).Row
        
        '顧客マスター最終行までループ
       For i = 3 To SaisyuGyo
       
           Kaisyamei = KM.Cells(i, 2)
           
           On Error Resume Next        'エラーがあっても次に進む
           Set WS = Worksheets(Kaisyamei)
           On Error GoTo 0               'エラー処理を戻す
           
           'シートがあるかないか判断
           If Not (WS Is Nothing) Then
           
                'ワークシートがあればアクティブに
               Worksheets(Kaisyamei).Activate
               
                '取り出すシートの最終行
               Gyo = Cells(29, 2).End(xlUp).Row
           
               'データがある場合のみ、Clearする
               If Gyo >= 16 Then
                    '16行目から最終行まで表の範囲を消去
                   Range(Cells(16, 1), Cells(Gyo, 4)).ClearContents
               End If
               Set WS = Nothing
           End If
           
       Next i
        
End Sub
Sub KaisyaJyouhou(Kaisyamei As String)
     Dim i As Long, SaisyuGyo As Long
     Dim KM As Worksheet
     
     Set KM = Worksheets("顧客マスター")
     SaisyuGyo = KM.Cells(Rows.Count, 3).End(xlUp).Row  '顧客マスター最終行
     
     '会社情報転記
     For i = 3 To SaisyuGyo
        If Kaisyamei = KM.Cells(i, 2) Then
           Range("a2") = Kaisyamei
           Range("a3") = "〒" & KM.Cells(i, 3)     '〒
           Range("a4") = KM.Cells(i, 4)            '住所
           Range("a5") = "TEL:" & KM.Cells(i, 5)  '電話番号
           Exit For
         End If
     Next i
     
End Sub

Sheet_Clearで、前に記入した明細をClear
明細だけを削除するので、その会社のデータがない時も、空の請求書(明細のない)ができる
なので、Sheet_Clearで全会社シートを削除しても…
このほうがよかったね(^^;)

コメント