• ベストアンサー

EXCEL で検索、更新したい

EXCEL でわからない箇所があり質問します。 前提条件 Sheet1 A列:名前 B列:年月 C列:値 データは、名前と年月で一意になるデータシートがあり マスターデータとして全データが登録されている Sheet2 A列:名前 B列:年月 C列:値 ある条件でとあるデータベースから抽出した名前と年月の一覧がある この段階で値のセルには何も入っていない やりたい事 (1)この状態でマクロを実行し、A列、B列を条件に該当する行から    C列を抽出しSheet2 にセット (2)Sheet2のC列の値を変更後、マクロの実行で    A列、B列の条件を元該当する行から、Sheet1の C列に値を更新 (3)もし、Sheet2のA列、B列の条件に該当しない行がある場合、    Sheet1に行追加しC列を格納 という事をしたいと考えています。 Sheet1 の全ての行をマクロでループさせて A列、B列をif分で比較し行を取得し、Sheet2 に張る場合、 遅くなるのであまりやりたくないと思っています Find 関数も考えたのですが、ヘルプを見る限り、条件が1つしか指定でき ないように思えるのですが、複数列の条件を指定できる Find 関数 あるいは、類似の関数とあかがあるのなら教えてください 最悪は、EXCEL ADO で、自分自身をSQLで抽出、Update、Insert を行う 事も考えていますが、 EXCELのセル内の式で、INDEX関数やDGET関数で簡単に抽出できるのに (ただ、値を変更するので式はかけないけど・・・) わざわざ、ADOでプログラムを組むのもどうなんだろうと疑問に思ってます。

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

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

マスタデータのエクセルのシートSheet1の空き列に、 氏名(8桁程度の固定桁数)+年月(4桁または6桁固定) の(検索用)修正キーを作ります。 プログラムかまたはエクセル関数で作る。 両者文字列を&で結合する。 ー 短い氏名でも年月は左に詰めないこと (例)泉△一郎△△△200712のように 1月は01にする方式とする。 これで>名前と年月で一意になる、らしいのでキーの重複行は無いはず。 ーー これでSheet2の氏名+年月の条件データから、上記要領で修正キーをプログラムでつくり、Findメソッドの引数として使う。 (FindNextはありえないということだが、それでよいか。) ーー 見つかった行の必要な列(項目)のデータをSheet2の所定の列に セット。 並び順は影響しない。Sheet1のデータが追加されたとき、最下行に追加なら、前もって関数で、修正キーを作れるよう備えておくことができる。 ーー あとはMSクエリなどアクセス利用に持ち込むか。 もともとエクセルでやるのは無理がありそうです。

nak777r
質問者

お礼

回答ありがとうございます こちらも、条件となるセルの内容を足してキーを作成する方法ですね 私は思いつきもしなかったですが、、、ひょっとして定番なのでしょうか、グーグル先生には教えてもらえなかったのですが・・・ 早速明日にでも試してみたいと思います。 ありがとうございました

その他の回答 (4)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.5

VBAで処理するなら、例えば こんな感じで如何でしょうか。 > B列:年月 ということで、日にち が無いのでどういう形式になっているのか不明ですので ひょっとすると変更を要するかも知れません。 取敢えず、文字列の "200712" とか 数値の 200712 とか 日付形式の書式 yyyy/mm の場合で 動作するかと思います。 Sub GetValue() Dim Rng As Range Dim FRng As Range Dim Fst As String Dim Rw As Long Worksheets("Sheet2").Activate Rw = Cells(Cells.Rows.Count, 1).End(xlUp).Row Range("C2:C" & Rw).ClearContents With Worksheets("Sheet1")   For Each Rng In Range("A2:A" & Rw)     If Not IsEmpty(Rng) Then       Set FRng = .Range("A:A").Find(Rng.Value, lookat:=xlWhole)       If Not FRng Is Nothing Then         Fst = FRng.Address         Do           If Rng.Offset(, 1).Value = FRng.Offset(, 1).Value Then _             Rng.Offset(, 2).Value = FRng.Offset(, 2).Value           Set FRng = .Range("A:A").FindNext(FRng)         Loop Until FRng Is Nothing Or FRng.Address = Fst       End If     End If   Next End With Set FRng = Nothing End Sub 以上は(1)についてですが、(2)(3)については、ちょっと必要性が分りません。 (2)の「Sheet1の C列に値を更新」については、今 参照したばかりなので値は同じ筈。 (3)の「該当しない行がある場合、Sheet1に行追加しC列を格納」については、 該当しなければ、C列は空白な筈 それを格納とは? 解釈が違っていたらごめんなさい。

nak777r
質問者

お礼

回答ありがとうございます EXCELは、会社にあるので、明日にでもまた試してみたいと思います。 (2)(3)は、マクロで、Sheet1からSheet2に取り出したあと、 Sheet2の方の値を編集した後マクロで、編集した値をSheet1に 反映させたい、 また、Sheet2の名前と年月で、Sheet1に無い場合は追加したい というものでした。 が、何とかなりそうです ありがとうございました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

