![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
エクセル2003で、お客様のデータを管理しています。
その作業の過程で、お客様の住所を【都道府県・市区郡・町村・町以下】にセルごとに分ける作業があります。その作業自体は、県を県/・区を区/などに置換し、区切り位置で各セルに分けるようにしております。(わかりづらくてすいません…)
その作業の際に、番地(数字)とマンション名(主にカタカナ)を消したいのですが、
現在は置換を使い地道にやっているのですが、VBAを使えばすぐだと聞きました。
ただ、私は簡単なマクロを組んで使うことはあるのですが、本格的にVBAを扱ったことがない初心者です。
その辺を踏まえた上で、どなたかお力を貸して頂けませんでしょうか?
よろしくお願いします。 m(_ _)m
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結合でも同様です。
もっとも、正規表現オブジェクトを使う方が断然高速なので、こういう仕様の場合、
他の方法は考えなくても良いと思います。
ありがとうございます。OR結合したら望み通りの結果がでました。
まだまだ初心者なので、専門用語が出てくるとちんぷんかんぷんでしたが、
逆にいい刺激になりました。
正規化オブジェクトは初めて聞きました。(今の段階ではまだ出てきてまっせんでした)
今後は解答をしっかり理解できるレベルにはなれるよう頑張ります。
ありがとうございました。
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
にしたがる。
ありがとうございました。完璧に思い通りの結果がでました。
自作関数というのでしょうか?凄いですね。
私ももっと深く勉強してみようとおもいます。
No.3
- 回答日時:
ANo.2
です。
下の2行の順序を入れ替えてください。
delNK = Application.WorksheetFunction.Trim(str1)
End If
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
この回答への補足
ありがとうございます!うまく作動しました。(感動しました!)
ただ、申し訳ないのですが、定義の部分で1点入れ忘れたことがございました。
マンションの部屋番号などでアルファベットが使用されるので、
大文字・小文字・全角・半角問わずに、アルファベットも全て消したいのです。
お時間ある時で構いませんので、教えていただけませんでしょうか?
よろしくお願いします。
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 …
この回答への補足
VBAと正規化オブジェクトは別物なんでしょうか?
(エディタを立ち上げてコピペしたらうまくいきましたが、
2つの違いはまだよくわかりません…汗)
ただ、今後覚えていきたい事ですので勉強になります。
うまく作動はしたのですが、私のミスで、定義に不足部分がございました。すみません。
住所で使用する『-』ハイフンやアルファベットも削除したいのですが、これもこの正規化オブジェクトで可能なんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【Excel】住所に郵便番号を付記する方法 3 2022/05/07 17:15
- 政治 「どうでしょう襲来」という回答者の言っていることが理解できないので、誰か解説してください。 私は、消 1 2022/11/13 22:08
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- 戸籍・住民票・身分証明書 私は戸籍の本籍地を後悔しています。 本籍地は自分の好きな都道府県や 市区町村に置けることを 知りませ 12 2022/03/29 22:19
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
【エクセルのマクロ】クリップ...
-
現在アクティブになっているオ...
-
アクセスの1つのファイルにはク...
-
PictureBoxにPSetしてそれをIma...
-
エクセルのデータをwebフォーム...
-
エクセルVBAでセル番地を指定し...
-
Accessのフォーム上にエクセル...
-
Excel VBA でPictureBoxオブジ...
-
VB.NET Image型データをファイ...
-
クリスタルレポートのプレビュ...
-
日本語の文字化けを直す方法
-
Bitmap.GetPixelより高速なもの
-
アクセスのスクロールバー
-
VBAで選択範囲外の図形(オブジ...
-
ExcelのシートをAccessで表示し...
-
SQLの更新の時、記号 ’ について
-
【エクセル】複数のTextBoxに共...
-
Doevents をご教授ください。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
文字列で小数点以下の0を削除し...
-
Excel VBAでマウスの左クリック...
-
【エクセルのマクロ】クリップ...
-
エクセルVBAでセル番地を指定し...
-
Accessのフォーム上にエクセル...
-
コードでオブジェクトを最前面に
-
日本語の文字化けを直す方法
-
現在アクティブになっているオ...
-
Imageコントロールにグラフを表...
-
Excel2007 でのチェックボック...
-
PowerpointVBAで指定のShapeオ...
-
Access からオブジェクトとして...
-
エクセルのデータをwebフォーム...
-
【エクセル】複数のTextBoxに共...
-
[C#] DataGridViewの項目名
-
カッコ付けのオブジェクト名を...
-
ExcelのシートをAccessで表示し...
-
構造体の静的な初期化
おすすめ情報