Excel2010における検索&置換関数についてのご教授

このQ&Aのポイント
  • Excel2010を使用している方に向けて、データの検索&置換関数について教えていただきたいです。具体的には、アンダーバーで区切られた文字列を含むセル内のワードを別のデータの列と照合し、対応するID値に置換する方法について知りたいです。
  • 質問者はExcel2010の使用者で、アンダーバーで区切られた文字列セル(最大30ほど)が1万件あります。また、別のデータには約300件の項目名とID値があります。質問者はデータ(1)の文字列内に含まれるワードがデータ(2)の項目名と一致する場合、対応するID値で文字列を置換したいと考えています。
  • 質問者はExcel2010を使用しており、アンダーバーで区切られた文字列セルと別のデータの項目名とID値を照合し、文字列を置換したいと考えています。質問者はこの処理に関して困っており、締切りが迫っているため、助けを求めています。
回答を見る
  • ベストアンサー

検索&置換関数についてご教授ください!!

Excel2010使用です。エクセルマスターの方々下記値を返す関数をご教授ください!! (※マクロではなく関数にて処理したいです) 【データ(1)】 A列 1行目:アップル_オレンジ_バナナ_レモン 2行目:オレンジ_レモン_アップル_バナナ ・ ・ ・ というようなアンダーバー区切りの文字列セル(最大30ほど)が10,000件あります。 別データの【データ(2)】 A列(項目名)   B列(ID値) アップル        1 オレンジ        2 バナナ         15 レモン        123 ・ ・ ・ こちらは300件ほどのデータでID値は1~3ケタです。 行いたい処理は、「データ(1)の文字列内に含まれるワードがデータ(2)のA列と同じ場合 データ(2)のB列(ID値)を返して 「1_2_15_123」 「2_123_1_15」 と置換したいです。 締切り間近で困っております。どうかお助けください。   

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 今仮に、Sheet1に【データ(1)】があり、Sheet2に【データ(2)】があるものとします。  そして、Sheet2においては、A1セルには「項目名」、B1セルには「ID値」という具合に、1行目には項目名が入力されていて、実際のデータは2行目以下に入力されているものとします。  又、置換後の文字列はSheet1のB列に表示させるものとします。  又、Sheet3を作業用シートとして使用するものとします。  まず、Sheet3のA1セルに次の関数を入力して下さい。 =IF(AND(ISNUMBER(FIND("_"&INDEX(Sheet2!$A:$A,COLUMNS($A:A)+ROW(Sheet2!$A$1))&"_","_"&INDEX(Sheet1!$A:$A,ROW())&"_")),INDEX(Sheet2!$A:$A,COLUMNS($A:A)+ROW(Sheet2!$A$1))<>"",INDEX(Sheet2!$B:$B,COLUMNS($A:A)+ROW(Sheet2!$B$1))<>""),"_"&INDEX(Sheet2!$B:$B,COLUMNS($A:A)+ROW(Sheet2!$B$1)),"")&B1  次に、Sheet3のA1セルをコピーして、Sheet3のA1セルよりも右側にあるセル範囲に対して、貼り付け先のセル範囲の列数が、Sheet2の表の行数を十分に上回る列数となる様に貼り付けて下さい。  次に、Sheet3の1行目全体をコピーして、Sheet3の2行目以下に(Sheet1の行数を上回るのに十分な行数となる様に)貼り付けて下さい。  次に、Sheet1のB1セルに次の関数を入力して下さい。 =REPLACE(INDEX(Sheet3!$A:$A,ROW())&"",1,1,)  次に、Sheet1のB1セルをコピーして、Sheet1のB2以下に貼り付けて下さい。  以上です。

ocha922
質問者

お礼

