[[20231022191236]] 『請求コードごとの請求書作成方法について』(たはたは) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『請求コードごとの請求書作成方法について』(たはたは)

会社の請求書発行部門で業務をしている者です。
社内のシステム変更が行われることになり、色々請求書発行方法も変わるので、エクセルで作成出来ないか検討しています。

今困っているのが、請求コードごとの請求書作成方法について、です。
1件のお客様、納品場所ごとに請求書を分けてほしいとご要望の為、納品場所ごとに請求コードを登録しています。
請求コードごとに、品名、規格、数量、単価、金額、備考、月の合計納品金額
を毎月発行しています。

今までは上記の請求書発行を自動で出来るシステムがあり、ボタンひとつ押せば請求コードごとの請求書が発行出来ていました(請求コードは全部で15個ほど

それが会社の経費削減でシステムが使えなくなり、代わりの方法を模索しています。

月の納品履歴の基データはCSVで出せるのですが、請求コードを軸にピポットテーブルのように「請求コードごとに、品名、規格、数量、単価、金額、備考、月の合計納品金額」を集計して、
請求コードごとに請求書を、出来たら差し込み印刷のように瞬時に出来る方法を探していました。

自分なりにネットで探しましたが、
・ピポットテーブルの「レポートフィルターページの表示」で請求先コードごとに抽出する→これだと用意した請求書フォーマットでなく新規のエクセルページに反映してしまう。結果を請求書フォーマットにコピペすればいいのかもしれませんが時間がかかる。。
・FILTER関数を用いて、請求書フォーマットに請求コードを入力して1枚ずつ印刷する
https://www.youtube.com/watch?v=UZ9_CxNwDs0
上記のyoutubeを参考にと思いましたが、出来たら1枚ずつ印刷でなく、一度印刷ボタンを押したらすべての請求コードごとに一斉印刷できる仕組みが良い

上記の方法が可能になる対応策を、ご教示いただけますと幸いです。
宜しくお願いいたします。

< 使用 Excel:Excel2021、使用 OS:Windows11 >


全自動はVBA〜♪。。。vba〜〜〜^^
m(__)m
(隠居Z) 2023/10/22(日) 20:54:57

 たたき台としては、こんな感じでしょうか
 請求書シートの請求コードを入力するセルには、名前定義("請求コード")

 Sub test()
    Dim t As ListObject
    Dim wsPrint As Worksheet
    Dim e

    Set t = Worksheets("Data").ListObjects(1)
    Set wsPrint = Worksheets("請求書")

    For Each e In WorksheetFunction.Unique(Range(t.Name & "[請求コード]"))
        wsPrint.Range("請求コード").Value = e
        wsPrint.PrintOut preview:=True
    Next

 End Sub
(マナ) 2023/10/23(月) 00:03:02


マナさん
返信遅くなり申し訳ございません。。
ありがとうございます!
(たはたは) 2023/11/12(日) 06:13:20

おはようございます。^^
処理対象の実情が不明瞭な為、テスト情報自作自演のデモコードです
何かの足しにでもなれば幸甚です。
的外れでしたら、ゴミ箱ぽぉいしてくださいね。
間違っても既存のブックで実行しないでください
シートとか消しまくります。テキストファイルも作成しますので
危険です。
もし、お試しい戴けるなら
新規フォルダの新規ブック ← 安全確保のため重要です( ̄▽ ̄)
にてお試を。最後のシート消すプロシジャーを止めておくと
テスト情報が残ります。
[ダミーの商品名が空白になる不具合は修正しました^^;]
 Option Explicit
Sub main()
    Dim kAry(), dAry()
    zwSDelete
    srccsv_dummydata_make
    file_read kAry, dAry
    printws_pageset
    mprint kAry, dAry
    zwSDelete
    Erase kAry, dAry
End Sub
Private Sub zwSDelete()
    Dim i             As Long
    If Not Evaluate("=ISREF(Sheet1!A1)") Then Sheets.Add.Name = "Sheet1"
    Application.DisplayAlerts = False
    For i = Worksheets.Count To 1 Step -1
        If Worksheets(i).Name <> "Sheet1" Then
           Worksheets(i).Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub
Private Sub mprint(k(), w())
    Dim i&, j&, a&, n&, y&, x&, mi(), old, inv_flg As Boolean
    Dim g#, ag#, p&, cnt&, s&, acnt&
    mi = Application.Index(w, 1, 0)
    With Worksheets("請求書")
        .Activate
        .UsedRange.Clear
        .Cells(1, 4) = "請 求 書"
        old = k(0)
        y = 5: x = 1: p = 1
        For i = 0 To UBound(k)
            If k(i) <> old Then
                y = 5
                If .Rows(y).Cells(1) <> "" Then
                    .Cells(2, 9) = p
                    With .UsedRange.SpecialCells(xlLastCell)
                        .Offset(2, 0) = g
                        .Offset(2, -1) = "総合計"
                    End With
                    .UsedRange.Columns.AutoFit
                    .PrintPreview
                    Intersect(.UsedRange, .Range(.Rows(y), .Rows(.Rows.Count))).Clear
                End If
                cnt = 0
                p = 1
                g = 0
            End If
            For j = 2 To UBound(w, 1)
                If k(i) = w(j, 4) Then
                    cnt = cnt + 1
                    acnt = acnt + 1
                    If cnt = 1 Then
                        .Cells(2, 9) = p
                        .Cells(2, 2) = w(j, 3) & " 様"
                        .Cells(2, 5) = w(j, 5) & " 御中"
                        .Cells(4, 1).Resize(, UBound(mi)) = mi
                        'w → 1,6-11
                    End If
                    .Cells(y, x) = w(j, 1)
                    g = g + w(j, 10)
                    ag = ag + w(j, 10)
                    For n = 1 To 11
                        .Cells(y, x + n - 1) = w(j, n)
                    Next
                    y = y + 1
                    If y > 22 Then
                        s = j + 1
                        For a = s To UBound(w, 1)
                            If k(i) = w(a, 4) Then
                                inv_flg = True
                                Exit For
                            End If
                        Next
                        If Not inv_flg Then
                            With .UsedRange.SpecialCells(xlLastCell)
                                .Offset(2, 0) = g
                                .Offset(2, -1) = "総合計"
                            End With
                        End If
                        inv_flg = False
                        .Cells(2, 9) = p
                        p = p + 1
                        .UsedRange.Columns.AutoFit
                        .PrintPreview
                        y = 5
                        Intersect(.UsedRange, .Range(.Rows(y), .Rows(.Rows.Count))).Clear
                    End If
                    old = w(j, 4)
                End If
            Next
        Next
        .UsedRange.Clear
    End With
    Erase mi
    MsgBox "総額 = " & Format(ag, "#,#") & Chr(13) & "処理件数 = " & acnt
End Sub
Private Sub printws_pageset()
'11*25
    If Not Evaluate("=ISREF(請求書!A1)") Then Sheets.Add.Name = "請求書"
    With Worksheets("請求書").PageSetup
        .PaperSize = xlPaperA4
        .Orientation = xlLandscape
        .PrintArea = "A1:K24"
        .Zoom = False
        .FitToPagesTall = False
        .FitToPagesWide = 1
    End With
End Sub
Sub file_read(tkey() As Variant, w() As Variant)
    Dim i&, j&, ps$, fnm$, buf$, mi$, v, idx()
    Dim zA
    ps = ThisWorkbook.Path & "\"
    fnm = "DummyForTest.csv"
    Open ps & fnm For Input As #1
    '見出し1件、読み飛ばし
    Line Input #1, mi
    v = Split(mi, ",")
    ReDim Preserve idx(i)
    idx(i) = v
    i = i + 1
    Erase v
    Do
        If EOF(1) Then Exit Do
        Line Input #1, buf
        If CDbl(CDate(Left(buf, 10))) >= DateSerial(2023, 9, 1) And _
           CDbl(CDate(Left(buf, 10))) <= DateSerial(2023, 9, 30) Then
            v = Split(buf, ",")
            ReDim Preserve idx(i)
            idx(i) = v
            Erase v
            i = i + 1
            If i Mod 1280 = 0 Then DoEvents
        End If
    Loop
    Close
    Kill ps & fnm
    w = Application.Index(idx, 0, 0)
    Set zA = CreateObject("System.Collections.ArrayList")
    For i = 1 To UBound(w, 1)
        If Not zA.Contains(w(i, 4)) Then zA.Add w(i, 4)
    Next
    zA.Sort
    tkey = zA.toarray()
    Erase idx
    zA.Clear
    If Not Evaluate("=ISREF(data!A1)") Then Sheets.Add.Name = "data"
    With Worksheets("data")
    .UsedRange.Clear
        .Cells(1).Resize(UBound(w, 1), UBound(w, 2)) = w
    End With
End Sub
Private Sub srccsv_dummydata_make()
Rnd -7
    Dim x&, iMax&, i&, j&, mi(), idx(), w(), zd, tx$, ps$, fnm$
    Dim sm(), tm(), rn&
    mi = Array("日付", "得意先コード", "得意先名", "請求コード", "請求先名", _
               "品名", "規格", "数量", "単価", "金額", "備考")
    iMax = 2000
    x = Int(iMax / 30) + 1
    zd = DateSerial(2023, 8, 21)
    ps = ThisWorkbook.Path & "\"
    fnm = "DummyForTest.csv"
    Open ps & fnm For Output As #1
    Print #1, Join(mi, ",")
    ReDim sm(1 To 25, 1 To 4)
    sm(1, 1) = "商品コード": sm(1, 2) = "商品名":         sm(1, 3) = "単価": sm(1, 4) = "規格"
    sm(2, 1) = "A10001":     sm(2, 2) = "かけうどん":     sm(2, 3) = "300":  sm(2, 4) = "和食"
    sm(3, 1) = "A10002":     sm(3, 2) = "ハイカラうどん": sm(3, 3) = "500":  sm(3, 4) = "和食"
    sm(4, 1) = "A10003":     sm(4, 2) = "冷やしうどん":   sm(4, 3) = "550":  sm(4, 4) = "和食"
    sm(5, 1) = "A10004":     sm(5, 2) = "かけそば":       sm(5, 3) = "350":  sm(5, 4) = "和食"
    sm(6, 1) = "A10005":     sm(6, 2) = "ハイカラそば":   sm(6, 3) = "450":  sm(6, 4) = "和食"
    sm(7, 1) = "10006":      sm(7, 2) = "ザルそば":       sm(7, 3) = "900":  sm(7, 4) = "和食"
    sm(8, 1) = "A10007":     sm(8, 2) = "玉子丼":         sm(8, 3) = "500":  sm(8, 4) = "和食"
    sm(9, 1) = "A10008":     sm(9, 2) = "天丼":           sm(9, 3) = "1000": sm(9, 4) = "和食"
    sm(10, 1) = "A10009":    sm(10, 2) = "木の葉丼":      sm(10, 3) = "700": sm(10, 4) = "和食"
    sm(11, 1) = "A10010":    sm(11, 2) = "おにぎり定食":  sm(11, 3) = "600": sm(11, 4) = "和食"
    sm(12, 1) = "A10011":    sm(12, 2) = "ラーメン":      sm(12, 3) = "500": sm(12, 4) = "中華"
    sm(13, 1) = "A10012":    sm(13, 2) = "ラーメン定食":  sm(13, 3) = "800": sm(13, 4) = "中華"
    sm(14, 1) = "A10013":    sm(14, 2) = "味噌ラーメン":  sm(14, 3) = "600": sm(14, 4) = "中華"
    sm(15, 1) = "A10014":    sm(15, 2) = "餃子":         sm(15, 3) = "300":  sm(15, 4) = "中華"
    sm(16, 1) = "A10015":    sm(16, 2) = "カレーライス": sm(16, 3) = "500":  sm(16, 4) = "洋食"
    sm(17, 1) = "A10016":    sm(17, 2) = "カツカレー":   sm(17, 3) = "800":  sm(17, 4) = "洋食"
    sm(18, 1) = "A10017":    sm(18, 2) = "ハンバーグ":   sm(18, 3) = "600":  sm(18, 4) = "洋食"
    sm(19, 1) = "A10018":    sm(19, 2) = "ハムエッグ":   sm(19, 3) = "450":  sm(19, 4) = "洋食"
    sm(20, 1) = "A10019":    sm(20, 2) = "日替わり定食": sm(20, 3) = "500":  sm(20, 4) = "D"
    sm(21, 1) = "A10020":    sm(21, 2) = "洋食定食":     sm(21, 3) = "900":  sm(21, 4) = "洋食"
    sm(22, 1) = "A10021":    sm(22, 2) = "中華定食":     sm(22, 3) = "800":  sm(22, 4) = "中華"
    sm(23, 1) = "A10022":    sm(23, 2) = "和定食":       sm(23, 3) = "1000": sm(23, 4) = "和食"
    sm(24, 1) = "A10023":    sm(24, 2) = "サンマ定食":   sm(24, 3) = "600":  sm(24, 4) = "和食"
    sm(25, 1) = "A10024":    sm(25, 2) = "出汁まき定食": sm(25, 3) = "500":  sm(25, 4) = "和食"
    '*
    ReDim tm(1 To 20, 1 To 4)
    tm(1, 1) = "顧客コード": tm(1, 2) = "顧客名":      tm(1, 3) = "請求コード": tm(1, 4) = "請求先名"
    tm(2, 1) = "10001":      tm(2, 2) = "X病院":      tm(2, 3) = "50001":      tm(2, 4) = "x精神科"
    tm(3, 1) = "10001":      tm(3, 2) = "X病院":      tm(3, 3) = "50002":      tm(3, 4) = "x外科"
    tm(4, 1) = "10002":      tm(4, 2) = "八百屋":      tm(4, 3) = "50003":      tm(4, 4) = "しぶやスーパ"
    tm(5, 1) = "10002":      tm(5, 2) = "八百屋":      tm(5, 3) = "50004":      tm(5, 4) = "メグロや"
    tm(6, 1) = "10002":      tm(6, 2) = "八百屋":      tm(6, 3) = "50005":      tm(6, 4) = "歌舞伎店"
    tm(7, 1) = "10002":      tm(7, 2) = "八百屋":      tm(7, 3) = "50006":      tm(7, 4) = "本所支店"
    tm(8, 1) = "10003":      tm(8, 2) = "床屋":        tm(8, 3) = "50007":      tm(8, 4) = "床屋"
    tm(9, 1) = "10004":      tm(9, 2) = "寝具屋":      tm(9, 3) = "50008":      tm(9, 4) = "ふとんや"
    tm(10, 1) = "10004":     tm(10, 2) = "寝具屋":     tm(10, 3) = "50009":     tm(10, 4) = "べっど"
    tm(11, 1) = "10004":     tm(11, 2) = "寝具屋":     tm(11, 3) = "50010":     tm(11, 4) = "まくら"
    tm(12, 1) = "10004":     tm(12, 2) = "寝具屋":     tm(12, 3) = "50011":     tm(12, 4) = "もうふ"
    tm(13, 1) = "10005":     tm(13, 2) = "電気屋本社": tm(13, 3) = "50012":     tm(13, 4) = "第1支社"
    tm(14, 1) = "10005":     tm(14, 2) = "電気屋本社": tm(14, 3) = "50013":     tm(14, 4) = "第2支社"
    tm(15, 1) = "10005":     tm(15, 2) = "電気屋本社": tm(15, 3) = "50014":     tm(15, 4) = "第3支社"
    tm(16, 1) = "10005":     tm(16, 2) = "電気屋本社": tm(16, 3) = "50015":     tm(16, 4) = "第4支社"
    tm(17, 1) = "10005":     tm(17, 2) = "電気屋本社": tm(17, 3) = "50016":     tm(17, 4) = "第5支社"
    tm(18, 1) = "10005":     tm(18, 2) = "電気屋本社": tm(18, 3) = "50017":     tm(18, 4) = "第6支社"
    tm(19, 1) = "10005":     tm(19, 2) = "電気屋本社": tm(19, 3) = "50018":     tm(19, 4) = "第7支社"
    tm(20, 1) = "10005":     tm(20, 2) = "電気屋本社": tm(20, 3) = "50019":     tm(20, 4) = "第8支社"
    Do
        For j = 1 To Int((x - 1 + 1) * Rnd + 1)
            i = i + 1
            If i Mod 1280 = 0 Then DoEvents

            If i > iMax Then Exit Do
            ReDim w(1 To UBound(mi) + 1)
            rn = Int((UBound(tm) - 2 + 1) * Rnd + 2)
            w(1) = zd
            w(2) = tm(rn, 1)
            w(3) = tm(rn, 2)
            w(4) = tm(rn, 3)
            w(5) = tm(rn, 4)
            rn = Int((UBound(sm) - 2 + 1) * Rnd + 2)
            w(6) = sm(rn, 2)
            w(7) = sm(rn, 4)
            w(8) = CStr(sm(rn, 3))
            w(9) = CStr(Int((10 - 1 + 1) * Rnd + 1))
            w(10) = CStr(CLng(w(8)) * CLng(w(9)))
            w(11) = Empty
            Print #1, Join(w, ",")
        Next
        zd = zd + 1
    Loop
    Close
    Erase mi, idx, w, sm, tm
End Sub

(隠居Z) 2023/11/12(日) 08:40:07


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.