こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA 郵便番号の書式判定について

お世話になります。

現在VBAの勉強としてエクセルでマクロを書いているのですが、セル内に郵便番号や日付を入れたときの書式判定で悩んでいます。

例えば、セルの範囲A2:A10に「000-0000」の形で郵便番号が表示されるように、表示形式を設定したとします。
その際に、表示されている値が 「数値3桁」+「-」+「数値4桁」といった形で表示されていることを判定したい場合、どのように記述する方法があるでしょうか?

ちなみに、私は今順番を関係なく、セルの値を取得した後で前3桁と記号と後ろ4桁に分解し、
それぞれが数値か、それとも「-」かで判定を行っています。
ほかにも方法がありましたら、参考までに知恵をお貸しください。
よろしくお願いいたします。

投稿日時 - 2009-02-16 13:44:33

QNo.4722350

すぐに回答ほしいです

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

こんにちは。

#6 のご回答にありますとおり、セルの表示形式を反映させた、つまりセルに
表示されたそのままのデータを取得する Text プロパティーがあります。

あとは、この程度のチェックなら Like 演算子でもよさそう。

  Dim sText As String
  sText = Range("A1").Text
  If sText Like "###-####" Then
    MsgBox "Good Format"
  End If

こんな感じ。# は任意の1文字の数字を表します。

投稿日時 - 2009-02-17 00:00:02

お礼

アドバイスありがとうございます。
Like演算子、ですか。
なるほど、こういった使い方もできるのですね!!
さっそく試してみたいと思います。
ご意見ありがとうございました。

投稿日時 - 2009-02-17 09:46:32

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

あまり本に書いてないと思うが
Sub test01()
MsgBox Range("a1").Text
End Sub
やってみてください。
表示形式が設定(適用)された後のセルの状態(見た目)が捉えられるのでは。
だから、それ(その文字列)を対象に考えれば良いのでは。
他に
Sub test01()
MsgBox Range("A1").NumberFormat
End Sub
も考えて見てください。
ーーー
質問に色々書いているが、
エクセルのセルの「値」と、セルの「表示形式」は違うものであることは十分判っているのかな。多分セルの値と表示形式は別の場所にデータを保持していて、シートの表示は、表示するとき両者を合成して表示していると思う。

投稿日時 - 2009-02-16 22:31:41

お礼

アドバイスありがとうございます。
そうですね、どちらかというとセルの中に入っている「値」というよりは、
表示形式によって変化した、見た目上の表示を判定したいと考えていました。
もう少し、そういった部分を含めて基礎に戻って勉強をしてみようと思います。
ご意見ありがとうございました。

投稿日時 - 2009-02-17 09:40:07

ANo.5

一例です
A1が対象です

Sub test()
If InStr(Range("a1").Text, "-") = 4 And Len(Range("a1").Text) = 8 Then
MsgBox "郵便番号です"
Else
MsgBox "何でしょう?"
End If
End Sub

参考まで

投稿日時 - 2009-02-16 22:00:52

お礼

アドバイスありがとうございます。
なるほど、InStrで「-」が見つかった位置を見て、なおかつそれを含めたテキストの長さが8文字であるかという判定ですね。
この判定に、「-」以外のところが数値になっているかの判定を加えればいけそうですね。
貴重な参考意見、ありがとうございました。

投稿日時 - 2009-02-17 09:37:46

ANo.4

>「数値3桁」+「-」+「数値4桁」といった形で表示されていることを判定したい場合

一例として正規表現で。(セルA1に表示形式で入っているとします)

Sub try()
Dim RegExp As Object
Dim st As String

Set RegExp = CreateObject("VBScript.Regexp")
st = Range("A1").Text
RegExp.Pattern = "\d{3}-\d{4}"

If RegExp.Test(st) Then
MsgBox "郵便番号"
Else
MsgBox "郵便番号ではなさそう"
End If

Set RegExp = Nothing
End Sub

ご参考程度に。

投稿日時 - 2009-02-16 15:11:08

お礼

アドバイスありがとうございます。
正規表現、やはりそちらのほうになってしまいますか…(^^;
もしかしたら、とは思ったのですが、ソースを参考に少し資料を探して勉強してみます。
ご意見ありがとうございました。

投稿日時 - 2009-02-17 09:33:05

ANo.3

No2です。
VBAの質問でしたね。失礼しました、無視してください。

投稿日時 - 2009-02-16 14:59:43

ANo.2

対象がA1に文字列で入っているとして、式で書くならこんなところでしょうか?
 =IF(AND(ISNUMBER(VALUE(LEFT(A1,3))),MID(A1,4,1)="-",ISNUMBER(VALUE(RIGHT(A1,4))),SUBSTITUTE(A1,".","")=A1,SUBSTITUTE(UPPER(A1),"E","")=A1),"郵便番号","郵便番号以外")

投稿日時 - 2009-02-16 14:58:34

お礼

アドバイスありがとうございます。
エクセルの関数のほうでのご意見ですか、そちらのほうもあまり勉強が進んでいるともいえませんので、
今後の参考にさせていただきたいと思います。
ありがとうございました。

投稿日時 - 2009-02-17 09:30:29

ANo.1

> セルの値を取得した後で

セル書式設定で「その他」の「郵便番号」を選択しているのですよね?
それなら「値」ではまずいんじゃないですか?(0で始まる郵便番号の場合)

Sub 〒番号()
Dim x As String, buf As Boolean
x = Range("A1").Text
If IsNumeric(Left(x, 3)) Then
If Mid(x, 4, 1) = "-" Then
If IsNumeric(Right(x, 4)) Then
buf = True
End If
End If
End If
MsgBox IIf(buf, "郵便番号と思われます。", "郵便番号じゃないみたい。")
End Sub

投稿日時 - 2009-02-16 14:30:35

お礼

アドバイスありがとうござます。
やはり、最初は分解して判定をと考えてしまいますよね。
投稿した後でLike演算子を使う方法を見つけましたので、今はそちらを使用しています。
参考になるご意見をありがとうございました。

投稿日時 - 2009-02-17 09:28:45

あなたにオススメの質問