テキストの文字列を確認し、それが文字で構成されているかどうかを評価できる関数を使用しています。 「General」というモジュールに格納されています。一般モジュールは、パブリック関数と変数を格納するためにのみ存在します。機能コードは以下のとおりです。
Public Function IsAlpha(strValue As String) As Boolean
Dim intPos As Integer
For intPos = 1 To Len(strValue)
Select Case Asc(Mid(strValue, intPos, 1))
Case 65 To 90, 97 To 122
IsLetter = True
Case Else
IsLetter = False
Exit For
End Select
Next
End Function
次に、ユーザーフォームのテキストボックスの最初の2文字を評価する2つの「if」ルーチンがあります。最初のルーチンは最初の文字が数字かどうかを尋ね、2番目のルーチンは2番目の文字がアルファベットかどうかを尋ねます。現在、2番目の「if」ルーチンは、IsAlphaがTrueをテストするときに、MsgBoxを生成するのではなく、サブルーチンから私を排出しています。 IsAlpha関数が正しく呼び出されていませんか?
ルーチンが以下にリストされている場合:
Private Sub CmdMap_Click()
With TxtDxCode
If IsNumeric(Left(Me.TxtDxCode.Text, 1)) Then
MsgBox "Incorrect DX Code format was entered. ", vbExclamation, "DX Code Entry"
TxtDxCode.Value = ""
TxtDxCode.SetFocus
Exit Sub
End If
If IsAlpha(Left(Me.TxtDxCode.Text, 2)) Then
MsgBox "Incorrect DX Code format was entered. ", vbExclamation, "DX Code Entry"
TxtDxCode.Value = ""
TxtDxCode.SetFocus
Exit Sub
End If
End With
代わりに正規表現を使用しないのはなぜですか?その場合、ループは含まれません。
Public Function IsAlpha(strValue As String) As Boolean
IsAlpha = strValue Like WorksheetFunction.Rept("[a-zA-Z]", Len(strValue))
End Function
また、ユーザー定義関数(UDF)を作成するときは、戻り値が実際の関数の名前に割り当てられていることを確認する必要があります。この場合はIsAlpha
-IsLetter
ではなく、値が戻されることはありません。
これをIsAlpha
でお試しください
Public Function IsAlpha(strValue As String) As Boolean
Dim intPos As Integer
For intPos = 1 To Len(strValue)
Select Case Asc(Mid(strValue, intPos, 1))
Case 65 To 90, 97 To 122
IsAlpha = True
Case Else
IsAlpha = False
Exit For
End Select
Next
End Function
Left(Me.TxtDxCode.Text, 2)
は、文字列の最初の2文字を返します。したがって、Me.TxtDxCode.Textが7ZABCの場合、この式は「7Z」を返します。これにより、IsAlpha
テストが失敗します。
2番目の文字だけを調べたいので、代わりにMid $を使用します。
If IsAlpha(Mid$(Me.TxtDxCode.Text, 2, 1)) Then
これは "Z"を返し、IsAlpha
テストは成功するはずです。
(Left $、Mid $などの文字列バージョンは、Left、Midなどのバリアントバージョンよりもわずかに高速です- こちら を参照)