[謎]Access テーブルを表示させて、ピリオドを含むファイル名フィールドにフィルターをかけるときの奇怪な現象

# MS Access でテーブルをデータシート表示させている状態
例えば

Xという名前のテーブルの

ファイル名(filename)というフィールドで

|ファイル名(filename)|
|:----------------:|
|PrinterStatus.vbs|
|Textfile.txt|
|CsvFile.csv|

というようにファイル名が並んでいます。

このようなテーブルXのFilename fieldでフィルターをかけてPrinterStatus.vbsのレコードが抽出表示できるか。

 

## セオリーどおりだと

普通は

フィルター>テキストフィルター>指定の値に等しい

としてユーザー設定のフィルター欄に

PrinterStatus.vbsと入力すると思います。

しかしこれでは探せません。

## 日本語名のファイル名+拡張子はOK

ただしファイル名が日本語、たとえば
テキストファイル.txt
だと抽出できます。

## 分析
PrinterStatus.vbsをいれてレコードが表示されない状態で、

ホームタブ>並べ替えとフィルター>詳細設定(左クリック)>フィルター/並べ替えの編集

にしてみます。

これはクエリのデザインフィールドに似ています。

そこで抽出条件をみると

[PrinterStatusInfo].[vbs]

とこのように勝手にカッコがついています。

 
## 解決方法

フィルター>テキストフィルター>指定の値に等しい

若しくは並べ替えの編集の抽出条件において

“PrinterStatus” & “.vbs”
と後ろにピリオドをつけて分割すると検索できます。

