• ベストアンサー

Excelで、複数の文字列を検索し、該当するものがあれば一気に置換したい

Excelで困っています(>_<) 今、A列に観光地のデータがあります。 <A列> 大理石村ロックハート城 善光寺 東京ドイツ村 護国寺 東武ワールドスクエア 金閣寺 レオマワールド 日光東照宮 スペースワールド 平等院鳳凰堂 ハウステンボス 首里城 宮崎シーガイア B列のデータには、県名も記載されたテーマパークのデータがあります。 <B列> 大理石村ロックハート城(群馬県) 東京ドイツ村(千葉県) 東武ワールドスクエア(栃木県) レオマワールド(香川県) スペースワールド(福岡県) ハウステンボス(長崎県) 宮崎シーガイア(宮崎県) A列には数千にも及ぶ観光地のデータがあり、B列には、県名込みの、テーマパークデータのみが入っています。 この状態から、A列にあるテーマパークのデータ全てに、B列と同じように、県名を加えたいのですが…とりあえず私は、B列から <C列> 大理石村ロックハート城 東京ドイツ村 東武ワールドスクエア レオマワールド スペースワールド ハウステンボス 宮崎シーガイア C列(県名が入力されていないテーマパークのデータ全て)を作成し、「A列の中に、C列のデータに該当する文字列があれば、全てB列の文字列に置換する」というやり方でなんとかしようと思い、substitute関数かな?等と考えたり、いろいろ試行錯誤をしてみたのですが、全然うまく置換できません(ToT) 皆様のお知恵をお借りしたい次第です。 よろしくお願いします<m(__)m>

  • dj-s
  • お礼率81% (228/280)

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.6

#4です #4のお礼読みました For文ですが、 >大量のデータを簡単に指定できる? ちょっと違うかな、リンク先にもあるように 同じ処理を繰り返す時に使用する と言う方が理解しやすいと思います >終端セルを参照する(Endプロパティ)↓ >「xlUp」を「xlDown」にすることも、可能なのでしょうか? リンク先にもありますが、可能です >Instrの後ろ、Thenの手前にある「>0」というのは、一体何を意味しているのでしょうか? >●Instr >ある文字列の中から指定した文字列を検索し、最初に見つかった文字位置(先頭からその位置までの文字数)を返す文字処理関数。 にあるように 先頭からその位置までの文字数が数値での返ってきます 例えば 大理石村ロックハート城と大理石村ロックハート城(群馬県)を instrで比較した場合は 1が返ってきます 大理石村ロックハート城(群馬県)とロックハートの場合は 5が 大理石村ロックハート城(群馬県)と東京ドイツ村の場合は 0が返ってきます これをIF文にセットして 0の場合は処理をしない、0より大きい場合は処理をするようにしています こんな説明で分かるかな?

dj-s
質問者

お礼

higeさんが書いてくださったマクロをそのままコピペして実行したら、うまくいきました(>_<) Instrも、なんとなくですが理解できました。「大理石村ロックハート城」「大理石村ロックハート城(群馬県)」は、“大”が1文字目に見つかるから1、1>0なので、その場合はCells(i, 1) =Cells(ii, 2)の処理を実行せよということですね。 For文も、下↓の解説と一緒に考え、なんとか理解できました。 http://excelfactory.net/inukouza/inu06.htm iとiiの動きは、 Cells(65336, 1)、Cells(65536, 2)で指定されているのですね。 そして、higeさんが書いてくださったマクロを、 If InStr(Cells(ii, 2), Cells(i, 1)) > 0 Then Cells(ii, 2) = Cells(i, 1) に変更してみると、なぜかB列のデータが、A列に変更されてしまいました(驚) If InStr(Cells(i, 1), Cells(ii, 2)) > 0 Then Cells(ii, 2) = Cells(i, 1) や、 If InStr(Cells(i, 1), Cells(ii, 2)) > 0 Then Cells(i, 1) = Cells(ii, 2) に変更すると、何も起きなかったです。 「対象文字列」と「検索文字列」↓ http://homepage2.nifty.com/pasocon/nyumon/instr.html というのが関係しているんですかね、この点はまだ謎ですが・・・ いやはや、貴重なお時間でご指導いただき、本当にありがとうございます<m(__)m>

