![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
Sheet1には以下のようにデータが入力されています。
A列(日付) B列(顧客コード) C列(顧客名) D列(商品名)
09/09/09 1004 上田 SSS
09/09/09 1004 上田 SSS
09/09/09 1005 山田 AAA
09/09/10 1004 上田 SSS
09/09/10 1005 山田 AAA
09/09/10 1006 田中 BBB
09/09/10 1004 上田 SSS
09/09/10 1005 山田 AAA
Sheet2以降は、顧客コード別に分かれたシート(シート名=顧客コード)が並んでおり、それぞれ顧客の情報が入力されています。
A列で印刷範囲を指定し(毎日印刷するため、9月10日であれば9月10日の日付分だけ)、B列のコードと同じコード名のシートを印刷するという手順になります。実際は、もっとデータがたくさんありますので手作業ではとても困難になってしまいます。
マクロでやってみようと思い、作成してみたのですが、下記に添付しているマクロでは、Sheet1で同日に同じコードがある場合、シートが重複して印刷されてしまいます。
上記の例で言いますと、9月10日の日付5行を範囲として、B列のコードと同じコード名のシートを検索して印刷するのですが、1004が2つ、1005が2つと、シートが重複してしまいます。
なんとかして、重複するコードは印刷しないという技はないものでしょうか。重複データを消去するという手段は、残念ながら、全て必要なデータですのでそれはできないのです。
マクロ初心者で、応用がなかなか利かないため、どうしても皆さんのお力をお借りしたく、ここへ質問させていただきました。
これからの勉強を兼ねて、ご回答くださる方々の意見を十分に参考にさせていただきたいと思っておもりますので、どうぞよろしくお願いいたします。
Sub test1()
Dim n As Long
Dim R1 As Long, R2 As Long
Dim i As Long
Dim myRange As Range
R1 = ActiveCell.Row
R2 = R1 + Selection.Rows.Count - 1
For i = R1 To R2
Set myRange = Worksheets(CStr(Cells(i, 3).Value)).Range("P:AD")
myRange.PrintOut
Next
End Sub
No.1ベストアンサー
- 回答日時:
一度重複しない顧客コードを取得し、そのデータを基に印刷を行なう。
Sub try()
Dim myDic As Object
Dim r As Range, rr As Range
Dim myRange As Range
Dim myKey As Variant
' Dictionaryオブジェクトを使います
Set myDic = CreateObject("Scripting.Dictionary")
' 選択したセル範囲と同行のB列をセット
Set rr = Intersect(Selection.EntireRow, Range("B:B"))
' ----------------------------------
' ここで重複する顧客コードはDictionaryでまとめてしまう。
For Each r In rr
If LenB(r.Value) > 0 Then ' B列に値があるかどうか
myDic(r.Value) = Empty
End If
Next
' -----------------------------------
' 重複のない顧客コードを元に印刷を行なう
For Each myKey In myDic.Keys
Set myRange = Worksheets(myKey).Range("P:AD")
myRange.PrintOut
Next
' -----------------------------------
Set myDic = Nothing
Set rr = Nothing
End Sub
【参考】
Dictionary オブジェクト
http://www.geocities.jp/cbc_vbnet/Scripting/dict …
Excel(エクセル) VBA入門:Dictionaryオブジェクトを利用する
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
ちょっと書き方は違いますが、ご参考になれば。
この回答への補足
ご丁寧にご説明を兼ねてご回答いただき、誠にありがとうございます。
一度、テストさせていただきました。Dictionaryオブジェクトは初心者の私にとって初めて使用するものですので、頑張って理解しながら読ませていただきました。
Set myRange = Worksheets(myKey).Range("P:AD")
の部分でエラーになってしまいます。Dictionaryオブジェクトの理解がまだ乏しいせいか、なぜエラーになってしまうのかが、大変申し訳ないのですが、わからないのです。頼りっきりで申し訳ないですが、よろしくお願いいたします。
No.5
- 回答日時:
#4です。
B列であっているのなら
>Set myRange = Worksheets(myKey).Range("P:AD")
Set myRange = Worksheets(Cstr(myKey)).Range("P:AD")
です。
説明文ではB列で、マクロコードはC列になっておりまして、ややこしくすみませんでした。実際はC列で、必要な部分だけ変えてさせていただきました。また新たなマクロを勉強でき、かつ仕事もスムーズにこなせるようになり、とても感謝しています。
ご丁寧かつ迅速にご回答いただき誠にありがとうございました。今回教わりましたマクロも次からは、自分でも使えるようにしていきたいと思っております。
No.4
- 回答日時:
#1です。
>Set myRange = Worksheets(myKey).Range("P:AD")
>の部分でエラーになってしまいます。
シート名が
>B列のコードと同じコード名のシートを印刷するという手順になります。
と言う事から顧客コードで行なってますが、提示されたコードの
>Set myRange = Worksheets(CStr(Cells(i, 3).Value)).Range("P:AD")
でいくとC列(顧客名)なのでしょうか?
もしそうであれば#1のコードの
>Set rr = Intersect(Selection.EntireRow, Range("B:B"))
を
Set rr = Intersect(Selection.EntireRow, Range("C:C"))
とC列に変更して下さい。
No.3
- 回答日時:
#1です。
一応Dictionaryオブジェクトのサンプル(になればいいですが)
Sub try2()
Dim myDic As Object
Dim myKey As Variant
Dim st As String
Set myDic = CreateObject("Scripting.Dictionary")
myDic("みかん") = Empty ' みかん を追加
myDic("りんご") = Empty ' りんご を追加
myDic("すいか") = Empty ' すいか を追加
For Each myKey In myDic.Keys
st = st & vbLf & myKey
Next
MsgBox st
myDic("みかん") = Empty ' みかん を追加
myDic("すいか") = Empty ' すいか を追加
myDic("バナナ") = Empty ' バナナ を追加
st = ""
For Each myKey In myDic.Keys
st = st & vbLf & myKey
Next
MsgBox st
Set myDic = Nothing
End Sub
ご参考になれば。
No.2
- 回答日時:
こんにちは、
試していないので、どうか解りませんが、
以下のコードでどうでしょう。
試してみてください。
Dim shname As New Collection
Sub test1()
Dim n As Long
Dim R1 As Long, R2 As Long
Dim i As Long
Dim myRange As Range
R1 = ActiveCell.Row
R2 = R1 + Selection.Rows.Count - 1
For i = R1 To R2
if check(CStr(Cells(i, 3).Value) then
Set myRange = Worksheets(CStr(Cells(i, 3).Value)).Range("P:AD")
myRange.PrintOut
end if
Next
End Sub
Public Function check(sh As String) As Boolean
Dim i As Integer
For i = 1 To shname.Count
If shname.Item(i) = sh Then
check = False
Exit Function
End If
Next
shname.Add sh
check = True
End Function
ご丁寧に、かつ迅速なご回答ありがとうございました。また違ったマクロの組方として、とても勉強になりました。今回ご教授いただいた事も含め、今後さらに勉強を重ねていきたいと思っております。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) VBAで、シート間の転記するコードをFOR~NEXTで教えてください。 9 2023/04/30 20:04
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1日に1人がこなせるプログラム...
-
JANコードとPOSコードは同じ?
-
access2021 VBA メソッドまたは...
-
Exel VBA 別ブックから該当デ...
-
エクセルに見えない文字(JISX0...
-
Excel VBA素人です。VBAで図形...
-
【VB6】実行ファイルとした後、...
-
オートフィルタで抽出結果に 罫...
-
Excel VBAでOpenTextのFieldInf...
-
VBAでファイルオープン後にコー...
-
ACCESSユニオンクエリでORDER B...
-
改ページ
-
リストボックスのアイテムをマ...
-
PreviewKeyDownイベントが2回...
-
sinカーブの表示のさせ方
-
Nullの使い方が不正です。
-
Access DCountでの連番について
-
VBについて質問です
-
コマンドボタンを押したときに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1日に1人がこなせるプログラム...
-
access2021 VBA メソッドまたは...
-
JANコードとPOSコードは同じ?
-
access2003 クエリSQL文に...
-
Excel VBA素人です。VBAで図形...
-
1、Rstudioで回帰直線を求める...
-
Nullの使い方が不正です。
-
JavaScriptの定数名が取り消し...
-
PreviewKeyDownイベントが2回...
-
変数名「cur」について
-
エクセルに見えない文字(JISX0...
-
ACCESSユニオンクエリでORDER B...
-
Exel VBA 別ブックから該当デ...
-
VBAでファイルオープン後にコー...
-
VBA リストボックス(複数条件...
-
ASCIIコードを文字に変換したい
-
【VB6】実行ファイルとした後、...
-
VBA 現在のセル番地を記憶、復...
-
COBOLの文法
おすすめ情報