• ベストアンサー

エクセルのマクロにLEFT関数のような働きはありませんか?

顧客データから抽出したデータの、書式を整える作業を自動記録したマクロを使ってやっています。 データの住所欄から、市か郡から下の部分を削除する作業があるのですが、抽出される顧客データは毎日違うので、自動記録のマクロでは出来ないため、この部分は手作業で行なっています。 この「住所の市または郡から下の部分を削除する作業」をマクロで行なう方法は無いでしょうか? 自動記録のマクロでは以下のようになっています。 Cells.Replace What:="○○県××市○○町1-2-3", Replacement:="○○県××市", LookAt:=xlPart, _SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ReplaceFormat:=FalseCells.Replace What:="○○県**市△△町4-5-6", Replacement:="○○県**市", LookAt:=xlPart, _SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ マクロに、ワークシート関数の=LEFT(A1,(FIND("市",A1)))と同じ様な働きを記述できればいいのか?とも思うのですが、やり方がわかりません。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 データベースで調べてみましたが、都道府県のあとの処理は、なかなか完全にはできません。Replace では、思い切って上書きでは、できません。データの横に出して正しくできているか調べるほうがよいです。今の段階では、完ぺきとはいえませんから。 例として、市が二つ続くのは、全国で3つあります。 「栃木県今市市」、「三重県四日市市」、「広島県廿日市」です。 「千葉県八日市場市安久山」は、日市の後の字ではありません。八日市場市が正解です。 また、「福島県郡山市」 や 「愛知県蒲郡市旭町」 のように、郡のあとに市かありますから、郡山市 蒲郡市が、正解です。「兵庫県神崎郡市川町浅野」や「富山県中新川郡上市町旭町」は、郡のあとに、市が来ますが、神崎郡 新川郡 までです。同じく、「北海道余市郡余市町」の場合は、市のあとに、郡があって、その後に、市がまた来ます。 余市郡が正解です。 「鹿児島県日置郡市来町大里」では、郡のあとに、市がきますが、日置郡が正解です。 エラーチェックは、読み仮名できるような気がしますが、今のところは必要なさそうです。都道府県を区切るならともかく、「市・郡・区」を、関数式で区切るのは少し無理のような気がします。 今、すべてのものを以下のコードで、正しく区切れているか分かりません。 出力場所と、データ範囲は、任意です。適当に変えてください。 '標準モジュール '--------------------------------------------- Sub SplitOverLetters()   Dim i As Integer, j As Integer, k As Integer   Dim m As Integer, n As Integer   Dim c As Variant   Dim buf As String, buf2 As String, buf3 As String   Dim ret As String   Const COL As Integer = 1 '出力先(データに対して何列目・右)      Application.ScreenUpdating = False   For Each c In Range("A1:A20") 'データ範囲     If c.Value <> "" Then       If c.Value Like "*[都道府県]*" Then         If Mid(c.Value, 4, 1) = "県" Then           i = 1         Else           i = 0         End If         buf = Left(c.Value, 3 + i)         buf2 = Replace(c.Value, Left(c.Value, 3 + i), "")         i = InStr(buf2, "郡")         j = InStr(buf2, "市市")         k = InStr(buf2, "場市")         m = InStr(buf2, "市")         n = InStr(buf2, "区")         If i > 2 Then           buf3 = Mid(buf2, 1, i)           ret = buf & buf3         End If         If j > 1 And ret = "" Then           buf3 = Mid(buf2, 1, j + 1)           ret = buf & buf3         End If         If k > 2 And ret = "" Then           buf3 = Mid(buf2, 1, k + 1)           ret = buf & buf3         End If         If m > 1 And ret = "" Then           buf3 = Mid(buf2, 1, m)           ret = buf & buf3         End If         If n > 1 And ret = "" Then           buf3 = Mid(buf2, 1, n)           ret = buf & buf3         End If         c.Offset(, COL).Value = ret       End If     End If     ret = ""   Next c   Application.ScreenUpdating = True End Sub

suzubuu
質問者

お礼

細かく調べていただいて、ありがとうございます! 皆様の回答を読ませていただいて(最後の"市"で区切ったほうが良いとか、市と郡だけでなく区もあるとか)マクロが自分で組める事より(もちろんそれも素晴らしいですが)私にはひらめきが足りないなあと思いました。 同じ結果を求めるにも、アプローチの仕方でずいぶん違うんでしょうね。 Wendy02さんの書いてくださったVBA、さっぱり理解できない自分が残念です。勉強したいと思います。ありがとうございました!

suzubuu
質問者

補足

質問を締め切ります。 現時点では、内容がサッパリ分かってないのが自分でとっても残念ですが、とても細かく調べていただいたお礼にポイントを。

その他の回答 (5)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