### クエリで実証(6/19追加)
それではフィルターではなくクエリで起きるのでしょうか？以下のコードでテーブルからクエリまですべて出来上がります。
#### フィルターとクエリは相互に読み込んだり変換できる
[フィルタを適用して選択したレコードを表示する](https://support.office.com/ja-jp/article/%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%81%A6%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92-access-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-2a493ded-e544-4144-9103-b9b1d1865147)
##### フィルターの特殊コマンド[クエリから読み込み] [クエリとして保存]
>[フィルター] ドキュメント タブの特殊なコマンド
2 つの特別なコマンドを表示する利用、 フィルターの文書] タブ。タブのデザイン グリッドの上にある任意の場所を右クリックすると、 クエリの読み込みとショートカット メニューの [クエリとして保存コマンドを利用します。
[クエリから読み込み] をクリックすると、選択したクエリのデザインがグリッドに読み込まれます。これにより、クエリ条件をフィルター条件として使用できます。
>[クエリとして保存] をクリックすると、フィルター設定を新しいクエリとして保存できます。
##### 初心者はこちらからクエリを作ってもよいのでは?
　このようにフィルターとクエリは近い関係にある。初心者はフィルターの方がExcelと近いし、何より見た目で結果を確認できるのでわかりやすい。こちらから作って徐々に慣れる方がいいのかもしれません。

#### コード

```visualbasic
Sub ctbls()
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim tdf As TableDef
Dim sSQL As String
Dim Q As QueryDef
Dim dRS As DAO.Recordset
On Error Resume Next
DoCmd.DeleteObject acTable, "X"
DoCmd.DeleteObject acQuery, "QS_X1"
DoCmd.DeleteObject acQuery, "QS_X2"
DoCmd.DeleteObject acQuery, "QS_X3"
On Error GoTo 0
DoCmd.RunSQL "CREATE TABLE X (filename Text(255));"
Set dRS = cDB.OpenRecordset("X")
dRS.AddNew
dRS.Fields(0).Value = "PrinterStatus.vbs"
dRS.Update
dRS.AddNew
dRS.Fields(0).Value = "Textfile.txt"
dRS.Update
dRS.AddNew
dRS.Fields(0).Value = "CsvFile.csv"
dRS.Update
dRS.AddNew
dRS.Fields(0).Value = "テキストファイル.txt"
dRS.Update
' Make Query
'デザインビューでPrinterStatus.vbsを貼り付けるとやはり以下のように修正されてしまう。結果はパラメーターを求められる
sSQL = "SELECT X.[filename] FROM X WHERE (((X.[filename])=[PrinterStatus].[vbs]));"
cDB.CreateQueryDef "QS_X1", sSQL
cDB.QueryDefs.Refresh: Application.RefreshDatabaseWindow
'テキストファイル.txtだとX1のような修正がなくクエリができる
sSQL = "SELECT X.[filename] FROM X WHERE (((X.[filename])=""テキストファイル.txt""));"
cDB.CreateQueryDef "QS_X2", sSQL
cDB.QueryDefs.Refresh: Application.RefreshDatabaseWindow
'PrinterStatus.vbs
'イミディエイトでこのように表示されるように二重引用符を使う。>SELECT X.[filename] FROM X WHERE (((X.[filename])="PrinterStatus" & ".vbs"));
sSQL = "SELECT X.[filename] FROM X WHERE (((X.[filename])=""PrinterStatus"" & "".vbs""));"
cDB.CreateQueryDef "QS_X3", sSQL
cDB.QueryDefs.Refresh: Application.RefreshDatabaseWindow

End Sub
```

#### 結果

|クエリ名|結果|
|:----:|:----:|
|QS_X1|パラメーターを要求される、失敗|
|QS_X2|スムーズに成功|
|QS_X3|スムーズに成功|

そもそもクエリをデザインビューで作成し抽出条件に
PrinterStatus.vbs
を張り付けると勝手に
[PrinterStatus].[vbs]
になってしまいます。つまりフィルターと全く同じ現象が起きるのです。
VBAは二重引用符の数に注意するのでめんどくさいです。この点からもフィルターからクエリはわかりやすいでしょう。


 

##ワイルドカードというわけでもないらしい

[*を含むデータを抽出したい - relief](https://www.relief.jp/docs/000705.html)

>アスタリスク (\*)、疑問符 (?)、シャープ記号 (#)、開き角かっこ ([)、またはハイフン (-) など他のワイルドカード文字を検索するには、それらを角かっこで囲む必要があります。
「\*」を含むデータのあるフィールドの［抽出条件］欄に
「Like "\*" & "[\*]" & "\*"」
「&」を使わずに
「Like "\*[\*]\*"」
 と記述しても同じ結果となります
> とあります。
しかし
"PirnterStatue" & "[.]" & "vbs"
は失敗します。ピリオドはワイルドカードではないようです。
"PrinterStatusInfo[.]vbs"
これもダメです。

 

## 公式のTIPSにも書いていない

[フィルターを適用して選択したレコードを Access データベースに表示する](https://support.office.com/ja-jp/article/%e3%83%95%e3%82%a3%e3%83%ab%e3%82%bf%e3%83%bc%e3%82%92%e9%81%a9%e7%94%a8%e3%81%97%e3%81%a6%e9%81%b8%e6%8a%9e%e3%81%97%e3%81%9f%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92-access-%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ab%e8%a1%a8%e7%a4%ba%e3%81%99%e3%82%8b-2a493ded-e544-4144-9103-b9b1d1865147?ui=ja-JP&rs=ja-JP&ad=JP)

>Tip:  Certain characters, such as \*, %, and ?, have a special meaning when specified in a filter text box. For example, \* represents a string of characters, so the string a\* will match any string that begins with a, and not only the literal string a\*. To disregard the special meaning of a character, enclose it in square brackets [], like this: a[\*]. Databases that use the ANSI-89 standard treat \*, ?, [, ], !, -, and \# as special characters. Databases that use the ANSI-92 standard treat %, _, [, ], ^, and - as special characters. You can use either standard with Access, but you cannot mix the two standards (e.g., ?a\*) in a particular expression..

## 日本語(少し訳して補っています)

>ヒント: 次のようなの特定の文字 \*、%、?、をフィルターテキスト ボックスに指定する場合は、特別な意味があります。たとえば、\* は複数の任意の文字を表します。a\*と入力するとaから始まる任意の文字列にマッチします。ワイルドカードとしない場合には、次のように角かっこで囲みます。 [\*]。
　Ansi-89 標準を使用するデータベースでは
\*、?、[,], ! 、-、 \#  を特殊文字として扱います。
　Ansi-92 を使用するデータベースでは、
%, [,] , ^ , - を特殊文字として扱います。
　Ansi-89はワイルドカードはアスタリスクですが、ANSI-92はパーセント記号です。
　Access では、いずれかの標準を使用することができますが、同時に混在させることはできません。
　たとえば
?a\*
　というような表現はワイルドカードとして扱われません。

## しかしピリオド(.)はない
上記の記述はreliefさんと同じであるが、やはりピリオドはない。
[Accessデータベース作業の際使用すべきではない特殊文字](https://support.microsoft.com/ja-jp/help/826763/error-message-when-you-use-special-characters-in-access-databases)
>Microsoft Access では、データベースのオブジェクト名やフィールド名に番号記号 (\#)、ピリオド (.)、または二重引用符 (") などの特殊文字を使用することは制限されていません。ただし、特殊文字を使用すると、予期しないエラーが発生することがあります。

これはフィールド名は確かにある。しかし今回はフィールドの中のバリュー(値）なのだ。


### 4年過ぎて追記

[Accessでクエリの抽出条件にピリオドが入ると自動的に[aaaa].[bbbb]のように自動的に変換がされてしまう ](https://answers.microsoft.com/ja-jp/msoffice/forum/all/access%E3%81%A7%E3%82%AF%E3%82%A8%E3%83%AA/273f95c5-517a-490b-a357-2d5860bfe124)
これを当初書いた2018/06、その前月にこんな問があった。当初はフィルターがクエリだとは知らなかったために見逃したようだ。


> Access 2013およびAccess 2016でクエリの抽出条件にピリオドが入ると、自動的に[aaaa].[bbbb]のように自動的に変換がされることがあります。
これを自動的に変換されないようにすることはできないのでしょうか。
たとえばテキストフィルターで「指定の値に等しい」を使用して microsoft.com と条件を入力すると、
「パラメータの入力」画面が表示され microsoft.com に対する値を入力するよう促されます。
そこでフィルターの編集画面を開くと抽出条件のところが [microsoft].[com]となっており、これがパラメータと認識されてしまっているようです。
ユーザの意図としては microsoft.com という文字列に等しいものをフィルタしたかっただけなのですが、
勝手にパラメータとして認識されてしまい結果正しくフィルタされないという状況になっています。
"microsoft.com"のようにダブルクォーテーションで囲めば検索できることはわかっていますが、
そうしなくても正しくフィルタできるように、自動変換がされないようにすることが希望です。
恐れ入りますが、解決策があれば教えていただけないでしょうか。
よろしくお願い致します。
---
>テキストフィルターで「指定の値に等しい」を使用して microsoft.com と条件を入力すると、 抽出条件が[microsoft].[com]になってしまうのですね。
[参考]フィルターを適用して選択したレコードを Access データベースに表示する
手元の Access 2016 で確認しましたが、文字列の間にピリオドを使用すると同じ結果となりました。
<FONT COLOR=RED>回避方法は  さんが書かれている様に、"microsoft.com"のように、文字列にピリオドが含まれる場合はダブルクォーテーションで囲むという方法を取って貰うようにするしかないのかな、と思います。</FONT>
何か有効な情報をお持ちの方がいらっしゃいましたら、書き込み下さいますようお願い致します。
</blockQuote>