2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VBA 今日のトリビアReplaceではvbBinaryCompareを使う方が厳密で正しい Option Compare vbTextCompare vbTextBinaryの違い

Posted at

まとめ

  • Option Compareは省略するとBinaryModeなのでAccess書く以外意図的に必要がある場合以外は書かない方がよい。

  • 一般的にOfficeVBAでReplaceは実はバイナリモードが厳密で適切。

  • HelpにvbUseCompareOptionが記載されているがこの定数は実在せず、モジュール内では省略することでこの定数が指定されたとみなされる。ただしAccessのクエリ、フォームではvbTextcompareとみなされる

  • このためAccessのクエリ、フォームではvbTextCompareは意識して使う必要がある。

  • よってAccess以外はOption Compareは省略し、完全一致であればモジュール内ではvbBinaryCompareを書かなくても完全一致になるため。必要があるときvbTextCompareを指定するのみでよい。

  • しかし、コードのサンプルの場合はOption Compareで結果が変わるので、VbBinary等を指定した方がよい。

  • 可読性という意味では省略しない方がよい。

  • Accessはクエリとフォームは省略するとvbTextCompareなので注意。

  • Splitで空白や半角コンマを使う時はvbTextCompareは書く必要がない

  • バイナリモードとは全角、半角、大文字、小文字を区別するという意味で、機械語ではない。完全一致モードというべき。

  • テキストモードはは全角、半角、大文字小文字を区別しないという意味で、むしろ設定しない方がよい。

  • Option compare Text も同じ意味なので意図的に大文字小文字を区別しない必要がある場合以外設定しない方がよい。

  • Option Compare Databaseは大文字小文字を区別せず(テキストモード)、さらにロケールIDの文字コード順にするという意味になる。これはAccessしか使えない。

  • ただしAccessのvbDatabaseCompareは大文字小文字を区別しないのでAccessで文字でSplit、ReplaceをするときはvbBinaryCompareを使う方が厳密である。

  • Replaceのほか、InStr系が影響がある。

Option Compare

Docs/Office VBA Reference/ Language Reference / Statements / Option Compare ステートメント

模組の先頭に記述、省略するとvbTextBinary

Option Compare ステートメントを定義する場合は、必ずモジュールの先頭に定義する。
省略した場合Binaryになる。

Accessだけではなく、オフィス全般に関係がある

Office VBA Referenceの項目であるから、これはAccessだけでなく、Excelなど文字列操作があれば必ず関係がる

Option Compare ステートメントでは、モジュールの文字列比較方法 (Binary、Text、または Database) を指定します。 モジュールに Option Compare が含まれていない場合、既定のテキスト比較方法は Binary になります。

定数 説明 具体的な特徴
vbUseCompareOption -1 Option Compare ステートメントの設定を使用して比較を実行します。 Option Compare Databaseの場合 Binaryと同じ結果になる。ただしこのオプションはモジュール内では省略することで指定される。
vbBinaryCompare 0 バイナリ比較を実行します。 Windowsのコードの順。大文字、小文字を区別
vbTextCompare 1 テキスト比較を実行します。 システムロケールの順。だが大文字、小文字を区別しない。vbDatabaseCompareと同じ結果になる
vbDatabaseCompare 2 Microsoft Access のみ。 データベース内の情報に基づいて比較を実行します。 データベースのロケール ID 大文字、小文字は区別される ロケールID順のText
DirectShow の使い方 >DVD アプリケーション > スクリプトを使った DVD アプリケーションの作成
次の LCID に対するプライマリ言語 ID
日本語 0x0411 10進数 1041
前の項目に対する有効なプライマリ言語 ID の一部
日本語 0x11
Public Sub ShowLCID()
'https://blogs.yahoo.co.jp/name_voyage_earth/14156804.html
With Application.LanguageSettings
Debug.Print "0x" & String(4 - Len(CStr(Hex(.LanguageID(msoLanguageIDUI)))), "0") & Hex(.LanguageID(msoLanguageIDUI))
End With
End Sub

Option Compare Binary では、文字の内部バイナリ表現から導き出される並べ替え順序に基づいて文字列比較が行われます。 Microsoft Windows では、並べ替え順序がコード ページによって決まります。 次の例に、一般的なバイナリの並べ替え順序を示します。
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text では、システムのロケールによって決定される、大文字と小文字を区別しないテキストの並べ替え順序に基づいて文字列が比較されます。 Option Compare Text を使用して同じ文字を並べ替えると、テキストの並べ替え順序は次のようになります。
(A=a) < ( À=à) < (B=b) < (E=e) < (Ê=ê) < (Z=z) < (Ø=ø)
vbBinarycompare
バイナリモードで比較>完全一致
この正解は区切り文字を半角英数字にしたとき、大文字、小文字を区別するかしないか。

vbUseCompareOption

Option Compare Binary Access以外は省略でよい

Public Sub CheckCommandUseComp()
Dim ar, iar As Long
ar = Split("AaBaCa", "a")
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next
End Sub

結果
A
B
C

vbBinaryCompareと同じ結果になる。つまりOption Compare Databaseの場合、ロケールID順でかつ大文字、小文字を区別する

AccessのOption Compare Databaseの場合

Option Compare Database
Access
Public Sub CheckCommandUseComp()
Dim ar, iar As Long
ar = Split("AaBaCa", "a")
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next
End Sub

結果

B
C
省略しているためOption Compareで変わる。

vbBinaryCompare

Public Sub CheckCommandLineBinComp()
'Access Only
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim ar, iar As Long
ar = Split("AaBaCa", "a", -1, vbBinaryCompare)
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next
End Sub

結果
A
B
C
一般的に省略した場合はBinaryなので、Option Compareは特に設定しないほうが大文字、小文字を比較した厳密な比較になる。

vbTextCompare

Public Sub CheckCommandTxtComp()
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim ar, iar As Long
ar = Split("AaBaCa", "a", -1, vbTextCompare)
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next
End Sub

結果 Aaは区切り文字として扱われ長さ0の要素が2つあるため2行改行される

B
C

vbDatabaseCompare

これはAccessで起動してください

Option Compare Database

Public Sub CheckCommandDBComp()
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim ar, iar As Long
ar = Split("AaBaCa", "a", -1, vbDatabaseCompare)
For iar = LBound(ar) To UBound(ar)
Debug.Print ar(iar)
Next
End Sub

結果 Aaは区切り文字として扱われ長さ0の要素が2つあるため2行改行される

B
C

ここからDatabaseCompareはロケールID順で、大文字、小文字を区別しないということになる。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?