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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

解決済

VBAでテーブル形式のリストからクロス形式のリストを作成したい(その際、特定の文字を含まない場合、次列のセルに移動する指示を出したい)

shibakoppe
shibakoppe

総合スコア27

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

4回答

-1評価

0クリップ

352閲覧

投稿2022/05/12 01:29

編集2022/05/12 08:13

お世話になります。
VBA及びマクロ初心者ですが、皆様のお力を貸していただきたく思います。

現在、Excelで以下のようなテーブル形式の表から別シートへクロス形式の一覧表を作成する為のマクロに取り組んでおります。

<リスト1のシート>

番号属性
1000A
1000B
1000C
1001A
1001B
1001C
1002E
1000D
1000E

------以下略------

<リスト2のシート>

番号属性1属性2属性3属性4属性5
1000ABCDE
1001ABC
1002E

------以下略------

リスト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様とさせていただきました。
改めて、皆様お世話になりました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

h-okhs

2022/05/12 02:13 編集

このネットで拾ってきたとおっしゃっているイケてないコードを修正して完成させる必要があるのか、それとも目的はリスト2の表を作ることで、このコードは使わなくてもいいのか、どちらでしょうか?
shibakoppe

2022/05/12 02:18

正直に申し上げれば使う必要性はないと感じております。 リスト1の形からリスト2の形へ変更というか転記をしたいというのが目的なので、本末転倒になってしまいますがVBAでなくても可能な作業だとは思っています。 ボタン一つで自動化するという行為が使用者問わずわかりやすいと感じたため、VBAで作業できたら…という思いで、このコードを使用してみました。
hatena19

2022/05/12 02:55

属性1はA、属性2はB・・ という対応は固定でいいのですか。 シート2の番号は入力済みですか。
shibakoppe

2022/05/12 04:03

>>hatena19様 属性につきましては固定で問題ありません。 また、シート2の番号も入力済みという前提で進めようと思っております。 シート1のリストを蓄積していき、作業が全て完了した後にシート2のリストへの転記をする予定です。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。