>(1)この状態でマクロを実行し・・・ とありますが、VBAで処理して良ければ、Find メソッド と FindNext メソッドを使うと良いでしょう。 双方をVBAのヘルプで調べて「使用例」を参考にすれば、ADOとか言っている方には比較的簡単な コードで出来ると思います。 また、ワークシート関数だけで、処理したい ということですと、例えば、Sheet1のD列を作業列とし、 セルD2に、B列の形式が文字列の場合は、=A2&B2 、日付形式の場合は、=A2&TEXT(B2,"yyyymm") を 設定し、下へコピーし、これをSheet2側で同じ方法でAとBを結合したものを検索値として、 VlookUp関数で検索し、C列を参照すれば良いでしょう。

nak777r
質問者

お礼

回答ありがとうございます なるほど、A列+B列の検索キーをD列に作るという考え方 は思いつきませんでした。 それであれば、Find関数はD列だけで住むので簡単ですね ありがとうございました。

noname#79209
noname#79209
回答No.2

ご要望の事柄は、エクセルの分野ではないように思えます。 むしろ、アクセス向きの仕事といえます。 唯一、エクセルらしい仕事は、数値の修正ですが、 これとて、アクセスのデータシート表示で可能です。 多分Sheet2は、毎回外部から取り込むのでしょうから、Sheet2にマクロを置く訳けにもいきませんし、 Sheet2の「値」を編集するので、数式を置く訳にもいきません。 まして、「全ての行をマクロでループさせるのは、遅くなるのであまりやりたくない」 ということなので、 回答者とすれば「どうせえちうんじゃ!」と言いたくなります。 となると、やはりアクセスの更新クエリと追加けりを使う方が良い思います。 「だって、アクセス持ってないモン。アクセス高いんモン」と言われたら、 それまでですか...

nak777r
質問者

お礼

回答ありがとうございます 実際は、この部分からさらに続きがありまして 最終的なものが、指定レイアウトに印字 そのレイアウトは既にEXCELにある状態なのです 基幹のデーターベースに無い1つのフィールドの為だけに アクセスを使用するのも馬鹿らしいので EXCELにデータのシートを持たせたいだけなのです。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>Sheet1 の全ての行をマクロでループさせて >A列、B列をif分で比較し行を取得し、Sheet2 に張る場合、 >遅くなるのであまりやりたくないと思っています どの位のデータ数(行数)なのでしょう?

nak777r
質問者

お礼

データーは、月に30~100件ずつ増えていきます 1年位は持ちたいですが、基本は、私が重いと感じたら 手作業で古い年月から削除する予定です

