プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

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

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

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

A 回答 (7件)

こんにちは。



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

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

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

こんな感じ。# は任意の1文字の数字を表します。
    • good
    • 2
この回答へのお礼

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

お礼日時:2009/02/17 09:46

あまり本に書いてないと思うが


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

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

お礼日時:2009/02/17 09:40

一例です


A1が対象です

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

参考まで
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/17 09:37

>「数値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

ご参考程度に。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/17 09:33

No2です。


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

対象が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),"郵便番号","郵便番号以外")
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/17 09:30

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



セル書式設定で「その他」の「郵便番号」を選択しているのですよね?
それなら「値」ではまずいんじゃないですか?(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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/17 09:28

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