大雑把ですが参考出品です。 Sub test1() Dim c As Range Dim adr As String Dim n As Integer For Each c In Range("A1:A50") adr = c.Value If adr Like "*県市*" Then n = InStr(Replace(adr, "県市", "KS", 1, 2), "市") ElseIf adr Like "*県郡*" Then n = InStr(Replace(adr, "県郡", "KG", 1, 2), "市") ElseIf adr Like "*市市*" Then n = InStr(adr, "市市") + 1 ElseIf adr Like "*市*" Then n = InStr(adr, "市") ElseIf adr Like "*郡*" Then n = InStr(adr, "郡") ElseIf adr Like "*区*" Then n = InStr(adr, "区") End If MsgBox Left(adr, n) Next c End Sub

suzubuu
質問者

お礼

私自身マクロがまったく判らないまま質問したのですが、皆さん親切な回答を下さって、恐縮しています。 VBAの解説本やサイトで、書いていただいた意味を調べ調べして勉強します。ありがとうございました!

  • 374649
  • ベストアンサー率38% (203/527)
回答No.4

例外は多々あると思いますが、単純にこんなものを作ってみました。 Sub 住所() Dim 住所 As String Dim No As Integer Dim No2 As Integer Dim Adrs As String Dim i As Integer Dim Shi As Variant Shi = "市" 住所 = Range("A1") No = Application.WorksheetFunction.Find("市", 住所, 1) No2 = No + 1 Adrs = Left(住所, No2) If Shi = Right(Adrs, 1) Then  Adrs = Left(住所, No2) Else  Adrs = Left(住所, No) End If Range("A2") = Adrs End Sub ”市”を見つけて左側の住所を取り出します、そのとき”五日市市”のように次に”市”が来たときをチェックしてます。 例外はありますがすべて手作業より例外だけ手作業でやればいくらか手間が省けると思いますが。 参考までに!!

suzubuu
質問者

お礼

そもそもの住所データがしっかり設計されていないので、難しいとは思っていたのです。 でも毎日この作業にとられる時間がもったいなくて。 いくらかでも手間が省けたら、毎日の作業なので大変助かります。 VBAを知らないので、なかなか理解できそうにないため、勉強して試してみます。ありがとうございました!

  • suo2k
  • ベストアンサー率44% (183/408)
回答No.3

> =LEFT(A1,(FIND("市",A1))) これと同じなら Left(Cells(1,1).value,Instr(1,Cells(1,1).value,"市")) かな。 ですが、住所の操作って意外と難しいですよ。 例えば、○○県五日市市北市町市市荘999-999 みたいな住所にその関数(最初の"市"のとこで切る)だと、 「○○県五日市」で切れちゃいますよね? 市名と町名の間にスペースでも無い限りは完全な判別は不可能かと思います。 なので、最初ではなく最後の"市"(郡)で切り取って、目で確認し、 おかしいところを手で削除、というのがいいかな… 以下一例 「処理行」「最終行」「文字位置」「文字内容」は変数使ってください。 --------------------------- (変数宣言) For 処理行 = 1 to 最終行 文字内容 = Cells(処理行, 1).Value For 文字位置 = Len(文字内容) To 1 Step -1 If Mid(文字内容, 文字位置, 1) = "市" Or Mid(文字内容, 文字位置, 1) = "郡" Then Cells(処理行, 1).Value = Left(文字内容, 文字位置) Exit For End If Next 文字位置 Next 処理行 ---------------------------- 例ではA列を上から順に移動し、セル内の右側から一つずつ文字を調べて、 市か郡が見つかったらそこで文字を切り取ります。 あとはオートフィルタとか、一個ずつカーソル移動しての確認が必要ですね。 もっと良い方法ありそう^^;

suzubuu
質問者

お礼

マクロのVBAと言うの物がわからないもので・・・。 最初はエクセルに関数を記述しようと思っていたんです。 住所データとは別の列に、市までを入力させて、例外は手作業になっても、かなり手間が減らせるなと。 それなら=LEFT(A1,(FIND("市",A1)))でいいのかな?と言うのが考え始めでした。 五日市市・・・なるほど、確かに最後の"市"で切り取るほうが良いですね。 考え方の参考になります。ありがとうございました。

suzubuu
質問者

補足

皆さんからの回答をみて、マクロにやらせたかった事が思ってたより難しい事がよく分かりました。 完璧でなくても、一部でも手間が省けたらいいなと思った時に、自分が一番早く理解できそうな回答はこちらだと思いました。

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

Excel:住所を区切る http://www.geocities.jp/chiquilin_site/data/050228_delimination_of_address.html 「郡」や「市」という判定はちょっとややこしそうです。 該当する物がデータ内になければ、大丈夫かもしれません。

suzubuu
質問者

お礼

そもそもの住所データがしっかり必要に応じて区切られて出来ていれば良かったんですが・・・。 市や郡で区切るといってもなかなか難しいようですね。 参考になります。ありがとうございました。

回答No.1
suzubuu
質問者

お礼

勉強になるサイトですね。 日々使うマクロがもう少し便利だといいのにと思って質問したのですが、VBAと言うものは全く知らないのものですから・・・。 これから少しずつ勉強します。ありがとうございました。

