電子書籍の厳選無料作品が豊富!

エクセル2003で、お客様のデータを管理しています。

その作業の過程で、お客様の住所を【都道府県・市区郡・町村・町以下】にセルごとに分ける作業があります。その作業自体は、県を県/・区を区/などに置換し、区切り位置で各セルに分けるようにしております。(わかりづらくてすいません…)

その作業の際に、番地(数字)とマンション名(主にカタカナ)を消したいのですが、
現在は置換を使い地道にやっているのですが、VBAを使えばすぐだと聞きました。

ただ、私は簡単なマクロを組んで使うことはあるのですが、本格的にVBAを扱ったことがない初心者です。

その辺を踏まえた上で、どなたかお力を貸して頂けませんでしょうか?
よろしくお願いします。 m(_ _)m

A 回答 (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結合でも同様です。

もっとも、正規表現オブジェクトを使う方が断然高速なので、こういう仕様の場合、
他の方法は考えなくても良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。OR結合したら望み通りの結果がでました。

まだまだ初心者なので、専門用語が出てくるとちんぷんかんぷんでしたが、
逆にいい刺激になりました。

正規化オブジェクトは初めて聞きました。(今の段階ではまだ出てきてまっせんでした)
今後は解答をしっかり理解できるレベルにはなれるよう頑張ります。
ありがとうございました。

お礼日時:2008/05/12 14:49

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
にしたがる。
    • good
    • 0
この回答へのお礼

ありがとうございました。完璧に思い通りの結果がでました。

自作関数というのでしょうか?凄いですね。
私ももっと深く勉強してみようとおもいます。

お礼日時:2008/05/12 14:22

ANo.2


です。

下の2行の順序を入れ替えてください。

delNK = Application.WorksheetFunction.Trim(str1)
End If
    • good
    • 0

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

この回答への補足

ありがとうございます!うまく作動しました。(感動しました!)

ただ、申し訳ないのですが、定義の部分で1点入れ忘れたことがございました。

マンションの部屋番号などでアルファベットが使用されるので、
大文字・小文字・全角・半角問わずに、アルファベットも全て消したいのです。

お時間ある時で構いませんので、教えていただけませんでしょうか?
よろしくお願いします。

補足日時:2008/05/09 10:19
    • good
    • 0

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 …

この回答への補足

VBAと正規化オブジェクトは別物なんでしょうか?
(エディタを立ち上げてコピペしたらうまくいきましたが、
2つの違いはまだよくわかりません…汗)
ただ、今後覚えていきたい事ですので勉強になります。

うまく作動はしたのですが、私のミスで、定義に不足部分がございました。すみません。

住所で使用する『-』ハイフンやアルファベットも削除したいのですが、これもこの正規化オブジェクトで可能なんでしょうか?

補足日時:2008/05/09 10:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!