その他の回答 (6)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.7

[回答番号:No.3] の DOUGLAS_ です。 =INDIRECT("B" & MATCH(A1,C:C,0)) ・・・(※1) について解説いたします。  先ず、 =MATCH(A1,C:C,0) ですが、[MATCH] 関数の書式は MATCH(検査値,検査範囲,照合の型) となっておりますので、「A1 と全く同じ値をC列から検索し、あればC列での行番号、なければ #N/A を返す」という意味になります。  従って、「A1 と全く同じ値」を持つ「C列」の値の「セル番地」は "C" & MATCH(A1,C:C,0) ということになりますが、そもそもC列の値は、B列の値から「(***)」の部分を削除しただけのものですから、dj-s さんが >A列の中に、C列のデータに該当する文字列があれば、全てB列の文字列に置換する とお書きの「B列の文字列」の「セル番地」が "B" & MATCH(A1,C:C,0) ということになります。  「セル番地」を参照して、その値を取り出すのは [INDIRECT] 関数ですから、 =INDIRECT("B" & MATCH(A1,C:C,0)) としました。 >DOUGLASさんが書いてくださった式は、参照形式が省略されていることに気づくのに、時間がかかりました(汗)  エクセルの計算式で「引数」を省略するのはよくあることです。  都度、ヘルプをご覧になることをお薦めいたします。 >A列にはあってB列にはない観光地の場合 >#N/A >が返ります。 というのがお気に召さない場合は、 =IF(ISNA(MATCH(A1,C:C,0)),A1,INDIRECT("B" & MATCH(A1,C:C,0))) となります。  もし「ISNA(MATCH(A1,C:C,0))」なら「A1」を返し、そうでなければ(※1)の値を返します。 >もし「ISNA(MATCH(A1,C:C,0))」なら につきましては、「#N/A」を返すのは [MATCH] 関数が検索に失敗したからですから、その部分を指定して [ISNA] 関数で検索の結果を判別し、それに応じて「元々のA列の値(A1)」を返すか、「県名を加えた値(※1)」を返すのかを選択します。  ちなみに、この際、あえて「#N/A」を返させておいて、B列の末尾にデータを補いつつ、すべてのデータに県名を加えるという考え方もできますが、この場合は(※1)の式のままで作業します。

dj-s
質問者

お礼

なるほど理解できました! B列とC列が同じ行番号であることを生かして、INDIRECT関数を使うのですね(>_<) 最初戸惑いましたが、 =MATCH(A1,C:C,0) だけでオートフィルしてみると「54」等の値が、 ="B" & MATCH(A1,C:C,0) だけでオートフィルしてみると「B54」等の値が出てきたので、そこでようやく理解できました。このセル番地「B54」を参照するのが、INDIRECT関数の役目なのですね~ISNAの使い方もなんとなくわかりました。 ISERRORと似ていますよね。 いやはや、二回も回答していただき本当にありがとうございました<m(__)m>

  • sekkii
  • ベストアンサー率50% (13/26)
回答No.5

これでいいのかな? A列、B列はそのままで C1セルに =IF(ISERROR(VLOOKUP(A1 &"*",B:B,1,FALSE)),A1,VLOOKUP(A1 &"*",B:B,1,FALSE)) で下にオートフィル。

dj-s
質問者

お礼

できました! 私にとって複雑な関数でしたので、理解に時間がかかりましたが、オートフィルをしていくと、C列に期待通りの文字列が表示されました! ありがとうございます(>_<)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

マクロなら簡単なのに '標準モジュールへ Sub test() Dim i, ii For i = 1 To Cells(65336, 1).End(xlUp).Row For ii = 1 To Cells(65536, 2).End(xlUp).Row If InStr(Cells(ii, 2), Cells(i, 1)) > 0 Then Cells(i, 1) = Cells(ii, 2) Exit For End If Next ii Next i End Sub C列は要りません A列、B列のみがあればよい 関数が希望なら、飛ばしてね