関連するQ&A

  • エクセル データ抽出について

    (データ)    A B C 1  I あ 20 2  II い 30  3  III う 10 4  IV あ 10 5  V い 20  6  VI う 30 したい事(1) A列のうちいずれかの項目を入力すると、B列の該当値を抽出 したい事(2) (1)のB列該当値が検索一行目で抽出されたら、その値からC列の値を抽出したい 困っていること・・・B列に全く同じ名前の項目があるため、抽出すると 先に来る値が飛んできてしまう 例:IVを入れると「あ」が自動で抽出され、その「あ」でさらに「10」を抽出したいのに、先にあるC1の「20」が飛んできてしまう。 それぞれ、(1)(2)にどのような関数を入れると、抽出したい値が出てくるでしょうか?

  • エクセル関数

    二つの条件から抽出する関数INDEXとMATCHをつかって作ってみたのですが行と列からの抽出ではなく二つの列からの抽出を行いたいと思います。 シート1 (データが既に入っております。)    A   B   C 1 \100 a123 tana 2 \200 h456 taka 3 \120 k789 yogi 4 \250 b456 ume シート2    A   B   C 1  k789 yogi シート2のC列に¥120と抽出する関数をご教授ください。 宜しくお願いいたします。

  • excelの複数シートを検索対象にして重複行を抽出する方法

    ある値が重複する行を抽出したいのですが 抽出元データが600,000行近くあり、1sheetに入らず9シート程に分けました。 countifを使おうとしたのですが検索範囲に複数シート指定が出来ず(3D-参照の対象関数ではないようです)、 =COUNTIF('sheet1:sheet9'!$C:$C,C1)としてみたのですが、重複行があっても全て#VALUE!となってしまうので機能できていないようです。 具体的には sheet1~8に下記のようなデータがあり、C列が重複する行を抽出したい。 A列:id、B列:名前、C列:メアド、D列:xx 宜しくお願い致します。

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • EXCELでの検索マクロを作りたいのですが

    マクロの初心者です。氏名の検索マクロを作成したいのですが分かりません。 A列:名前 B列:郵便番号 C列:住所 と 名前等のデータを(ランダムに)入力したシート1を作成し、 シート2にシート1の「A列:名前」から性(たとえば青木)で検索して検索ボタン(マクロボタン)を押して該当データを表示させるようにしたいのですが。

  • Excelでのデータ抽出

    Excelで外部結合風のデータ抽出を教えてください。 シートAとシートBに表形式のデータがあり、 シートAのA列の値とシートBのA列の値が一致するシートBの 行を抽出するのが目的です。 具体的には次のような感じです。 シートA         シートB ----------------  ---------------- A列 | B列 | C列     A列 | B列 | C列 ----------------  ---------------- 2  | 2B  | 2C      1  | 1BB | 1CC ----------------  ---------------- 4  | 4B  | 4C      2  | 2BB | 2CC ----------------  ---------------- 6  | 6B  | 6C      3  | 3BB | 3CC ----------------  ---------------- ↓ シートB ---------------- A列 | B列 | C列 ---------------- 2  | 2BB | 2CC ---------------- 以下以外の方法がありましたら教えてください。 1)アクセスに両シートのデータを取り込み、2つのテーブルを外部結合で連結させる。 2)マクロで二重ループをつくり、A列が一致した行を取り出す。 よろしくお願いします。

  • VLOOKUPの検索範囲について

    エクセルの関数で質問です。 Sheet1で  A B C      1  1 1       2  1 5      3  2 1      4  2 3 というデータがありSheet2に        A B       1  1 1       2  1 2      3  2 1      4  2 2      5  3 1 というデータがあります。 Sheet1のA1、B1やA2、B2と同様の並びをした行がSheet2にあるかどうか調べたいのですが、関数がわかりません。ちなみにSheet1のCの列に関数を入力したいと思ってます。 VLOOKUPで列Aの条件を満たし、列Bの条件を満たすものと言う検索条件してもうまくいきません。 教えてください。よろしくお願いします。

  • Excelでの文字列抽出

    Excelで文字列の抽出とそれを並べる方法を教えてください。 関数だけを用いて実現できるのか、マクロを使わなければできないのかも分かりません。 この関数をこの様に使えばよいというのを教えていただけると幸いです。 やりたいことは、下記条件で、シート2のB列にシート1のG列~P列までに登録されている担当者名に該当するB列の店名を4店まで抽出したいのです。 分かりづらくて申し訳ございませんが、よろしくお願い致します。 ------------------------ シートが2枚(シート1/シート2)あります。 シート1  B列は4行毎に結合されており、店名が登録されています。  G列~P列までは1行目は担当者名、2,3,4行目は補足情報が登録されています。  シート2  A列に担当者名が入っています。(4行毎に結合しています)  B列にA列の担当者名に該当する、シート1の店名を4店まで登録したい。

  • エクセルでの列と列の比較、重複データ個数抽出

    すいません。どなたか教えてください。 今、エクセル2003を使用しているのですが、ある条件でデータの個数が抽出出来ません。 お知恵をお貸しください。   A列 B列 1 あ   あ 2 い   う 3 う    い 4 え    5 お   か A列とB列を比べると、「あ、い、う」の3つのデータが重複しています。 そこで、一つのセルで3個とい値を返したいです。 条件として、 ・計算用のシートや別セルを使わずに、例えば、C1などの1つのセルの中で関数を使用して個数を出したいです。 ・できたらマクロも使用しないでやりたいです。 ・数字ではなく、文字列の比較で、空白行もあります。 やはり、列同士の比較は一つのセルの中でやることは不可能なのでしょうか? どなたかよろしくお願いいたします。

  • Excel2007 複数条件での検索

    Excel2007で複数条件のデータの抽出について教えて下さい。 現在、シートAにデータが入力され、シートBにデータの抽出を行いたいと思います。 シートAの内容は以下の通りです(アルファベットと数字はセルの場所です): 1行目: 項目欄 2行目以下: データ詳細 1行目 A1 「日付」 B1「名前」 C1「出社状況」 2行目以下 A2 12/01  B2 山田  C2 出社 A3 12/01  B3 佐藤  C3 早退 A4 12/01  B4 木村  C4 出社 A5 12/02  B5 木村  C5 早退 A6 12/02  B6 山田  C6 遅刻 A7 12/02  B7 佐藤  C7 遅刻 ・・・・・ A列の日付は昇順ですが、B列の人名はランダムに入力されています。 また、日付によっては途中入退社する人もいるので、12/01に名前がなくても、 12/10から名前が入力されている場合(あるいはその逆)もありえます。 シートBは以下の通りです: 1行目 名前 A列:日付 B1 木村 C1 山田 D1 佐藤 ・・・ A2 12/01 A3 12/02 このシートBの B2に シートAから 「木村の12/01の出社状況」(つまりC4)に値するデータを 自動的に抽出するような関数を入力したいのですが、どのようにすればよいのでしょうか? (このB2セルの式をB2:D3に入力していきたいので、絶対値を指定することになると思いますが・・・) IndexやらMatchやらLookupやらを色々試してみたのですが、どうも上手くいきません。 どなたかアドバイスをお願いいたします。

専門家に質問してみよう