|
下記にも掲載しましたが、見づらくなってしまいましたのでこちらにも失礼致します。
長文失礼致します。
下記コードを掲載致しますので、大変お手数ですがコードの添削とやりたいことをするには今後どこをどう変更していったらよいかご指導をお願い致します。
過去の質問でシート1とシート2と名称を付けていましたが、わかりにくいため、マクロを設置し抽出キーを入力するものを「表」シート、読み込むデータが入力されているものを「データ」シートと表現を変更させていただきます。また、多少仕様変更となりまして過去ご回答頂いた皆さまには申し訳ございませんが、こちらの
質問内容においてご指導頂けますと助かります。
前提条件
・表シートに記載のあるC列記載のキーとデーターシートのA列記載のキーで一致させ、一致した場合にデータシートの一部を表シートのセルO列からAH列までに転記したい。
・表シートはC5セルから、C80くらいまでに抽出キーとするキーを入力出来るフォーマットで、C列からAH列まで横に伸びていますが、転記先の場所はOからAH列です。D〜N列は他のデータを入力予定ですが、抽出した後のことです。。
・表シートはセルの結合がされており、C5とC6が結合され同じようにAHまで2行づつ結合されています。
・表シートC列に記載するキーは例えば、AAAというキーとすると1件しか入れる予定はありません。結果として2件抽出されることはありますが。基本的には表シートにはAAA、BBBというようにユニークな番号を入れる予定です。(とういか、事前にAAAが複数あるか把握できないため)
・データシートは毎回データ数が変更となりますが、千件くらいの予想です。データ内には日付や金額、ブランク、0といった数値も記載されています。
・データシートの一行全てを転記するわけではないですが、恐らくA列と最右端から5列を除いて全て転記とかそういうものです。転記データにもブランクは入りますが、右端は0か金額かどちらかが入っている。
・また、データシートA列には同じキーが複数ある。1件の場合もあるし、AAAというキーが2件、3件とあることもある。恐らく最大でも4、5件かと思われます。
・データシートA列に複数同じキーとなっている場合には私の方の前段階でソートし昇順で並び変えをしてまとまっています。
質問1.表シートにキーワードをなる番号をC列に入力し、データシートから転記したいのですが、表シートC5にAAA、C7にBBBと記載して検索した際にはAAAが2件出てくるとしますと、私の記載のコードではAAAが2件あれば、O5の行へ1件、O7の行へ1件と転記されます。(セルはC5とC6が結合、右も同様に2行づつ結合され、下へ続いています。)
するとC列のC7にはBBBが記載されているのに右のO7はAAAのデータでずれてしまいます。これを、なんとか複数件検索転記する場合にはC列のBBBを下に1行ずらしてC9に入り、隣にBBBのデータを転記できないでしょうか?もし不可能であれば、抽出した2件目以降はAH列の右に追加したいのです。3件目があればさらに右へ。
質問2.上記のずらす処理が出来た場合、C7が空欄になってしまいます。複数件を転記しずらした場合にはC7にもAAAを記載できるようにできないでしょうか?例えば、上の値と同じ値を入れる等・・・。
質問3.表は日々更新して蓄積する予定です。そのため、読み込むファイルも日々更新し、異なる可能性があります。例:前日読み込んだファイルにはAAAが入っていたが今日は入っていないなど。
既存に入力してある番号(項目転記済)のものは読み込んだデータファイルに同番号があり、追加や変更があれば追記しますが、ないかまたは更新されていなければ何もせずに既存データはそのままで新規のデータのみ追加で転記していきたいです。
このようにするにはどうしたらいいでしょうか?私のコードですとAAAがC5で既存で表にあるとして、今回C7にCCCのデータを追加した場合でも書き換えてはいけないAAAの情報O5のところへ転記してしまうのです・・・。自分でそういうコードにしてしまったわけですが。
結合セルもあったりして、これらを解決する方法が全くわからず、ここ数日ずっと悩んでいます。VBAを始めて1週間ほど。本やネットで勉強しかき集めたおかしなコードかと思われますが、見て頂けますと本当に助かります。宜しくお願い致します。
Sub マッチング()
Dim 検索範囲 As Range, 該当セル As Range
Dim 検索開始行 As Long, 転記先行 As Long
Dim r As Range
転記先行 = Worksheets("表").Range("O5").Row '「転記先行」は(表)シートのO5セル以下を代入
Worksheets("表").Activate '(表)シート選択
For Each r In Worksheets("表").Range("C5:C55") '(表)シートのセルC5からC55までの列をrに代入し下記処理実行
Set 検索範囲 = Worksheets("データ").Range("A2").CurrentRegion.Columns(1) '検索範囲には(データ)シートのセルA2を含めた表のA列を代入
Set 該当セル = 検索範囲.Find(what:=r.Value, lookat:=xlWhole) '該当セルには検索範囲からrを完全一致で検索し見つかった値を代入
If Not 該当セル Is Nothing Then '該当セルが見つかった場合は
検索開始行 = 該当セル.Row '検索開始行に該当セルの番号を代入
Do
Cells(転記先行, 15).Value = 該当セル.Offset(0, 1).valuee '転記先行の15列目のセルに該当セルの1列右のセルの値を代入
Cells(転記先行, 16).Value = 該当セル.Offset(0, 2).valuee '転記先行の16列目のセルに該当セルの2列右のセルの値を代入
Cells(転記先行, 17).Value = 該当セル.Offset(0, 3).valuee '転記先行の17列目のセルに該当セルの3列右のセルの値を代入
Cells(転記先行, 18).Value = 該当セル.Offset(0, 4).valuee '転記先行の18列目のセルに該当セルの4列右のセルの値を代入
Cells(転記先行, 19).Value = 該当セル.Offset(0, 5).valuee '転記先行の19列目のセルに該当セルの5列右のセルの値を代入
以下続き
Cells(転記先行, 35).Value = 該当セル.Offset(0, 21).valuee '転記先行の35列目のセルに該当セルの21列右のセルの値を代入
転記先行 = 転記先行 + 2 '転記先行に2を加算する。表のシートが結合しているため1だとつまってしまう
Set 該当セル = 検索範囲.FindNext(after:=該当セル) '検索範囲の検索を該当セルの次のセルから再開
Loop While 該当セル.Row <> 検索開始行 '最初に検索された該当セルの行が再検索されるまで処理
End If
Next r
Set 検索範囲 = Nothing
Set 該当セル = Nothing
End Sub
|
|