dj-s
質問者

お礼

マクロは全然知らないのですが・・・でもC列とかいらないんですか・・・すごいですね! と思い、今日勉強してみました。 マクロは「Sub」で始まり「End Sub」で終わる1つのVBAプログラムだと。このプログラムの1単位を「プロシージャ」と呼ぶ。 から始まり、higeさんが記述してくださった文字列を少しずつ調べていきました。 ●Dim 変数(データを格納しておく「入れ物」のようなもの)の宣言を示すキーワード ●Cells http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html#cells ●If...Then...Else ステートメント If 条件式 Then 条件が成り立つときに実行する処理 Else 条件が成り立たなかったときに実行する処理 End If ●Instr ある文字列の中から指定した文字列を検索し、最初に見つかった文字位置(先頭からその位置までの文字数)を返す文字処理関数。 ここまではなんとか調べあげ、なんとなく理解したつもりなのですが、「For文」「End(xlUp).Row」「> 0」の3つの箇所に関して、まだ理解することができません(ToT) For文はNext文とセットにする↓ http://msft.ems.okayama-u.ac.jp/vba/chapter2.htm ことで、大量のデータを簡単に指定できる? という感じに今は解釈しているのですが、そのFor文に続く「End(xlUp).Row」というのに、また疑問が湧きました。 終端セルを参照する(Endプロパティ)↓ http://www.moug.net/tech/exvba/0050088.htm というページを参考にすると、たぶん「End(終端から)、xlup(↑の方向に移動しろ)、Row(行の)」ということで、行の「65336」番目から上のデータをすべて指定している、という考えに至ったのですが、正しいでしょうか? そうすると、もしかしてこの箇所は、「xlUp」を「xlDown」にすることも、可能なのでしょうか? また、Instrの後ろ、Thenの手前にある「>0」というのは、一体何を意味しているのでしょうか? いろいろ質問してしまってほんとにすいません・・・もし、差し支えなければ、再度ご回答いただければ幸いです(>_<)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

=INDIRECT("B" & MATCH(A1,C:C,0)) でいけるかと存じますが、A列にはあってB列にはない観光地の場合 #N/A が返ります。

dj-s
質問者

お礼

INDIRECT(参照文字列 , 参照形式) らしいですね。 DOUGLASさんが書いてくださった式は、参照形式が省略されていることに気づくのに、時間がかかりました(汗) 確かに希望通りの文字列が表示されたのですが、式の意味が理解できません(ToT) "B" & MATCH(A1,C:C,0) というのは、B列を参照し、かつ、C列の中からA1にMATCHするものを探し、もしMATCHすれば・・・う~ん、よくわかりません・・・差し支えなければ、式の意味を解説していただけないでしょうか?

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.2

あ、ちょっと質問を取り違えていました。 C1セルに先ほどの計算式を入れて下方向にフィルすると、県名が表記された一覧が出来上がるのでそれをコピーして値のみで貼り付けるって言う方法になります。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

=IF(ISERROR(MATCH(A1,LEFT($B$1:$B$7,LEN(A1)),0)),A1,INDEX($B$1:$B$7,MATCH(A1,LEFT($B$1:$B$7,LEN(A1)),0))) 取り合えずこんな感じで 配列計算になっているのでArt+Ctrl+Enterで確定してください

dj-s
質問者

お礼

返信遅くなってすいません(>_<) 即レスありがとうございます<m(__)m> 配列計算というのは、よく知らないのでなかなか理解できませんでして…(汗) 特にINDEX関数のところは、ココの使用例4↓ http://www.kenzo30.com/ex_kisotyu/ex_ks_tyukyu9_9_7.htm 等を参考にしてみたのですが、まだ頭を悩ませています(悶) まず、IF関数とISERROR関数が組み合わさっているので、 ISERROR(MATCH(A1,LEFT($B$1:$B$7,LEN(A1)),0)) というエラーが真(成り立つ)の場合は値「A1」を、エラーが偽(成り立たない)の場合は、 INDEX($B$1:$B$7,MATCH(A1,LEFT($B$1:$B$7,LEN(A1)),0)) を返すと、解釈して大丈夫でしょうか?

