お世話になります。
VBA及びマクロ初心者ですが、皆様のお力を貸していただきたく思います。
現在、Excelで以下のようなテーブル形式の表から別シートへクロス形式の一覧表を作成する為のマクロに取り組んでおります。
<リスト1のシート>
番号 | 属性 |
---|---|
1000 | A |
1000 | B |
1000 | C |
1001 | A |
1001 | B |
1001 | C |
1002 | E |
1000 | D |
1000 | E |
------以下略------
<リスト2のシート>
番号 | 属性1 | 属性2 | 属性3 | 属性4 | 属性5 |
---|---|---|---|---|---|
1000 | A | B | C | D | E |
1001 | A | B | C | ||
1002 | E |
------以下略------
リスト2のシートへの転記のコードが以下となります。
(ネット上に挙げられていたものを引用・編集させていただきました。)
Private Sub CommandButton1_Click() Call A Call B Call C Call D Call E End Sub --------------------------------------------------------------------------------- Sub A() Dim i As Long Dim a() As Variant Dim j As Long j = 1 For i = 1 To Sheets("リスト1").Range("B" & Rows.Count).End(xlUp).Row 'セルにAがあるか If Sheets("リスト1").Cells(i, 2).Value Like "*A*" Then ReDim Preserve a(j) a(j) = Sheets("リスト1").Cells(i, 2).Value j = j + 1 End If Next For j = LBound(a) To UBound(a) Sheets("リスト2").Cells(j + 2, 2).Value = a(j) Next End Sub --------------------------------------------------------------------------------- Sub B() Dim i As Long Dim a() As Variant Dim j As Long j = 1 For i = 1 To Sheets("リスト1").Range("B" & Rows.Count).End(xlUp).Row 'セルにBがあるか If Sheets("リスト1").Cells(i, 2).Value Like "*B*" Then ReDim Preserve a(j) a(j) = Sheets("リスト1").Cells(i, 2).Value j = j + 1 End If Next For j = LBound(a) To UBound(a) Sheets("リスト2").Cells(j + 2, 3).Value = a(j) Next End Sub --------------------------------------------------------------------------------- Sub C() Dim i As Long Dim a() As Variant Dim j As Long j = 1 For i = 1 To Sheets("リスト1").Range("B" & Rows.Count).End(xlUp).Row 'セルにCがあるか If Sheets("リスト1").Cells(i, 2).Value Like "*C*" Then ReDim Preserve a(j) a(j) = Sheets("リスト1").Cells(i, 2).Value j = j + 1 End If Next For j = LBound(a) To UBound(a) Sheets("リスト2").Cells(j + 2, 4).Value = a(j) Next End Sub --------------------------------------------------------------------------------- Sub D() Dim i As Long Dim a() As Variant Dim j As Long j = 1 For i = 1 To Sheets("リスト1").Range("B" & Rows.Count).End(xlUp).Row 'セルにDがあるか If Sheets("リスト1").Cells(i, 2).Value Like "*D*" Then ReDim Preserve a(j) a(j) = Sheets("リスト1").Cells(i, 2).Value j = j + 1 End If Next For j = LBound(a) To UBound(a) Sheets("リスト2").Cells(j + 2, 5).Value = a(j) Next End Sub --------------------------------------------------------------------------------- Sub E() Dim i As Long Dim a() As Variant Dim j As Long j = 1 For i = 1 To Sheets("リスト1").Range("B" & Rows.Count).End(xlUp).Row 'セルにEがあるか If Sheets("リスト1").Cells(i, 2).Value Like "*E*" Then ReDim Preserve a(j) a(j) = Sheets("リスト1").Cells(i, 2).Value j = j + 1 End If Next For j = LBound(a) To UBound(a) Sheets("リスト2").Cells(j + 2, 6).Value = a(j) Next End Sub ---------------------------------------------------------------------------------
このコードに加えて、「リスト1の番号とリスト2の番号が一致する場合」という条件式と、「リスト1の属性に該当の属性が入力されていない場合、空白処理をする」という指示をしたいのです。
リスト1作成時の条件・注意点として
・番号は4桁で基本的には連番となるが、若い番号が行の最後に入る可能性がある
・属性列はA~Dまで必ずしもすべてが順番通りに入るとは限らない
・リスト1には連続で入力されるため空白セルは存在しない
以上のことが挙げられます。
最終的なリスト2の形といたしまして「リスト1の番号とリスト2の番号が一致したとき」、その番号に対して1行の表を作成したく、「該当の属性が存在しない場合」は空白処理をして、次の番号に対する表を作成する指示を出したいのです。
また、後から若い番号の属性データが入力されていた場合、若い番号の行に戻って該当する属性列に入力されるようにしたいのですが、いくら調べても対応できるコード見つけることができませんでした。
作成したい表は明確なのですが、うまく文章にすることができず、伝わりにくい箇所も多々あると思いますが、検索の仕方や利用できそうなコードがありましたらご教示いただけますと幸いです。
加えて上記の各コードの
For j = LBound(a) To UBound(a) Sheets("リスト2").Cells(j + 2, ○).Value = a(j) Next
この部分で必ずデバックが上がってしまうのですが、それについての対策や考えられるエラーの理由等もご教示いただけますと嬉しく思います。
私自身の力・経験・知識不足で長々と書き連ねてしまい、大変申し訳ございませんが、皆様のお力をお貸しいただけますと幸いです。
何卒、宜しくお願い申し上げます。
※追記1※
コードの使用につきまして、こちらにも記述させていただきます。
目的といたしましてはリスト2の作成ですので、上記のコードを使用せず作業することもできるかと思います。
ただ、誰が作業してもシンプルでわかりやすくしたかったため、ボタンを用いる方が直感的でわかりやすいのではないかと思いこの方法を取らせていただいております。
(最終的にリスト2のデータを使用する為、数式等は入らず文字列として転記する必要があったことから等号で反映させることもしたくなかったのです。)
また、属性につきましては文言は伏せさせていただいておりますが、A~Dは固定となっております。リスト2の番号は入力済みであることを前提に作業を進める予定です。
さらにAccessを使用したほうがわかりやすいのだとは思うのですが、作業環境にAccessがないため候補から除外させていただいております。
改めて、宜しくお願い致します。
※追記2※
ご回答いただき誠にありがとうございます。
コメント欄で追加で質問させていただいておりましたが、失礼だったと思います。
大変申し訳ございません。
改めて、こちらに記載させていただきます。
現在、h-okhs様、hatena19様お二人の方法を試させていただき、どちらもしっかり表を作成することに成功いたしました。
本当にありがとうございました。
以下、追加での質問となります。
属性が「1_A_○」や「2_B_○」といった文字列になっている際、「A」や「B」をキー項目として、そのセル丸ごとを転記する際は、質問にも載せさせていただいているIFから始まるコードを使用しても問題ないでしょうか?
申し訳ございませんが、この点につきましてもご教授いただけますと幸いです。
よろしくお願いいたします。
※追記3※
ご回答いただいた皆様、誠にありがとうございました。
拙い文章から私の目的をご理解いただき、なんとお礼を申し上げたらよいか…。
どの回答をBAにするかすごく迷いましたが、シンプルで分かりやすかったこと、丁寧に導いてくださったhatena19様とさせていただきました。
改めて、皆様お世話になりました。

回答4件
あなたの回答
tips
プレビュー