製品一覧表というExcelブックがあり、A列に製品コード、B列以降にはその製品名や区分、生産地、生産数等の膨大な情報が載っています。
また区分表というブックもあり、こちらにはA列に製品コード、B列以降には製品名など製品一覧表と一致する情報もあれば、それ以外の情報も載っています。
そこで、区分表の方に、製品コードで検索をして製品一覧表と一致する情報についてコピペしたいと考えております。
値のみであればVLOOKUP関数でよいのですが、製品一覧表にはセルのコメントや色の塗りつぶし等もかなりあり、これらの情報も区分表に載せたいため、何とかVBAで処理したい意向です。
VBAは全くの初心者ということもありいろいろ調べまして、完全に的外れなのかもしれませんが次のコード(製品一覧表B列の製品名とAD列の生産数を、区分表のC列とI列に製品コードで検索して転記)がやりたいことに近かったため、試してみました。
しかしながらやはり値のみが返される状況でしたので、セルのコメントや色も反映させるためにはどのようにすべきかご教示いただけますと幸いです。
おそらくは、copyやpastespecialを使うのだと思うのですが、全くの初心者のため勝手がわからず、大変恐縮です(Excelは、2019を使用しています)。
何卒、よろしくお願いいたします。
--
Option Explicit
Sub テスト()
Dim datasheet As Worksheet
Set datasheet = ThisWorkbook.Worksheets("区分表")
Dim cmax1 As Long
cmax1 = datasheet.Range("A65536").End(xlUp).Row
Dim masterfile As String
masterfile = ThisWorkbook.Path & "\製品一覧表.xlsx"
Dim master As Workbook
Set master = Workbooks.Open(Filename:=masterfile)
Dim mastersheet As Worksheet
Set mastersheet = master.Worksheets("一覧表")
Dim cmax2 As Long
cmax2 = mastersheet.Range("A65536").End(xlUp).Row
Dim product_code As String, master_code As String, product_name As String
Dim i As Long, j As Long, production As Long
For i = 2 To cmax1
product_code = datasheet.Range("A" & i).Value
For j = 2 To cmax2
master_code = mastersheet.Range("A" & j).Value
If product_code = master_code Then
product_name = mastersheet.Range("B" & j).Value
production = mastersheet.Range("AD" & j).Value
Exit For
End If
Next
datasheet.Range("C" & i).Value = product_name
datasheet.Range("I" & i).Value = production
Next
master.Close
End Sub
No.2ベストアンサー
- 回答日時:
こんにちは
該当品番において
一覧表のB列が区分表のC列、一覧表のAD列が区分表のI列に値が代入されるようですが
示されているコードで書式などのコピー以外は正しく出来ていると
解釈してよいのでしょうか?
良いのであれば、変数に値を代入せずにCopyメソッドを使用すれば良いと思います。
該当箇所
If product_code = master_code Then
product_name = mastersheet.Range("B" & j).Value '変更
production = mastersheet.Range("AD" & j).Value '変更
Exit For
End If
Next
datasheet.Range("C" & i).Value = product_name '不要
datasheet.Range("I" & i).Value = production '不要
Next
変更対象
If product_code = master_code Then
mastersheet.Range("B" & j).copy datasheet.Range("C" & i)
mastersheet.Range("AD" & j).copy datasheet.Range("I" & i)
Exit For
End If
Next
Next
If product_code = master_code Then
Exit For
の為、区分表に同品番がある場合、一覧表の合致する上位行のデータがコピーされます。
一覧表に同品番がある場合、上位行のみがコピーされ下位行にあるデータは
対象になりません。
早速のご回答、ありがとうございます。示させていただいたコードでコピー以外は正しく動作している状況です。
またCopyメソッドについて回答いただき、ありがとうございました。不慣れなため理解に時間がかかってしまいましたが、回答いただいたとおりに修正し、思い通りの結果が得られました。
ここでの質問は初めてですが、質問してよかったと心から思いました。ご親切にありがとうございました。
No.3
- 回答日時:
おはようございます。
No.1さんの内容をコードにしてみると、下記の様になるかと思います。
>仮にヒットしなくても、必ず値を代入しようとしているよう も対応。
If product_code = master_code Then
product_name = mastersheet.Range("B" & j).Value
production = mastersheet.Range("AD" & j).Value
Exit For
End If
Next
datasheet.Range("C" & i).Value = product_name
datasheet.Range("I" & i).Value = production
↓
If product_code = master_code Then
mastersheet.Range("B" & j).copy datasheet.Range("C" & i)
mastersheet.Range("AD" & j).copy datasheet.Range("I" & i)
Exit For
End If
Next
No.1さんの補足をいただき、ありがとうございます。No2さんの内容と総合すると、「ヒットしない場合も必ず代入」は対応し、複数回ヒットは上位行がそれぞれ対象になるということですね。明解に理解することができました。
本当にご親切にありがとうございます。
皆さんをBAにしたいところ、大変恐縮ですが、先に回答いただいたNo2さんをBAにさせていただくこと、お許しください。本当にありがとうございました!
No.1
- 回答日時:
こんにちは
>セルのコメントや色も反映させるためにはどのようにすべきか
>ご教示いただけますと幸いです。
マクロは基本的に手操作の自動化みたいなものですので、色やコメントをコピーしたければ、(手操作の)コピペと同様のことを行うのが簡単です。
(文字色、背景色、罫線・・などをひとつひとつ設定もできますが、数が多いので面倒ですよね)
ご提示のコードでは、セルの .Value を代入する形式になっていますので、「値のみのコピー」と同様の処理になっています。
セルのコピペを行いたいのであれば、
(コピー元のRange).Copy Destination:=(ペースト先のRange)
のようになされば宜しいでしょう。
https://docs.microsoft.com/ja-jp/office/vba/api/ …
※ なお、以下はご質問に直接関係ありませんが・・・
検索したときに、必ずヒットするという保証があるのでしょうか?
ご提示のコードだと、仮にヒットしなくても、必ず値を代入しようとしているように思われます。
また、複数回ヒットした場合(←あり得ないのかもしれませんが)には、後のもので上書きされるようになっています。
早速、回答いただきありがとうございます。Valueが値に相当するとのこと、本当に初歩的なことで大変恐縮です。
また、いただいた回答からコピーメソッドについて、少しづつではありますが理解できてきました。
検索では必ずヒットし、複数回ヒットしないようなつくりになっておりますが製品コードの入力ミス等はあるかもしれません。この点についても、お気づきいただきありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
Cellsのかっこの中はどっちが行...
-
データグリッドビューの一番最...
-
Excelで、あるセルの値に応じて...
-
Changeイベントでの複数セルの...
-
【Excel VBA】 B列に特定の文字...
-
VBAのFind関数で結合セルを検索...
-
VBAで、特定の文字より後を削除...
-
【Excel VBA】カンマと改行コー...
-
【VBA】2つのシートの値を比較...
-
targetをA列のセルに限定するに...
-
エクセルVBA シートモジュール...
-
URLのリンク切れをマクロを使っ...
-
文字列の結合を空白行まで実行
-
rowsとcolsの意味
-
エクセル 2つの表の並べ替え
-
マクロについて。S列の途中から...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
Changeイベントでの複数セルの...
-
C# dataGridViewの値だけクリア
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
rowsとcolsの意味
-
VBAで、離れた複数の列に対して...
-
VBAでのリスト不一致抽出について
-
VBA 何かしら文字が入っていたら
-
VBAコンボボックスで選択した値...
-
マクロ 最終列をコピーして最終...
おすすめ情報