関連するQ&A

  • Excelで複数の条件でデータを抽出したいのですが上手くいきません(ToT)

    Excelで複数の条件でデータを抽出したいのですが、どうしても上手くいかず、質問させていただきました。 ナガシマスパーランド ナガシマスパーランド(三重県) ナガシマスパーランド(三重 東京ディズニーランド 東京ディズニーランド(千葉県) 東京ディズニーランド(千葉 ハウステンボス ハウステンボス(長崎県) ハウステンボス(長崎 ・ ・ ・ といったデータがあるのですが、この中から、 ナガシマスパーランド(三重県) 東京ディズニーランド(千葉県) ハウステンボス(長崎県) と、県名が「()」(←半角カッコの始めと終わり)で囲まれているデータのみを抽出し、別の行にそれらのデータを貼り付けたいのですが、 下記URL↓ http://dreamy.boy.jp/tec3_16.htm のやり方等を試しても、どうしうてもうまくいきません(ToT) (「該当なし」と判断されてしまうのでしょうか、検索条件範囲に項目名と「(」と「)」を含むセル範囲を選択しても、結果は、一つもデータが表示されない状態が返されてしまいます。) 「(」と「)」の2つの文字列を含むデータのみを抽出するには、どうすればよいのでしょうか? 関数を使えばいいのでしょうか?

  • Excelの質問です。複数の条件の中でいずれかを満たした場合、対応する文字列を表示させたいです。

    Excelの質問です。今、『妖怪.xls』というブックのSheet1に、以下のようなデータが並んでいます。 ケサランパサラン|7 九尾の狐|9 鉄鼠|25 不知火|43 キジムナー|47 ・ ・ ・ “|”は列と列の区切りでして、A列には妖怪の名前、B列には、都道府県コード↓ http://www2u.biglobe.ne.jp/~standard/code/jpken.htm に基づく、生息場所の番号が記載されています。 そしてC列に、B列に記載された都道府県コードに対応する、県名を入力したいのです。 例えば、 ケサランパサラン|7|山形県 九尾の狐|9|栃木県 鉄鼠|25|滋賀県 不知火|43|熊本県 キジムナー|47|沖縄県 ・ ・ ・ のようにしたいのです。 もちろん、B列と同じデータをC列にコピーし、47回、置換を繰り返して県名を入力する、という方法もありますが、何かと時間がかかってしまうので、以前私が質問した際↓ http://okwave.jp/qa5116119.html に、教えていただいた関数を応用し、C列に、 =IF(A1="","",IF(A1="北海道","1",IF(A1="青森県","2",IF(A1="岩手県","3",IF(A1="宮城県","4",IF(A1="秋田県","5",IF(A1="山形県","6",・・・ と、沖縄県まで条件を盛り込んだ関数を入力し、オートフィルすればうまくいくのではないかと思ったのですが・・・「指定した数式で使用されている入れ子のレベル数が、現在のファイル形式で許容される上限を超えているため、数式を入力できません。」というエラーが出てしまいました(ToT) どなたか、スマートな方法をご存知でいらっしゃいましたら、ご指導いただきたい次第です(>_<) よろしくお願いします<m(__)m>

  • エクセル 複数条件を満たすデータを返す関数

    エクセルで、複数条件を満たした時にデータを返す関数をお教えください。 例えばA列に県名、B列に都市名、C列にアルファベットが入っている表があります。 イメージ・・・(カッコ内はセルの番地) (A1)神奈川県   (B1)横浜市    (C1)X (A2)神奈川県   (B2)横須賀市   (C2)Y (A3)千葉県    (B3)千葉市    (C3)Z この表があり、 (A5)神奈川県   (B5)横須賀市   (C5)??? このようにA5,B5のデータ(条件)に一致するアルファベットを C5に返す関数が必要です。(ここではYを返す) C列が数値の場合は、sumproduct等で可能と思いますが、 C列が文字の場合は使えないのではと考えています。 何か方法はありませんでしょうか?

  • エクセル マクロ 対象列をコピーする

    エクセル マクロについて質問です。 下記のようなデータがありますが、【商品名】ごとにまとめたものを 別のシートへ行ごとコピーをして、商品名毎にまとめたいと思っています。 マクロの構文が思いつかず、よい方法はないでしょうか。 初歩的な質問かも知れませんがおしえてください。 マクロ実施前 【県名】  【商品名】 【売り上げ日】 【その1】 【その2】 埼玉県   A 東京都   B 神奈川県  B 千葉県 A 栃木県   C 群馬県   D マクロ実施後↓↓ Aシート 【県名】  【商品名】 埼玉県   A 千葉県 A Bシート 【県名】  【商品名】 東京都   B 神奈川県  B Cシート 【県名】  【商品名】 栃木県   C 群馬県   D Dシート 【県名】  【商品名】 群馬県   D

  • エクセル:複数列のデーターの単列化について教えて下さい。

    皆さん教えて下さい。 現在作業をしていまして、excelデータで住所を記載している欄で「A列に○○県」、「B列に○○市」、「C列に○○町」と複数列に分割して住所を入れています。それを、「A列の一列ですべて表示したい」のですが、これをEXCEL機能でできる方法はありませんか? 教えて下さい。 すいません。急いでいます。よろしくお願いいたします。

  • エクセル重複データのある列同士の2列を比較したい

    エクセルに詳しい方、教えて頂きたいです。 文で説明すると、難しいので例と一緒に説明させてください。 例えば、下のようなデータがあるとします。 A列 B列 山田さん 栃木県 山田さん 栃木県 山田さん 大阪府 山田さん 栃木県 鈴木さん 三重県 鈴木さん 三重県 大野さん 千葉県 大野さん 東京都 大野さん 東京都 A列はA列で重複したデータがあり、B列はB列で重複したデーターがある場合。 A列 B列 C列 山田さん 栃木県 大阪府 鈴木さん 三重県 大野さん 千葉県 東京都 上ような結果にできる方法はないでしょうか。 例えば住所録をデータで何年分かためており、整理したいが、現在の住所は一つのはずなのに間違えて住所入力したか引越ししたかで複数住所がある。現在はどちらが正しいのか確認するために、その確認資料を作成したい。(同じ名前の人で別人の人はいないとする。) 相違があるかどうかを調べるだけならと、 C列にif関数をいれて見ましたが、ベストな結果ではないと思います。 ちなみに入れた関数は、元のデータのC列目に IF(A1=A2,IF(B1=B2," ","相違あり")," ") 上のIF関数をいれて、下にデータの分だけコピペしました。 エクセルを触るのは久々で、思いつく方法をしてみました。 ですので関数でできるのか、マクロでできるのか、またはエクセルの機能を使用してできるのか、またその方法を教えて頂きたいです。 そんな表にしなくても、こういうのでいいんじゃないの?等の提案でも構いません。 よろしくお願いいたします。

  • エクセルのデータ検索について(1)

    ご覧いただきありがとうございます。 写真の添付が1枚しか出来ない為、質問を2つに分けて、1枚ずつ添付します。 ◯[Sheet1]に図のようなデータがあった場合なのですが、そのままだと見辛いので、それぞれ別のシートで検索出来るようにしたいなぁと思っております。 【A列】→No. 【B列】→高校名 【C列】→学科 【D列】→郵便番号 【E列】→住所 【F列】から、添付写真のように内容が入力されていて、県ごとに表が分かれています。(表全体を載せたいのですが、画像が粗い為、抜粋しました。分かりづらくてすみません。) ◯[sheet2]では、県名(プルダウンで選択)→高校名(県名に連動して、プルダウンで選択)→内容(H26年度 入塾生・H27年度 入塾生・H28年度入塾生・H27年度 体験授業参加人数…などをプルダウンで選択)→人数(クラス毎)で検索したいです。 (『エクセルのデータ検索について(2)』に添付の上の図) ◯[sheet3]では、内容(プルダウンで選択)→高校名一覧+人数(sheet1の表で、人数が0の場合は表示しない)で検索したいです。 (『エクセルのデータ検索について(2)』に添付の下の図) 色々調べてみて、VLOOKUP・INDEX・MATCH関数を組み合わせると出来そうなのですが、どのように組み合わせて良いか分かりませんでした。 こんな感じの複雑な検索は可能でしょうか? ご回答宜しくお願い致します。

  • 5月15日・16日の1泊2日で群馬県に4人家族で遊びに行こうと思ってい

    5月15日・16日の1泊2日で群馬県に4人家族で遊びに行こうと思っています。15日は宇都宮~奥日光の金精峠を通って群馬県高山村の大理石村ロックハート城~渋川で1泊、16日は渋川~赤城村~宇都宮への行程です。目的はロックハート城ですが、記載行程の途中で何か楽しめる場所(妻と高1・小4の子供)があったら教えて下さい。群馬県に関する雑誌等があまり無いので調べようがありません。年1回の小旅行を家族楽しみにしています。ちなみに車で出かけます。よろしくお願いします。参考にさせて下さい。

  • Excelの質問です。A列に、指定した文字列があれば、その文字列があるセルの行を、Sheet2に移動させたいです。

    今、Sheet1のA列、B列、C列に、以下のようなデータがあります。 A----------B----------C ・・・ どんぶり(長野県)----------ソースかつ丼----------駒ヶ根市・伊那市  ・・・ ラーメン(岐阜県)----------高山ラーメン----------高山市 蕎麦(長野県)----------高遠そば----------伊那市高遠町 どんぶり(長野県)----------さくら丼----------飯島町 その他麺類(長野県)----------ローメン----------伊那市高遠町 どんぶり(長野県)----------ほたる丼----------辰野町 どんぶり(長野県)----------紫輝彩丼----------宮田村 蕎麦(長野県)----------木曽すんきそば----------木曽町 どんぶり(長野県)----------ごぼとん丼----------松川町 ・・・ このようなデータが、1000行ぐらいあるのですが、この中から、「A列に"どんぶり"もしくは"蕎麦"という用語を含むセルがあれば、そのセルがある行全てのデータ(A~L列ぐらいまであります。)を、Sheet2に移動させる」といったことは、できないでしょうか? 今は、「フィルタ→テキストフィルタ」で、A列に「"どんぶり"を含むor"蕎麦"を含む」という条件でソートを行い、ソートされたものをコピー⇒sheet2にペーストというやり方を実践しているのですが、このテキストフィルタを使ったやり方には、限界を感じていまして。 文字数の都合上、記載はしていないのですが、データは1000行ほどあり、A列には「パスタ(●●県)」「カレー(●●県)」といったデータもあります。 その中から、例えば「"どんぶり"を含むor"蕎麦"を含むor"パスタ"を含む」のように、文字列の条件を3つ以上指定する場合、テキストフィルタを使ったやり方では、それができないのです(ToT) 何か別のスマートな方法がございましたら、回答いただけないでしょうか? よろしくお願いします<m(__)m>

  • excelで検索に最適な関数を教えて下さい。

    sheet1にデータがあります。     A      B      C        D 1  県名    会社名    住所      電話番号 2 埼玉県   山田商事   埼玉県…     04-… 3 東京都   佐藤商事   東京都…     03-… 4 東京都   中田商事   東京都…     03-…    …      …      …        … 上記のデータが約500有ります。 表示用sheet2の A1に入力規則を活用して、県名を(例えば東京都と)入力すると A2に東京都 佐藤商事 東京都… 03-… A3に東京都 中田商事 東京都… 03-… が表示させるようにしたいです。 VLOOKUPだと中田商事の行が表示されず、上手くできませんでした。 オートフィルタだとsheetが違う点と、同じ県の会社が多いために、表示が縦に長くなるので見にくいです。 同じ県の会社は多くても50くらいなので、できれば30行くらいまで表示すると、続きはEに県名、Fに会社名として表示できれば一画面に多く表示でき助かります。 関数でできると思うのですが、どうすれば良いでしょうか? わかる方教えてください。よろしくお願いします。

専門家に質問してみよう