EXCELでのデータ検索とセルへの値挿入

このQ&Aのポイント
  • EXCELでのデータ検索とセルへの値挿入について専門のマクロを組み立てる方法を教えてください。
  • 現在、sheet1のA列に値を検索し、sheet2のA列・B列・C列のデータを転記するマクロを組んでいますが、時間がかかりすぎています。効率的な方法はありますか?
  • EXCELマクロ初心者です。sheet1のA列の値に対応するsheet2のデータを一括して転記する方法を教えてください。
回答を見る
  • ベストアンサー

EXCELでのデータ検索とセルへの値挿入

お世話になります。EXCELマクロ初心者です。 sheet1のA列に数字、B列・C列空欄、D列に語幹、E列に語幹の意味、F列に単語名、G列に単語の意味が入っており、F列の総数はおおよそ7000程です。 sheet2のA列に数字、B列に数字または空欄、C列に数字または空欄、D列に語幹(ハイフンを含んだアルファベットの1部)、E列にD列語幹の意味が入力されています。 語幹別に、新規の単語を取得するたびに、sheet2の語幹部分をソートし、A列の数字が更新され、その後、sheet1のA列数字が更新され、A列・F列をキーとして、昇順にソートされます。 当初想定した以上にの語幹の数が増えてしまったので、その重要度を、sheet2のB列、C列に記録して、そのデータを、sheet1のB列、C列に転記せざるをえなくなっております。 現在、sheet1のA列に値について、1行目から、個別にsheet2A列を検索し、B列・C列のデータを検索し、これを転記するマクロを組んでいるのですが、1行ごとに検索するため、おおよそ、45秒もかかっています。 これを短縮する方法としては、検索した値を、配列変数のたとえば、iに、A列の同じ数字の行数を取得して、B列・C列に一括して、sheet2の数字(空欄の場合は空欄)をそのまま転記することだと思うのですが、残念ながら、自分では組み立てられません。 どなたか、ご教示いただければ幸いです。 なお、ご教示いただいた内容を単純にマクロに転記するようなことではなく、自分なりに消化できてから、再度ご連絡をさしあげたいと思いますので、ご理解いただければと思います。 お手数をおかけしますが、よろしくお願いします。

noname#130382
noname#130382

質問者が選んだベストアンサー

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.4

NO2です。 >Worksheets("sheet1").Range(Cells(1, 1), Cells(my1Lr, 4)) = st1 >これで一応動くようなのですが、やはり最終行がない場合は、動きません。 >最終行の機能を教えていただければと思います。  ⇒前回でも記載していますが、st1はマクロ内の変数なので実シートに展開しないと編集内容が   実体になりませんので必須です。(例えは変ですが、下書き文を本文に書き写すイメージ) 以下参考です。 >my1Lr = Sheets("sheet1").Range("D65536").End(xlUp).Row >my2Lr = Sheets("sheet2").Range("D65536").End(xlUp).Row  ⇒行数は「Rows.Count」を利用した方がエクセルのグレードにより行数が変わっても対応できる。 >st1 = Worksheets("sheet1").Range(Cells(1, 1), Cells(my3Lr, 4)) >With Worksheets("sheet2") >st2 = .Range(.Cells(1, 1), .Cells(my4Lr, 4)) >End With  ⇒コードの記述は統一した方が良い。   又、回答補足のコードをみているとst1に格納時は「my3Lr」、展開時は「my4Lr」やFor分のエンド   条件が主体はA列なにのD列の行数になっていたり平仄が合っていませんので整理した方が   よいと思う。

noname#130382
質問者

お礼

mu2011様 日付をまたいで、ご丁寧にありがとうございました。最後にいただいた回答で理解できました。またご指摘いただいた点も、今後のために大変参考になりました。またお世話になるかもしれませんが、よろしくお願いします。本当にありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

補足での疑問について A2:A5に1,2,3でも入れて 下記を実行してご覧。 Sub test01() x = Range("A2:A5") Range("C3:C6") = x End Sub C3:C6にそれらの値が入るだろう。 XはVARIANT型の変数で 何もデータ型を宣言してないのでVARIANT型になる。 エクセルVBA特有?の便利で、面白い機能だ。 配列のようなイメージなんだが、配列ではないようだ。 参考 http://pc.nikkeibp.co.jp/article/NPC/20070803/279065/  など。 ーー Sub test02() Dim x As Integer x = Range("A2:A5") Range("C3:C6") = x End Sub にすると形が一致しませんのエラーになる。 今はそういうものとしておくのが良かろう。将来どういう仕組みになっているのか勉強して。 ーーー しかしこの質問を読むと、頭がくらくらして判りにくい (1)実例模擬データを小数作って説明する (2)人間が手だ行でやるとし束愛の、作業ステップに沿って説明する。 (3)重点を絞って、質問文(内容)簡潔にする 余分な部分があるのではないか。 そういうことを今後の質問では留意をおねがいしますよ。

