2022年12月5日月曜日

vbaで英字or空白を含む文字列かを判定する方法

vbaで英字か空白を含む文字列であるか否かを判定するコードを考えてみた。

Function IsAlphabet(str As String) As Boolean  
  Dim objReg As Object
  Set objReg = CreateObject("VBScript.REgExp")
  objReg.IgnoreCase = True '大文字と小文字を区別しない
  objReg.Pattern ="^[a-zA-Z a-zAZ ]+$
  IsAlphabet = objREg.test(str) '英字か空白ならばTrue そうでなければFalse
  Set objReg = Nothing
End Fuction
或いは、以下のコード。
Function IsAlpha(str as String) As boolean
  If str ="" then
    IsAlpha = False
    Exit Fuction
  End if
  IsAlpha = Not str Like"*[!a-zA-Z a-zAZ ]*"
End Function  
で、これを何に使うのかというと、例えば、名前に英字が使われていれば、外国人の名前か否かの判定に使える。
ま、パーフェクトではないが、大体それでOKといういう場合に使える。完璧を求めると、大変なので、これぐらいで手を打とうという時に使う。

2022年12月1日木曜日

vbaでInStrでは1回で市川市を抽出できないが、InStrRevならば抽出できる。

 vbaでInStr(住所を示す文字列,"市")では、前から検索のため、市川市を抽出できない。ところが、InStrRevならば、後ろから検索なので、市川市を抽出できる。つまり、前から攻めて駄目(InStr)ならば、後ろから攻めろ(InStrRev)ってことだね。

Function AREA(address as String) as String
  If inStrRev(address,"市")>0 then
    AREA = Left(address,InstrRev(address,"市"))
  End If
End function
 最初は、以下のコードで市川市を特異点として特別に扱うこと(2段構造)で回避してたんだけど、InStrRevなら1回で済ませることができる。ググってみて分かった。皆さん、凄いね。賢い人がいるんですな。ちなみに、市川市の他に市原市も同じ罠にハマるけど、InStrRevならば、大丈夫。名前に市という文字を含む場合にはInStrRevで抽出すれば良い。
Function AREA(address as String) as String
  If inStr(address,"市川市")>0 then
    AREA = Left(address,Instr(address,"市")+2)
  ElseIf inStr(address,"市")>0 then
    AREA = Left(address,Instr(address,"市"))
  End If
End function