
■ ExcelVBAの文字列比較
社内に「特定の場所に置いているExcelファイルでのみ処理を許したい」っていう処理を作っている人がいたのですが、何やら手こずっているようで救助要請を受けました。
やっているのはこんな感じですね。
' 文字列比較のチェック
'
Sub aaa()
If ThisWorkbook.Path = "\\filesv\全社共有" Then
Debug.Print "一致"
Else
Debug.Print "不一致"
End If
End Sub
ThisWorkbook.path プロパティで自身の完全パスを取得して、あるべき場所(パス)を文字列にして単純にIF文で比較しているらしいのです。
パスをハードコーディングして良いのかとか思う所が無くはないのですが、まぁ問題なく動くと思うのですが...
■ 動かん
それで動くなら問い合わせなどしない訳ですよね。話によると、MsgBox関数で表示した限りでは同じに見えるのだが、実行するパソコンによってif文の判定結果が異なるらしいのです。
私自身も色々と試してみたのですが、見た目は明らかに同じ表示になっています。
そこで、色々と実験してみました。
①Cstr関数でString型に変換
②StrConv関数でUnicode変換(又は逆)
③String型の変数に格納
④FileSystemObjectを使って自パスを取得
って感じで、色々とかませてみたのですが上手く行きません。最初は型の違いかと思ったのですが、そういうわけではないようです。
そこで、1文字ずつ比較することにしました。
Sub bbb()
Dim a As String
Dim b As String
Dim i As Integer
a = ThisWorkbook.Path
b = "\\filesv\全社共有"
For i = 1 To Len(a)
If Mid(a, i, 1) <> Mid(b, i, 1) Then
Debug.Print "不一致"
Exit Sub
End If
Next
Debug.Print "一致"
End Sub
ってやったのですが、こちらは一致するんです。文字列全体だと不一致なのに、一文字ずつの比較だと一致する。
■ 対応
結局、文字列を比較する関数「StrComp」を使用して、強制的にテキストで比較することにしました。
Sub aaa()
If StrComp(ThisWorkbook.Path, "\\filesv\全社共有", vbTextCompare) = 0 Then
Debug.Print "一致"
Else
Debug.Print "不一致"
End If
End Sub
StrComp関数は、第一引数と第二引数に比較する文字列を設定、第三引数に比較モード(バイナリ or テキスト)を設定することが出来ます。文字列の比較をする時はこの関数を使うのがベストみたいですね。
■ 後書き
上では色々とやっていますが、実はバイナリの値が違ってるんじゃないかっていうのは最初から想像できていました。ただ、それを確認する手段が思いつかなかったので色々と回避策を試したのです。
今にして思えば、Hex関数で16進の値を確認するとかやりようはあったと思うんですけどね。
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end ---
スポンサードリンク


