• ベストアンサー

カタカナ&数字だけを消したい

エクセル2003で、お客様のデータを管理しています。 その作業の過程で、お客様の住所を【都道府県・市区郡・町村・町以下】にセルごとに分ける作業があります。その作業自体は、県を県/・区を区/などに置換し、区切り位置で各セルに分けるようにしております。(わかりづらくてすいません…) その作業の際に、番地(数字)とマンション名(主にカタカナ)を消したいのですが、 現在は置換を使い地道にやっているのですが、VBAを使えばすぐだと聞きました。 ただ、私は簡単なマクロを組んで使うことはあるのですが、本格的にVBAを扱ったことがない初心者です。 その辺を踏まえた上で、どなたかお力を貸して頂けませんでしょうか? よろしくお願いします。 m(_ _)m

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

VBAのステートメントや組み込み関数では処理できない場合、次の手段を考えます。 (1)WindowsAPI (2)オブジェクト 今回は(2)の中で正規表現(Regular Expression)を使いました。 応用範囲が広く、覚えておくと役に立ちます。 オブジェクトを使う例で多いのは(1)DBアクセス、(2)システム情報の操作、などです。 ハイフンやアルファベットも当然、可能です。参考URLをご覧になりましたか? ハイフンを対象にするには"\-"を、アルファベットを対象にするには"[a-z]"をOR結合すればよいでしょう。 アルファベットの大文字小文字を区別しない場合はオブジェクトのIgnoreCaseプロパティをTrueにします。 RegExp.IgnoreCase = True 但し、漢字(全角)のアルファベットは対象外なので、"[A-Z]|[a-z]"のように指定します。 蛇足ですが、1文字ずつ処理する場合は Select Case 文を使う方が、若干ですが効率が良い。 '-- サンプル Select Case Mid(文字列, 位置, 1)   Case "0" To "9" '数字の場合   Case "a" To "z" '英字の場合   '-- 略 End Select また、VBAはインタープリタで、最適化がかからないので、A >= "0" And A <= "9" のように 変数Aの出現回数が2回になるより、1回でやるほうが有効です。 特にMid()のような関数の結果を評価する場合、何回も関数が実行されます。 更に、複数条件をAND結合するより、Ifをネストした方が有利です。 If 条件1 And 条件2 Then     ↓ If 条件1 Then   If 条件2 Then 最適化のかかる場合は条件1を満たさないと、条件2は評価しないで、Else節へ分岐します。 これはAND結合なので、条件1がFalseなら条件2の結果にかかわらず条件式がFalseになるためです。 VBAでは常に記述された条件を全て評価するので、条件1の結果にかかわらず、条件2を評価します。 つまり、余計な評価が行われるのです。OR結合でも同様です。 もっとも、正規表現オブジェクトを使う方が断然高速なので、こういう仕様の場合、 他の方法は考えなくても良いと思います。

jankee
質問者

お礼

ありがとうございます。OR結合したら望み通りの結果がでました。 まだまだ初心者なので、専門用語が出てくるとちんぷんかんぷんでしたが、 逆にいい刺激になりました。 正規化オブジェクトは初めて聞きました。(今の段階ではまだ出てきてまっせんでした) 今後は解答をしっかり理解できるレベルにはなれるよう頑張ります。 ありがとうございました。

その他の回答 (4)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

ANo.2 です。 アルファベットも削除。 そうだろうとは思ってました。 正規表現より長くなっているのに、 If (s1 >= "0" And s1 <= "9") Or (s1 >= "!" And s1 <= "9") Or (s1 >= "ァ" And s1 <= "ヶ") Or (s1 >= "。" And s1 <= "゜") Or _ s1 = "ー" Or s1 = "-" Or s1 = "-" Then を、さらに長くなるけど、 If (s1 >= "0" And s1 <= "9") Or (s1 >= "!" And s1 <= "9") Or (s1 >= "ァ" And s1 <= "ヶ") Or (s1 >= "。" And s1 <= "゜") Or _ s1 = "ー" Or s1 = "-" Or s1 = "-" Or (s1 >= "A" And s1 <= "z") Then にするだけだが。 余計な話 そうすると、回答者はfunction名もdelANKにしたくなって、 delANK = Application.WorksheetFunction.Trim(str1) End If にしたがる。

jankee
質問者

お礼

ありがとうございました。完璧に思い通りの結果がでました。 自作関数というのでしょうか?凄いですね。 私ももっと深く勉強してみようとおもいます。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

ANo.2 です。 下の2行の順序を入れ替えてください。 delNK = Application.WorksheetFunction.Trim(str1) End If

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

VBAの関数 番地表示のときの「-」などと、「パークヒルズ」などの長音記号「ー」を削除するようにしてある。 Function delNK(ByVal str1 As String) As String Dim l As Integer, i As Integer, s1 As String l = Len(str1) If l > 0 Then For i = 1 To l s1 = Mid(str1, i, 1) If (s1 >= "0" And s1 <= "9") Or (s1 >= "!" And s1 <= "9") Or (s1 >= "ァ" And s1 <= "ヶ") Or (s1 >= "。" And s1 <= "゜") Or _ s1 = "ー" Or s1 = "-" Or s1 = "-" Then s1 = " " Mid(str1, i, 1) = s1 End If Next End If delNK = Application.WorksheetFunction.Trim(str1) End Function

jankee
質問者

補足

ありがとうございます!うまく作動しました。(感動しました!) ただ、申し訳ないのですが、定義の部分で1点入れ忘れたことがございました。 マンションの部屋番号などでアルファベットが使用されるので、 大文字・小文字・全角・半角問わずに、アルファベットも全て消したいのです。 お時間ある時で構いませんので、教えていただけませんでしょうか? よろしくお願いします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

VBAと言うより正規化オブジェクトを使うと簡単です。 '** パラメータの住所からカナと数字を除去した文字列を返す Function カナ数字除去(ByVal 住所 As String) As String Dim RegExp '正規化オブジェクト Set RegExp = CreateObject("VBScript.RegExp") 'オブジェクトをインスタンス化する RegExp.Global = True '最初の1文字だけでなく、全てを対象にする RegExp.Pattern = "[。-゜]|[ァ-ヶ]|\d|[0-9]" '除去パターン カナ数字除去 = RegExp.Replace(住所, "") End Function 【解説】 正規化オブジェクトで重要なのはPatternプロパティです。 サンプルでは4種類のパターンを|(垂線)でOR結合しています。 [。-゜]は半角カナ、[ァ-ヶ]は全角カナ、\dは半角数字、[0-9]は全角数字を意味します。 これらのいずれかのパターンに合う文字はReplaceメソッドで空文字に置き換えられます。

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc392020.aspx
jankee
質問者

補足

VBAと正規化オブジェクトは別物なんでしょうか? (エディタを立ち上げてコピペしたらうまくいきましたが、 2つの違いはまだよくわかりません…汗) ただ、今後覚えていきたい事ですので勉強になります。 うまく作動はしたのですが、私のミスで、定義に不足部分がございました。すみません。 住所で使用する『-』ハイフンやアルファベットも削除したいのですが、これもこの正規化オブジェクトで可能なんでしょうか?