noname#130382
質問者

お礼

imogasi 様 補足への回答と、質問についてのご指摘ありがとうございます。特に、今後の質問の際には、留意します。ありがとうございました。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

NO1です。 >st1 = Worksheets("sheet1").Range("A1:G7000") >st2 = Worksheets("sheet2").Range("A1:G7000") >の部分なのですが、これは指示した範囲が全体として1つに格納されるのでしょうか、 >それとも当該範囲の個別のセルが1つずつ格納されるのでしょうか。  ⇒2次元配列で格納されています。(シートと同じ) >また、検索・転記の対象が、A列からCである場合、G列まで指示するのはなぜでしょうか。 >最後に、最終行のコード、 >Worksheets("sheet1").Range("A1:G7000") = st1 >は何故必要なのでしょうか。 >実際にこのコードをはずして実行してみたところ、何の変化もないことは確認したのですが、値の転記は、 >st1(i, 2) = st2(j, 2) 'B列 >st1(i, 3) = st2(j, 3) 'C列 >で終わっていないのでしょうか。  ⇒サンプルですので、必要な範囲で結構です。   又、上記の転記はマクロ内の変数(メモリ)のみなので最後にシートへの転記が必要です。   

noname#130382
質問者

お礼

mu2011様ありがとうございます。 何度も申し訳ありませんが、よろしくお願いします。

noname#130382
質問者

補足

mu2011様 ありがとうございます。 ご教示いただいた内容から、自分なりに、データの可変に対応したものを次のように作成してみました。不細工ですが… Dim st1, st2 As Variant Dim my1Lr, my2Lr As Integer my1Lr = Sheets("sheet1").Range("D65536").End(xlUp).Row my2Lr = Sheets("sheet2").Range("D65536").End(xlUp).Row st1 = Worksheets("sheet1").Range(Cells(1, 1), Cells(my3Lr, 4)) With Worksheets("sheet2") st2 = .Range(.Cells(1, 1), .Cells(my4Lr, 4)) End With For i = 1 To my1Lr For j = 1 To my2Lr If st1(i, 1) = st2(j, 1) Then st1(i, 2) = st2(j, 2) 'B列 st1(i, 3) = st2(j, 3) 'C列 Exit For End If Next Next Worksheets("sheet1").Range(Cells(1, 1), Cells(my1Lr, 4)) = st1 End Sub これで一応動くようなのですが、やはり最終行がない場合は、動きません。 最終行の機能を教えていただければと思います。 何度も申し訳ありません。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

シート上で更新すると画面更新等、多量になれば時間がかかります。 案1.表更新処理の前後で画面更新を停止/開始を行う。   Application.ScreenUpdating = False '画面更新停止    (更新処理)   Application.ScreenUpdating = True '画面更新開始 案2.各シートデータ範囲のデータを変数として取り込み、処理完了後にコピーする。 データは、Cells(行,列)と同様に変数(行,列)として取り扱える。    以下に配列を使用したサンプルコードです。 Dim st1, st2 As Variant st1 = Worksheets("sheet1").Range("A1:G7000") st2 = Worksheets("sheet2").Range("A1:G7000") For i = 1 To 1000 For j = 1 To 7000 If st1(i, 1) = st2(j, 1) Then st1(i, 2) = st2(j, 2) 'B列 st1(i, 3) = st2(j, 3) 'C列 Exit For End If Next Next Worksheets("sheet1").Range("A1:G7000") = st1

noname#130382
質問者

お礼

mu2011様 回答ありがとうございます。 補足質問については、現在は難しいでしょうか。

noname#130382
質問者

補足

mu2011 様 早速のご回答ありがとうございます。 試行してみたところ、処理時間は一瞬でした。 私は、参考書や記事を複数読んでも、特に配列の理解が難しいので、個別の例を確認しながら、やっと理解している段階なので、助かります。 mu2011様のサンプルコードについて補足質問させていただきたいのですが、まず、 st1 = Worksheets("sheet1").Range("A1:G7000") st2 = Worksheets("sheet2").Range("A1:G7000") の部分なのですが、これは指示した範囲が全体として1つに格納されるのでしょうか、それとも当該範囲の個別のセルが1つずつ格納されるのでしょうか。 また、検索・転記の対象が、A列からCである場合、G列まで指示するのはなぜでしょうか。 最後に、最終行のコード、 Worksheets("sheet1").Range("A1:G7000") = st1 は何故必要なのでしょうか。実際にこのコードをはずして実行してみたところ、何の変化もないことは確認したのですが、値の転記は、 st1(i, 2) = st2(j, 2) 'B列 st1(i, 3) = st2(j, 3) 'C列 で終わっていないのでしょうか。 重ね重ね申し訳ありませんが、よろしくお願いします。

