質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1333閲覧

Excel VBAを用いて顧客リストから一括で通知印刷する設定で、同じ宛先の人に対し、まとめて契約IDを記載する

mkmigmyuch

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/07/06 10:08

編集2021/07/06 13:36

Excel VBAを用いて、以下のような顧客リストを使用し、同じ宛先(同じ通し番号)の人に対し、契約IDを1つの通知にまとめて記載した状態で、印刷をしたいです。
通知のフォーマットは、同じ宛先の人(通し番号)に対し、契約ID最大10個までを1つの通知に印刷できるような仕様になっています。

1列目を通し番号とし、同じ宛先の人は同じ通し番号になるようにしています。

1 契約ID Aさん 住所
1 契約ID Aさん 住所
2 契約ID Bさん 住所
3 契約ID Cさん 住所
3 契約ID Cさん 住所
3 契約ID Cさん 住所

※契約IDは、契約単位で異なるため、全て異なります。

複数人で分担して印刷するため、顧客リストのセルAZ3に印刷開始行、顧客リストのセルBA3に印刷終了行を手入力すると、印刷開始行から印刷終了行までの間の顧客リストを一括印刷する設定にしています。

通知のCells(2,36)に契約IDを転記し、通知の宛先部分に顧客リストからVLOOKUPで、Cells(2,36)の顧客を探し、住所を引っ張ってくる設定にしています。

If関数で通し番号が同一の場合は、Cells(2,36)の隣のセルに契約IDを転記する。この作業を最大10個の契約IDで繰り返す。異なる場合は、通知を印刷し、セルをクリアして次の顧客の通知を印刷する。という設定にしようと考えています。

しかし、ループ処理が上手くいかず、Aさんをひたすら印刷してしまいます。
どこを修正したら上手くループできるのか、Do While やDo Until等色々試しましたが分からないため、教えていただけるとありがたいです。

Sub 通知印刷() Dim i As Integer Dim Start_Point As Integer Dim End_Point As Integer Dim k As Integer Start_Point = Worksheets("顧客リスト").Range("AZ3").Value End_Point = Worksheets("顧客リスト").Range("BA3") For k = Start_Point To End_Point Step CStr(k) Worksheets("通知").Cells(2,36) = Worksheets("顧客リスト").Cells(CStr(k), 2) For i = 1 To 10 If Worksheets("顧客リスト").Cells(CStr(k), 1) = Worksheets("顧客リスト").Cells(CStr(k) + CStr(i), 1) Then Worksheets("通知").Cells(2, 36 + CStr(i)) = Worksheets("顧客リスト").Cells(CStr(k) + CStr(i), 2) Else Worksheets("通知").PrintOut Worksheets("通知").Range("AJ2:AS2").ClearContents End If Next i Next k End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jinoji

2021/07/06 22:18 編集

シート名がたくさん出てきますが、関係性がわかりませんでした。 契約IDの転記先は(36,2)と(2, 36)のどっちが正しいですか。
mkmigmyuch

2021/07/06 23:59 編集

jinojiさん、毎回助けてくださり、本当にありがとうございます。 jinojiさんのおかげで私の仕事が成り立っており、大変感謝しています。 直したと思っていたのですが、回線が悪く、反映していませんでした。 分かりづらくしてしまい、すみませんでした。 修正致しましたので、ご確認いただけると大変ありがたいです。 (2,36)が正で、シートは通知、顧客リストの2種類のみです。
guest

回答1

0

ベストアンサー

テストとかしていませんが、雰囲気としてはこんな感じかなと思いました。いかがでしょうか。

VBA

1 Dim i As Integer 2 Dim Start_Point As Integer 3 Dim End_Point As Integer 4 Dim k As Integer 5 6 Dim wsK As Worksheet 7 Set wsK = Worksheets("顧客リスト") 8 Dim wsT As Worksheet 9 Set wsT = Worksheets("通知") 10 11 With wsK 12 Start_Point = .Range("AZ3").Value 13 End_Point = .Range("BA3").Value 14 15 k = Start_Point 16 Do While k < End_Point 17 wsT.Cells(2, 36) = wsK.Cells(k, 2) 18 For i = 1 To 10 19 If wsK.Cells(k, 1) = wsK.Cells(k + i, 1) Then 20 wsT.Cells(2, 36 + i) = wsK.Cells(k + i, 2) 21 Else 22 wsT.PrintOut 23 wsT.Range("AJ2:AS2").ClearContents 24 Exit For 25 End If 26 Next 27 k = k + i 28 Loop 29 End With 30

投稿2021/07/06 23:03

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkmigmyuch

2021/07/07 07:15 編集

回答作成いただきありがとうございます。 試させていただいたところ、終わりの部分を< End_Point+1にして、ループ処理が想像通りに動いてくれました! ありがとうございましたm(__)m ループ処理の文章を1から考えるのが苦手なので、教えていただいた文章を参考に、考え方をもっと勉強したいと思います。 大変助かりました。いつも本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問