プロが教える店舗&オフィスのセキュリティ対策術

https://tonari-it.com/excel-vba-invoice-macro/のサイトのファイルを元に、
企業別ではなく、Dr別に依頼表を作成したいと考えています。

サイトの「請求データ」のデーターベースは、次のように考えています。
患者ID・患者名・入院日・退院日・医師コード・依頼先医師名とし、医師名は重複し、別の医師名もあります。

サイトの「取引先マスタ」のデーターベースは、次のように考えています。
医師コード・依頼先医師名とし重複はありません。

また、inputboxの日付での抽出入力は不要と考えています。

サイトの「請求書ひな形」は次のように考えています。
______________________
          依頼票         |
  Drへ                  |
           依頼日:印刷日当日  |
           期限:印刷日月末   |
                      |
    ○○の件で~            |
                      |
         ~よろしくお願いします。 |
    患者ID|患者名|入院日|退院日   |
   |   |   |   |   |  |
   |   |   |   |   |  |
                      |                   
______________________|

VBA実行後、
デスクトップにDr別のファイルができるようになりたいのです。
______________________
          依頼票         |
 YDrへ                  |
           依頼日:2019/9/1  |
           期限:2019/9/30   |
                      |
    ○○の件で~            |
                      |
         ~よろしくお願いします。 |
    患者ID|患者名|入院日|退院日   |
   |12345| A |1/1 |1/2|    |
   |54321| B |5/3 |5/5|    |
                      |                   
______________________|
______________________
          依頼票         |
 ADrへ                  |
           依頼日:2019/9/1  |
           期限:2019/9/30   |
                      |
    ○○の件で~            |
                      |
         ~よろしくお願いします。 |
    患者ID|患者名|入院日|退院日   |
   |78910| C |1/5 |1/10|    |
   |04789| B |3/3 |7/5 |    |
                      |                   
______________________|

どう削ったらいいのかわかりません。
セルの位置は特にこだわっていないのでサイトのテンプレの位置で考えています。
変更して何度もチャレンジしていますがエラーばかり出ます。
詳しい方、教えていただけないでしょうか。
__________________________________________
Sub 請求書作成()


'rowsData=請求データの最終行数
'rowsClient=取引先マスタの最終行数
'wsData=請求データ
'client=取引先
'ws=請求書ひな形

Dim rowsData As Long, rowsClient As Long
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '請求データの最終行数
rowsClient = wsClient.Cells(Rows.Count, 1).End(xlUp).Row '取引先マスタの最終行数

'年月を入力ダイアログで入力
Dim dayCutoff As Date
dayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))

Dim n As Long
For n = 2 To rowsClient '取引先マスタの2行目から最終行まで

Dim client As String
client = wsClient.Cells(n, 1).Value '取引先マスタの1列目

'ひな形ブックを開きそのシートとともにセットする
Dim wb As Workbook, ws As Worksheet
Set wb = Workbooks.Open(ThisWorkbook.Path & "\請求書ひな形.xlsx") '請求書ひな形ファイルを開きwbファイルに格納
Set ws = wb.Worksheets(1) '請求書ひな形をwsに格納

'該当の取引先かつ年月のデータを転記する
Dim i As Long, k As Long
k = 21
For i = 2 To rowsData 'for~nextがやってる

If wsData.Cells(i, 2).Value = client Then '請求データの取引先名がクライアント名と等しいとき
Dim deliDate As Date
deliDate = wsData.Cells(i, 1).Value 'deliDateは請求データの納品日

If Year(deliDate) = Year(dayCutoff) And Month(deliDate) = Month(dayCutoff) Then 'inputboxの値と等しければ実行
wsData.Range(wsData.Cells(i, 3), wsData.Cells(i, 5)).Copy ws.Cells(k, 1) '請求データの3~5列目の範囲をコピーする、そのコピー先はWSである請求書ひな形のA21に
k = k + 1 'やったら1プラスで位置がずれる
End If
End If
Next i

'その他の転記と行の非表示
ws.Rows(k & ":50").Hidden = True 'データがない行を隠す

ws.Range("A18").Value = "ご請求金額:" & Format(ws.Range("D54").Value, "#,##0") & " 円"
ws.Range("A3").Value = client & "御中" '取引先名、取引先マスタらか引っ張ってくる
ws.Range("A5").Value = "〒" & wsClient.Cells(n, 2).Value '郵便番号
ws.Range("A6").Value = wsClient.Cells(n, 3).Value '住所1
ws.Range("A7").Value = wsClient.Cells(n, 4).Value '住所2
ws.Range("D15").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 1, 0) '請求日
ws.Range("D16").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 2, 0) 'お支払期限

'ファイル名を生成して保存して閉じる
Dim fileName As String
fileName = ThisWorkbook.Path & "\" & Format(dayCutoff, "yyyymm") & "請求書_" & client & ".xlsx"
wb.SaveAs fileName
wb.Close

Next n
End Sub

A 回答 (3件)

こんにちは、


やりたい事は、理解できますが、修正などアドバイスするに至る情報が足りません。
掲示のサイトでのコードには、エラーはなく実行されると思います。
また、処理などをブロック分けしており、比較的容易に流用、改造できると思います。

従って、表組や引数あたりが問題なのでしょうが、どのような修正で、
どこでエラーになっているか?表組がどのような形(Rangeアドレス)なのか、示さないと判りません。
印刷レベルで配布するような記載ですが、A4用紙にテンプレート2枚分の出力なのでしょうか?

などなど、補足情報が必要ですね。
    • good
    • 0

VBA初心者です。



No1さんに同意です。

リンク先のソースをそのままコピペされるよりも、ご自身でどこまでソースをつくられたのか、どこでつまづいているのかを書かれた方が適切な回答が得られると思いますよ。

それと一度VBAでつくるとあとが大変ですよ。様式も今後変わらず、貴方がつくって将来にわたって貴方だけが使用するのなら問題はないのですが、修正や人事異動はつきものです。一度つくってしまうと、あとあとまでそのVBAのメンテナンスが個人に付いて回ります。

何かあったら、作った人間が無償で修正するのがあたり前で、どこに異動してもついてまわる、そして上手く動かなければ「こんな不便な物を作りやがって」「こんなのは使い物にならない」と批判されるのがおちです。

ご自身がVBAのスキルが高ければ良いのですが、そうでなければヘタに手出しをしない方がよろしいかと思いますが。
    • good
    • 0

正直リンク先のコードを出されても意味ないと思います。

(リンク先に書かれてるものですよね?)
あなたが手こずっているコードの方が重要だと思います。

重要なのは『実際のデータベース』がどのように作られているのか?にあるのですから。
それにリンク先の
>「取引先マスタ」のデーターベース
は別に要らないでしょ。
ただそちらでどうしても必要と言うなら別ですけど、医師コードは医師が変わって(退職等)もそのまま残すの?

>医師名は重複し、別の医師名もあります。
依頼する医師が患者によって重複する場合はわかりますし、その重複はなくしてデータを取得は可能でしょ。
でも『別の医師名』って何を指してます?

それよりかは『どこまで依頼を達成したのか』の見極めるチェック欄が必要なのでは?
それとも患者が退院日を過ぎて退院したら、そのデータは保管せず1行丸々削除するのでしょうか?
ここで気になったのは、退院日は入院日確定と共に確定されるのか?ですよね。
退院予定日ってならわかりますけど。
あと年を越して入院した場合の対応はなし?

と色々書きましたけど、うちのExcelは化石化しているものなので期待はされないように。(たまにしかここは訪れませんし)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!