関連するQ&A

  • EXCELのマクロで。。。

    シートAのセルC2の値(数字)を シートBのE、F、Gの各列のうち空いている一番左のセルで、かつ、D列に何か書いてある一番下の行のセル に転記したいです。 たとえば、シートBが図のような場合にはF28です。これが毎回、変化します。 マクロの記述を教えて下さい。よろしくお願い致します。

  • A列の表の値を別の表の該当セルに転記していく。

    新たに質問させていただきます。 Sheet2にこのような表があります。 Sheet1A列にランダムで数字が並んでいます。503、401、310 ・・・ A1"503"は、Sheet2の表のF2に入ります。同様に Sheet1A2"401"は表のH6にはります。 このようにA1をSheet2F2に転記するのに 表のI列で検索し、該当のI1を見つけD1:H1,D3:H3からF1を見つけF2に転記していくことは可能でしょうか?

  • エクセルのマクロで結合セルに値を貼り付けたい

    お世話になります。 マクロ初心者で本やネットで色々調べたのですが分からないため 教えていただけますと幸いです。 Sheet1にはB1:B3、B4:B6…と3行縦に結合された表があり、 Sheet2のA列には単独セルに商品の名前が入っております。 膨大な量のため、Sheet2のA列に入っている情報を Sheet1の縦に結合されたセルに一つずつマクロで転記したいと 考えております。 Range("B1:B100").Value = Range("A1:A100").Value のように記載すると、2個飛ばしで入力されてしまうので、 結合されている分飛ばされないで一つずつ転記したいのですが どのようにしたら良いでしょうか。

  • Excel マクロでの検索

    大量のデータ(約40000件)をDB(約3000件)から検索し該当する値を返す作業をしています。 マクロを今日初めて組んだのですが、うまく行きません。 だれか教えてください。 例:※同Sheet内での作業です。 DB(列1・2)     データ(列3・4)※ランダムに並んでます。   1  2      3     4 1 a  A      c   Cを返したい(cを1列より検索し2列の値を返す) 2 b  B      e   Eを返したい(eを1列より検索し2列の値を返す) 3 c  C      d   Dを返したい(dを1列より検索し2列の値を返す) 4 d  D      d   Dを返したい(dを1列より検索し2列の値を返す) 5 e  E      h   Hを返したい(hを1列より検索し2列の値を返す) 6 f  F      @   @が1列に無い場合は空欄でよい ・  ・ ・      ・     ・ ・  ・ ・      ・     ・ 今日、私は4列のワードを変数とし、1列より検索する方法をとりました。(Loopで組みました) Find.で組むと、不要なワードまで検索してしまう状況です。 例:aaaaで検索→aaaaaaがhitしてしまう。 同一ワードで検索する方法も試したのですが、エラーが出てしまいます。 自分なりにFindNextなども試してみましたが、無限Loopになってしまいます。 Loopを使わなくてもいいので、方法を教えてください。 本来自力で調べるべきですが、急ぎの仕事な為、ご協力ねがいます。

  • マクロ セルの値と同じシートをセルの数値印刷する

    エクセルのマクロについて教えてください。 "メイン"というシートのA列に項目、B列に枚数入力をします。 A列と同じ名前のシートをB列に記載されている数字の枚数印刷したいです。B列が0や空欄の場合は印刷しないようにしたいです。

  • 別シートの行を選択し対象列を転記するマクロ

    シート2のA~F列までデータがあります。 行数は10,000行です。(月ごとに100行くらい追加されます。) A列は項目がNO.で半角数字が連番で入力されてます。 セルA2→1 セルA3→2 セルA4→3 . . . セルA10000→9999 セルA10001→10000 という感じです。 シート1の セルI9に番号を入力すると シート2のその番号の行のB~F列の値を シート1のJ9~N9列に転記したいです。 例えば シート1のセルI9に100と入力したら、 シート2のA列が100と入力されているセルはA101ですから 101行目となります。101行目の各列の値を転記します。 ↓ シート1のセルJ9にシート2のセルB101の値を転記 シート1のセルK9にシート2のセルC101の値を転記 シート1のセルL9にシート2のセルD101の値を転記 シート1のセルM9にシート2のセルE101の値を転記 シート1のセルN9にシート2のセルF101の値を転記 シート1もシート2もセルの書式設定は標準。 B,E,F列は半角英数字の組み合わせで C,D列は半角数字のみです。 たまにF列に空白がある行があります。 B,F列は数字のみの場合もあります。 B,C,D,F列は数字のみの場合 「数値が文字列として入力されています」 となっています。 マクロで行いたいのですが記述そのものを教えてください。

  • 複数シートからのデータ検索、コピー

    シートから条件に合致するデータを検索して、別ファイルの新しいシートにそれぞれ必要なデータ部分だけをコピーしたいのですが、検索するシートも複数で、また検索条件も複数のためか、過去の質問等を見ましても良く分かりませんでした。(マクロ等は余り使ったことが無い初心者です。)そこで、どなたかお詳しい方に教えて頂ければ、と思いまして投稿致しました。 シートは”貸借対照表”と”損益計算書”の2つあります。 抽出データは4行目からなのですが(A4から)、A列:コード(数字)、B列:勘定科目(文字)、C列:繰越額(数字)、D列:借方額(数字)、E列:貸方額(数字)、F列:残高(数字)、G列:比率(%)となっております。 各シートの構成として、A列は三桁または四桁の数字なのですが、(A4から)A列が三桁の数字の行を選んで、なおかつ、D列とE列が両方とも0で無い行のB列、D列、E列の値を二つのシートそれでれで検索し、別シートにコピーしたいのです。(どちらのシートからでも構いません。A列のコードの値はシート毎ではダブらないので、両方で抽出されたB、D、E列の値が列記できれば良いです。) ただ、2つのシートの列数は決まっておらず、一方のシートの抽出データともう一方のシートの抽出データがダブってコピーされない様に、 したいな、とは思っております。 桁数での検索はLEN関数があるらしいのですが、複数のシートが対象となっており、マクロという機能を使った方が良いのでしょうか? 当方も初心者ゆえ、分かりやすく教えて頂ける方、よろしくお願い致します。

  • エクセルで数字の下1桁を見て並び替える

    エクセルで下記の様な数字が並んでいます。 A列の下1桁の数字は上から順に増えていて、ある数字で1に戻りまた増えています。 その数字は毎回同じではなく、6までの場合もあれば10までの場合もあります。 下記の例では上から6行、次は4行、次は7行と下1桁の数字によってグループ分け出来ますよね? それで上から6行目までのB列の値(462~530)をコピーしてSheet2のA1から横方向に並べます。 その次は7行目から10行目までのB列の値(356~487)をコピーしてSheet2のA2から横方向に並べます。 その次も同じように並べます。 B列が空欄の場合もありますが、その場合はそのままSheet2にも空欄のセルを作ります。 1グループ全部のB列が空欄でもそのままSheet2に空欄の行を作ります。 この動作をマクロで出来る式を教えて頂けないでしょうか? A列          B列 0213240101     462 0213240102    387 0213240103    556 0213240104    585 0213240105    536 0213240106    530 0213240201    356 0213240202    632 0213240203    486 0213240204    487 0213240301    586 0213240302    670 0213240303    619 0213240304 0213240305    645 0213240306    487 0213240307    651 0213240401 0213240402 0213240403 0213240501    455 0213240502    623 0213240503    411 Sheet2 A列   B列    C列   D列    E列    F列   G列 462    387    556    585    536    530 356    632    486    487 586    670    619            645    487    651    455    623    411

  • 検索・抽出・貼り付けのマクロ

    シート1のデータをオートフィルターかけて検索し抽出したものを、A列、B列、D列、F列をシート2の、A列、B列、C列、D列に貼り付けるマクロを教えて頂けますでしょうか? 一週間位悩んでいます。

  • エクセル”検索条件はセル内のあいまい値”

    どうにも検討がつかず調べても対応したものができないのでお力添え願います。 D列に”A”と入力し、C列へ「D列のセル値が含まれた場合C値からB値をマイナスし それ以外は上のセル値を反映させる」としたいのですがどうするのがいいでしょうか。 直接値を指定してあいまい検索は『=IF(COUNTIF($A2,"*A*"),C1-$B2,C1)』でできたのですが この "*A*" 部分を”B”というときもあるのでD列のセル値であいまい検索としたいです。 A列の値は以下のように”A”の後ろに複数の数字がつくことがあります。 A列 A2 A3 B4 B3 B4 A2 A4

専門家に質問してみよう