>kagakusuki様 ご回答有難うございます! やはり関数で処理しようとすると難解な式になるのですね。。。 でも理解はできました。置換処理もこちらの方法で上手くいきましたので データ作成が間に合いそうです。 本当にありがとうございました!!

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 回答No.2です。  申し訳御座いません、御質問の内容を少々勘違いをしておりました。  回答No.2の方法では、単に元の文字列中に、データ(2)に該当する文字列が含まれていた場合に、データ(2)の該当するIDを、データ(2)の表の上に入力されているものから順番に並べて表示させる様にしてしまっております。  従いまして、例えば「オレンジ_レモン_アップル_バナナ」の場合には、「2_123_1_15」とはならずに、「1_2_15_123」となってしまいます。  ですから、正しくはSheet3のA1セルに入力する関数を次のものと差し換えて下さい。(Sheet1のB1セルに入力する関数は、そののまま同じもので構いません) =IF(COLUMNS($A:A)>LEN(INDEX(Sheet1!$A:$A,ROW()))-LEN(SUBSTITUTE(INDEX(Sheet1!$A:$A,ROW()),"_",))+(INDEX(Sheet1!$A:$A,ROW())<>""),"","_"&IF(COUNTIF(Sheet2!$A$2:$A$999,MID(INDEX(Sheet1!$A:$A,ROW()),FIND(CHAR(1),SUBSTITUTE("_"&INDEX(Sheet1!$A:$A,ROW()),"_",CHAR(1),COLUMNS($A:A))),FIND(CHAR(1),SUBSTITUTE(INDEX(Sheet1!$A:$A,ROW())&"_","_",CHAR(1),COLUMNS($A:A)))-FIND(CHAR(1),SUBSTITUTE("_"&INDEX(Sheet1!$A:$A,ROW()),"_",CHAR(1),COLUMNS($A:A))))),VLOOKUP(MID(INDEX(Sheet1!$A:$A,ROW()),FIND(CHAR(1),SUBSTITUTE("_"&INDEX(Sheet1!$A:$A,ROW()),"_",CHAR(1),COLUMNS($A:A))),FIND(CHAR(1),SUBSTITUTE(INDEX(Sheet1!$A:$A,ROW())&"_","_",CHAR(1),COLUMNS($A:A)))-FIND(CHAR(1),SUBSTITUTE("_"&INDEX(Sheet1!$A:$A,ROW()),"_",CHAR(1),COLUMNS($A:A)))),Sheet2!$A$2:$B$9,2,FALSE)&"","《ID無し》"))&B1

ocha922
質問者

お礼

>kagakusuki様 ご返答が遅くなり申し訳ございません。 追加のご回答有難うございます。 承知しました。大変に助かりました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! >(※マクロではなく関数にて処理したいです) とありますが、 かなりの難題だと思います。 理由として (1)区切り位置で区切っても行によってデータ数がバラバラである。 (2)関数で行う場合は一気に!という訳にはいかないと思いますので、作業用の別Sheetを使用する必要がありそう。 (3)仮に関数で出来たとしても長々とした関数になると思います。 ご自身で数式を訂正しようとしてもどこを訂正してよいかわからなくなる。 (4)データが10000件ある。 以上のコトを考慮するとマクロ向きの質問だと思います。 (関数で簡単にできる方法があればごめんなさい。) 差し迫っていらっしゃるようなので、とりあえず結果だけお望みであれば VBAになってしまいますが、コードの一例を載せておきます。 ↓の画像のように【データ1】は左側のSheet1にあり、【データ2】は右側のSheet2のような配置だとします。 Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sheet1のデータは1行目からあるとします。 Sub test() 'この行から Dim i As Long Dim k As Long Dim m As Long Dim buf As String Dim myArray As Variant Dim wS1 As Worksheet Dim wS2 As Worksheet Set wS1 = Worksheets("Sheet1") '←「Sheet1」は実際のSheet名に! Set wS2 = Worksheets("Sheet2") '←「Sheet2」も実際のSheet名に! Application.ScreenUpdating = False On Error Resume Next For i = 1 To wS1.Cells(Rows.Count, 1).End(xlUp).Row If InStr(wS1.Cells(i, 1), "_") > 0 Then myArray = Split(Cells(i, 1), "_") buf = "" For k = 0 To UBound(myArray) m = WorksheetFunction.Match(myArray(k), wS2.Columns(1), False) buf = buf & wS2.Cells(m, 2) & "_" Next k wS1.Cells(i, 2) = Left(buf, Len(buf) - 1) Else wS1.Cells(i, 2) = WorksheetFunction.VLookup(wS1.Cells(i, 1), wS2.Columns("A:B"), 2, False) End If Next i wS1.Columns(2).AutoFit Application.ScreenUpdating = True MsgBox "処理が完了しました。" End Sub 'この行まで ※ お望みの方法ではないと思いますが、 この後、関数での回答も何通りか出てくるかと思います。 当面の結果だけをご希望であれば 参考にしてみてください。m(_ _)m