関連するQ&A

  • エクセルでマクロを使用しての置換

    マクロ初心者です。 データを変換するシステムをマクロで作成していますが、 自分のPCではちゃんと実行できるのに、お客さんのPCで実行するとエラーが出てしまいます。 エラーが出る部分は、どうも置換するところらしく、 Selection.Replace What:="<BR>", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False ここが黄色く表示されるそうです。 どこを直せばよいですか?

  • Excelマクロ 置換について教えてください。

    A列の,10を,15に置換したいので下記マクロを記録しました。 ほかに,10を,16などにしたい場合もあるため、 入力画面を表示して初期値は,10から,15ですが、ほかを入力した場合は他の値で置換するマクロを教えてください。 Sub Macro1() Columns("A:A").Select Selection.Replace What:=",10", Replacement:=",15", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub

  • EXCEL 違う端末でマクロエラー

    私の端末で正常に作動したEXCELのマクロが、 他の端末ではエラーになり正常に動きません。 他の端末で実行する際、マクロやセルの中身など全く変更していません。 この場合、どのような原因が考えられますでしょうか? マクロは以下の部分でエラーが出ています。 Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False よろしくお願いします。

  • エクセルで置換のマクロの際

    Selection.Replace What:="あ", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False エクセルのマクロで置換をする際に 自動記録で書くとこうなります。 「あ」を「(空白)」におきかえる内容ですが 置き換え候補がたくさんある場合は 上記の記述をくりかえし記述するしかないのでしょうか? 例 「あ」を「」に 「い」「」に   というような具合です

  • エクセルのマクロ 大量の置換の記述を簡略化

    Cells.Select Selection.Replace What:="東京", Replacement:="東京都", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False このような置換のマクロが何十個とあって 置換前の語句と置換後の語句ごとに すべて記述していますが 「置換の記述そのものはまったく同じなので  その中に語句を順番に入れ込んでいく」 という風な記述はできるものでしょうか? もし方法があるならば御教授願いたいです 宜しくお願い致します

  • エクセル2003で、動作するでしょうか?

    現在、エクセル2007でマクロの作成練習をしていますが、 マクロの記録を使用して次のマクロを得ました。 > Columns("B:B").Select Selection.Replace What:="P", Replacement:="m" ,_ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False,_ SearchFormat:=False, ReplaceFormat:=False エクセル2003を使用している友人の依頼で作成したものですが、 当方、エクセル2003の環境がないため、動作するのか エラーが生じるのか分かりません。 どなたか教えて下さい。 エラーが出るなら、どの部分を直せばいいのかも。よろしくお願いします

  • SearchFormatやReplaceForma

    エクセルでマクロの記録をしたら Sub Sample() Cells.Replace _ What:="a", _ Replacement:="b", _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ MatchCase:=False, _ SearchFormat:=False, _ ReplaceFormat:=False End Sub のように取得されて、一つ一つの引数を確認したいのですが、 http://www.moug.net/tech/exvba/0050117.html を見ても SearchFormatやReplaceFormatについての説明がないのですが これらについての説明を見るにはどうすればいいでしょうか? というか、なんでリンク先にはこれらの説明がないのですか? あまり使わないプロパティ?だからでしょうか?

  • エクセル2003で特殊文字の置換方法

    エクセル2003、XPを使用しています。 エクセルのマクロで置換をしているのですが、 置換対象がCHAR(160)です。 セル上に上のを打ち込むと、実際は違いますが半角スペースに見えます。 特殊文字であっているのでしょうか。 それで、この文字を消したいと思い、以下の通りマクロで記述しているのですが、成功しません おわかりになる方いらしたらよろしくお願いします。 Cells.Replace What:=Chr(160), Replacement:="", LookAt:=xlPart, SearchOrder:= _ xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

  • excelのvbaを使って日付を置換したいのです

    こんにちは。いつも質問ばかりですみません。 今、excell の VBAの勉強をしているのですが、たとえば、B列に2004/5/3 とか、2004/5/5とか、5月の日付ばかりはいっていたとして、その2004/5の部分を2004/6に置換したいとします。 それを、マクロでやらせてみて、VBAを見ると Sub Macro9() Cells.Replace What:="2004/5", Replacement:="2004/6", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub のようになるのですが、このプロシージャーを実行しても、うまく置換できません。 どのように記述したら、できるのか、教えていただけるとうれしいです。 よろしくお願いいたします。

  • VBAセル参照のパスのブック名に汎用性を持たせたい

    皆様どうぞ宜しくお願いいたします。マクロ初心者です。 Excel 2003で作業をしております。 今回の仕事で必要なので、大変困っております。 BOOK1とBOOK2を開き、BOOK1のAシートのセル参照をBOOK2でもBOOK2でのセル参照として活かす為、BOOK1のAシートの=をすべて#に置換した後、BOOK2にAシートをコピーし、逆に#を=に戻しました。 ここから後なのですが、BOOK名が特定されてしまうため、汎用性が効きません。 どのようにすればよいのかお教えください。 どうぞ宜しくお願いいたします。 下記マクロコード Cells.Replace What:="=", Replacement:="#", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Sheets("店頭").Select Sheets("店頭").Copy Before:=Workbooks("ここの部分です.xls").Sheets(3) Cells.Replace What:="#", Replacement:="=", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub

専門家に質問してみよう