• ベストアンサー

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

お世話になります。 現在VBAの勉強としてエクセルでマクロを書いているのですが、セル内に郵便番号や日付を入れたときの書式判定で悩んでいます。 例えば、セルの範囲A2:A10に「000-0000」の形で郵便番号が表示されるように、表示形式を設定したとします。 その際に、表示されている値が 「数値3桁」+「-」+「数値4桁」といった形で表示されていることを判定したい場合、どのように記述する方法があるでしょうか? ちなみに、私は今順番を関係なく、セルの値を取得した後で前3桁と記号と後ろ4桁に分解し、 それぞれが数値か、それとも「-」かで判定を行っています。 ほかにも方法がありましたら、参考までに知恵をお貸しください。 よろしくお願いいたします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

こんにちは。 #6 のご回答にありますとおり、セルの表示形式を反映させた、つまりセルに 表示されたそのままのデータを取得する Text プロパティーがあります。 あとは、この程度のチェックなら Like 演算子でもよさそう。   Dim sText As String   sText = Range("A1").Text   If sText Like "###-####" Then     MsgBox "Good Format"   End If こんな感じ。# は任意の1文字の数字を表します。

kreuz_z
質問者

お礼

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

その他の回答 (6)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

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

kreuz_z
質問者

お礼

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

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

一例です A1が対象です Sub test() If InStr(Range("a1").Text, "-") = 4 And Len(Range("a1").Text) = 8 Then MsgBox "郵便番号です" Else MsgBox "何でしょう?" End If End Sub 参考まで

kreuz_z
質問者

お礼

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

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.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 ご参考程度に。

kreuz_z
質問者

お礼

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

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

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

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.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),"郵便番号","郵便番号以外")

kreuz_z
質問者

お礼

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

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.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

kreuz_z
質問者

お礼

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

関連するQ&A

専門家に質問してみよう