- ベストアンサー
EXCELマクロ VLOOKUPと列の挿入
こんにちは。 以前、他のサイトで= VLOOKUP関数を使ってコードの右横の列にマスタを読みにいった結果を表示させる=というマクロを組んだ場合、 列の挿入(私の場合column(A:A)を使う)をするのですが、 メモリを使うので、仕様を考え直したほうがよい、という アドバイスをいただきましたが、全列の挿入をしないで どうする方法があるでしょうか、教えてください。 P.S.B列全部選択という記録マクロのほうが正確で、簡単と思うのはよくないのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >記録マクロを公開すること自体、Wendy02さん他みなさんに、失礼にあたるのでは...という思いです。 そんなことはありません。こちらは、解決の糸口になる材料が多ければ多いほどよいのです。今の範囲では、こちらは想像を巡らして書いているので、本来なら、出来れば、一回で済ませられるのが、ベストなのです。 >VLOOKUP関数をB列全体に貼付け、 これは、やめたほうがよいです。Vlookup関数などは、列全体に貼り付けると、ひじょうに動きが鈍くなります。無駄も多いです。メモリに関していうなら、これは、正しいです。 >コピー&形式を選択で”値”として貼付をするという記録マクロです。 今のままでは、ご希望にそったものは出来ないとは思いますが、以下のサンプルをみていただいて、改良してみてください。Vlookup 自体を使うアイデアは、とてもよいのですが、それをマクロの中で処理することです。 Sub VLookupMacro() Dim rng As Range, myValue As Variant, i As Long With Worksheets("Sheet1") '書き込みするシート .Columns(2).Insert 'B列挿入 Set rng = Worksheets("マスタ").Columns("A:D") '検索範囲 Application.ScreenUpdating = False On Error Resume Next For i = 1 To .Range("A1", .Range("A65536").End(xlUp)).Rows.Count myValue = WorksheetFunction.VLookup(.Cells(i, 1).Value, rng, 2, 0) 'エラーが発生した時の値のクリア If Err > 0 Then Err.Clear: myValue = "" End If .Cells(i, 2).Value = myValue '値の書き込み Next i On Error GoTo 0 Application.ScreenUpdating = True Set rng = Nothing End With End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >データがあったときは、vlookup >との関係で挿入はやっぱりだめなのでしょうか? Vlookup 自体は、まったく関係ないです。 列の挿入と行の挿入では、 1/65536 と 1/256 の違いで、列の挿入で1/256 で、繰り返し行えば、データの入っている列が押し出される可能性があるということです。 おそらくは、あるレベル以上の人は、そのようなコードは、書かないに違いないと思うだけです。 コードと、そのコードの目的の具体的情報がないままでは、良い悪いはいえません。コードを公開するのが好まれないなら、後は、しばらく使ってみるだけではありませんか?
補足
Wendy02さん、すみません。 >コードを公開するのが好まれないなら、 は、無いです。 私はいつも記録マクロを使いますが、データ自体、例えば A列にコードしかなく、そのコードの対応は、シート[マ スタ]に表としてあります。 そういう場合、B列全体を挿入であけて(B列に既存のデ ータがある場合です)、B列にVLOOKUP関数で表示させま す。そのVLOOKUP関数をB列全体に貼付け、さらにコピー &形式を選択で”値”として貼付をするという記録マク ロです。 記録マクロを公開すること自体、Wendy02さん他みなさ んに、失礼にあたるのでは...という思いです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >列の挿入(私の場合column(A:A)を使う)をするのですが、メモリを使うので、 実際に、列を挿入するから「メモリを使う」でしたら、疑問に感じるのですが、列全体の挿入のロジックというのは、挿入先の右側の列に対して、エラーが発生しやすいこともあり、私もあまり関心しません。がしかし、1セルに対する挿入に関しても、エラー発生率が減るだけで結果的には同じです。 例: ActiveCell.Insert Shift:=xlToRight Column(A:A) が、メモリを使うという意味でしたら、それは誤解です。 正式にはなんと言うのかは知りませんが、セルにデータが入って、初めて、そこにメモリ負担が出てくるのであって、単に、Column(A:A)としても、特に、変化ありません。4万行でもデータが入れば、大きく違ってきます。 いずれにしても、コードを見せていただかないと、的確な回答はつかないと思います。
お礼
Wendy02さん、こんにちは。 誤解の部分ありましたです。 でも、2,000件程度の データがあったときは、vlookup との関係で挿入はやっぱりだめなのでしょうか?
お礼
ありがとうございました。 マクロを実行して、結果を先に見ることで、 Wendy02のマクロの意味をひとつひとつ理解したいと思います。 非常に勉強になると思います。 ありがとうございました。 また、わからないところがでてきたら、お尋ねします。 そのときは、よろしくお願いいたします。