ocha922
質問者

お礼

>tom04様 早急にご回答いただきありがとうございます!! マクロは詳しくないので長文になっても関数でなんとかならないかと思ったのですが やはり無理がありますよね。。 いただいたコードを使用してマクロ実行してみたところ、上手くいきました! ご丁寧に有難うございます!!大変助かりますm(__)m 関数についての回答をもう少しだけ待ってみますが、マクロの方が良さそうであれば こちらで処理させていただきます。

関連するQ&A

  • エクセルの関数(論理式)

    A1にりんご、B1にapple A2にみかん、B2にorange A3にバナナ、B3にbanana と入力されています。 D1にりんごジュース D2にりんごゼリー D3にりんご と入力されています。 D行に”りんご”を含むセルがある場合は、その真横のE行のセルに すべてappleと表示させるには、E行にどのような関数を入力すればよいですか? 数式内に文字列("*りんご*")は使わずに、セル参照だけで関数を作りたいと思っています。 どなたか教えてください。 宜しくお願い致します。

  • Excel 関数 照合した結果がどこにあるのか表示したいのですが

    照合したいデータがあります。 A列とB列のセルを照合の結果、B列のセルがA列のどこにあるか、C列に行番号を表示したいのですが。 どのような関数がいいのか教えてください。よろしくお願いします。   A列   B列   C列 1 リンゴ みかん  2 2 みかん いちご  4 3 バナナ レモン  6 4 いちご メロン  5 5 メロン ぶどう  × 6 レモン

  • 行を返す関数

    CSVファイル等で複数行にわたって(約500件程度)データがあります。 ある文字列を含む行を返す関数が知りたいです。 フォーム等からK047B1という文字列が入力された場合、 ・・・・ K047B1,少年A,北海道,・・・ K032D2,少年B,沖縄,・・・ ・・・・ というデータ群のファイルの K047B1の行を返す関数です。 関数が無い場合、簡単な例で回答を頂けると幸いです。 ちなみに データ群の最初の文字列は重複しない番号で、 数字と英語が混じってます。

    • ベストアンサー
    • Perl
  • エクセル関数の検索について

    エクセルの関数についてご教授下さい。 以下のように文字列が記入されています。 (列A) りんご a b c (w) (k) ! みかん u b c (w) (k) ! ○”りんご”の行から”!”の行までを検索して、文字列”a”があるかを確認したい ○”みかん”の行から”!”の行までを検索して、文字列”a”があるかを確認したい ○()で記載している文字列は場合によって記入されているため、毎回同じ行数ではない このような条件がある時に、関数で要件を満たす事はできますでしょうか? イメージ的には、以下のようにできればと思ってます。 1.A列全体から”りんご”を検索 2.”りんご”行から下の”!”までの間で”a”があるかを確認 3.A列全体から”みかん”を検索 4.”みかん”行から下の”!”までの間で”a”があるかを確認 もしくは 1.A列全体から”りんご”を検索 2.”りんご”行から下で、”a”があるかを確認 3.A列全体から”みかん”を検索 4.”みかん”行から下で、”a”があるかを確認 このような感じで作れますでしょうか? よろしくお願いいたします。

  • ★関数について教えてください(追加のお願いです)

    先ほどもこちらで質問をさせていただいたものです。m(_ _ )m  <質問★エクセル関数に詳しい方、よろしくお願いします>にて・・・  <回答していただいた関数>    =INDEX(Sheet2!$C$1:C$10,MATCH(2,MMULT(ISNUMBER(FIND(A1:B1,Sheet2!$A$1:$B$10))*1,      {1;1}),0)) 上記の関数を教えていただき、無事に解決をいたしました。 こちらの質問掲示板で初めて投稿させていただきましたが、 とても早くご回答を頂き本当にありがとうございます。 ********************************************************************************* 追加のお願いなのですが・・・ 今度は、<シート1>のb列の名前も複雑になった場合、★c列を抽出することは可能でしょうか? ********************************************************************************* <シート1>            <シート2 データ> a列  b列      ★c列    a列   b列     c列 101  キウイA   #N/A    101  甘いキウイ 北海道 201  キウイB   #N/A    101  甘いばなな 北海道 101  ばななA   #N/A    101  オレンジ   北海道 201  ばななB   #N/A    101  いちご小   北海道 101  オレンジ   #N/A    101  メロン小   北海道 201  オレンジ   #N/A    201  黄色キウイ 沖縄県 101  いちご     #N/A    201  ばなな小  沖縄県 201  いちご     #N/A    201  オレンジ大 沖縄県 101  メロンA    #N/A    201  いちご大  沖縄県 201  メロンB    #N/A    201  メロン大   沖縄県 また、関数に詳しい方がおられましたら、どうかご教示お願いいたします。 m(_ _)m

  • VBAでSUMIF関数を繰り返す

    VBA初心者です。よろしくお願いします。 Book1のSheet1のA2の値を検索条件とし、Book2のsheet1のA列を検索し、条件に合った行のC列の合計値を取得するとします。出力先はBOOK1のA2と同じ行、C2です。 これだけであれば、sumif関数で処理できるのですが、 Book1のA列の最終行までこの処理を繰り返さなければなりません。 また、毎月、Book1,2ともに最終行が変化します。 上記を簡単に書くと以下になります。 ■Book1のsheet1    A   B   C 1  101  リンゴ (ここにBook2の合計値を出力したい) 2  202  レモン (ここにBook2の合計値を出力したい) 3  510   柿   (ここにBook2の合計値を出力したい) ■Book2のsheet1    A   B    C 1  202  レモン  10 2  202  レモン  30 3  101  リンゴ  200 4  707  ブドウ  50 5  101  リンゴ  70 6  510   柿   100 上記処理をsumif関数、forを使って作成してますが、どうもうまくいきません。 申し訳ございませんがよろしくお願いします。 環境は、Windows7、Office2010 です。

  • 文字列の置換えがうまくいきません

    A  B  C   1 *  11  11 2 *  12  12 3     13 4 *  14  13 5     15 6 *  16  14 7 *  17  15 上記のように B列の文字列を、A列の*がある行に対応するようにC列に並べ替えたいです。A列に*が無い行はそのC列の同じ行のセルは空けておきたいです。 A列の*の配置、B列の文字列は時々で変わります。 どのような関数・方法を用いれば上記のようなことができるでしょうか。 よろしくお願いします。

  • 【エクセル】リストと一致するデータを抽出し、文字に色をつけることは可能でしょうか?

    エクセルで作成したファイルの【シート1:表】に様々なデータを打ち込んでおり、【シート2:リスト】にはリスト一覧を入れています。 シート1の表で、リストと該当する文字列だけに色をつけることは可能でしょうか。表はこのような感じです。 【表】   A列    B列 1 りんご   apple 2 りんごを食べる eat an apple 3 みかん     orange 4 みかんを買う  get an orange 【リスト】   A列       B列 1 りんご     apple 2 みかん     orange このような表なのですが、例えば、1行目、3行目はリストと同じなので赤い文字で表示し、A2のセルの「りんごを食べる」の「りんご」とB2セルの「eat an apple」の「apple」、またA4セルの「みかんを買う」の「みかん」と「get an orange」の「orange」の文字列だけを赤字にするようなことは可能でしょうか。 少量のデータなら手作業で変更できるのですが、データが大量にあるため手作業では追いつかず困っています。どなたかご存知の方がいらっしゃいましたら、よろしくお願いいたします。

  • EXELの関数を使った検索方法

    A1にあるセルのデータと同じものを、列Bの中から探し出す。 ↓ 列Bのn行目で検索がヒットすれば列Cのn行のデータ(要するに横の値)を列Dの上から順に書き込んでいく。 ↓ これをA1~Axまで繰り返したいのですが、何か良い方法ございませんか?できれば関数を使って一気に終わらせたいです。 わかりにくければ補足します。 よろしくお願いします。

  • エクセル 複数行にまたがっているデーターを一つの行にまとめたい

          A列  B列   C列 1行目  佐藤 北海道 りんご 2行目  佐藤 北海道 ばなな   3行目 伊藤  東京  いちご 4行目  伊藤  東京  ばなな  上記のようなデーターがあります。これを2行目と4行目を削除し下記のようにしたいのですが       A列  B列      C列 1行目  佐藤 北海道  りんごばなな 2行目  伊藤  東京   いちごばなな A列とB列のデーターが同じでC列のデータが異なる場合、上記のように一行にまとめたいのです。関数やVBAで上記の処理を出来る方法がありますでしょうか。