質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

3131閲覧

Access VBA ADO SQL LIKE で検索

kyousuke8957

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/07/24 12:12

編集2021/07/24 12:30

フルパスの値からフォルダを開くVBAを運用しています。
指定フォルダを開いたら、閲覧数をカウントしたくて新規でプロシージャを作成致しました。
フォルダ名・フォルダの中身は完全一致だが、フォルダの位置が違うパターンがあり、テーブルではそれぞれ登録されています。
フォルダ名が一致したフォルダは全て同一とみなしてカウントしたく作成しましたが、Likeで上手くHITしません。
ワイルドカードは、*と%を試しましたが、結果は変わらずでした。

フォルダ名は
[A会社(A)]「B」(20210724)【☆】サンプルA
といったパターンがほとんどです。

VBA

1Public Sub BrowsingCount(target As String) 2 Dim rs As ADODB.Recordset 3 Dim cn As ADODB.Connection 4 Dim sql As String 5 Dim target_count As Long 6 Set rs = New ADODB.Recordset 7 Set cn = CurrentProject.Connection 8 9 target = Mid(target, InStrRev(target, "\")) 10 target = Replace(target, "]", "[]]", , 1) 11 target = Replace(target, "[", "[[]", , 1) 12 13 14 sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '*" & target & " ' ;" 15 16 rs.Open sql, cn, adOpenKeyset, adLockOptimistic 17 If rs.EOF = True Then Exit Sub 18 target_count = Nz(rs("閲覧数"), 0) 19 Do Until rs.EOF = True 20 rs("閲覧数") = target_count + 1 21 rs.Update 22 rs.MoveNext 23 Loop 24 rs.Close 25 26 Set rs = Nothing 27 Set cn = Nothing 28End Sub

2021/7/24 21:26追記
◆期待する動き
「C:\tempA[A会社(A)]「B」(20210724)【☆】サンプルA」
「C:\tempB[A会社(A)]「B」(20210724)【☆】サンプルA」
「C:\tempC[A会社(A)]「B」(20210724)【☆】サンプルA」
「C:\tempA[B会社(A)]「B」(20210724)【☆】サンプルC」
「C:\tempB[B会社(A)]「B」(20210724)【☆】サンプルA」
「C:\tempC[C会社(A)]「B」(20210724)【☆】サンプルA」
があるとして、
検索するキーワードが 「[A会社(A)]「B」(20210724)【☆】サンプルA」のときは、上から3個をHITさせたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

odataiki

2021/07/24 12:24

回答が集まりやすいように質問文をもう少し追記した方が良いと思います。 ◆使用するデータベース  Access内部のテーブル  SQL-Server、Oracle?などですか? ◆期待する動き  例:フルパスの値が「C:¥temp¥A会社(A)¥ファイル名.txt」 だったとして  検索するキーワードが 「会社(A)」のときヒットさせたい みたいな感じです。
kyousuke8957

2021/07/24 12:31

編集致しました。 使用するデータベースについては、私の知識不足で理解出来ていなくて何を使用しているか分かりませんでした。
odataiki

2021/07/24 12:43

期待する動きはとてもわかりやすくなりました。 データベースの追記をお願いしたのは、 Access内部のテーブルの場合 LIKE検索では *(アスタリスク) 例えばSQL-Serverでは %(パーセント) というようにデータベースによって部分一致の識別子が異なるためです。
sazi

2021/07/25 00:39 編集

@odataikiさん ワイルドカードが変わるのは接続先の種類ではなく、ADOやDAOなどの接続方法によるものです。 接続先は、「CurrentProject.Connection」になっていますのでAccessですね。
guest

回答3

0

ベストアンサー

vba

1sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '*" & target & " ' ;"

上記の部分を下記に変更したらどうでしょう。

vba

1sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '%" & target & "';"

ADOの場合は、ワイルドカード文字は % (DAOの場合は *)

あと、修正前のコードだと、最後に半角空白が付いたものしか抽出されない。

追記

saziさんの回答を見て気づきましたが、ワイルドカードのエスケープも考慮する必要がありますね。
[[[]でエスケープする必要があります。
]はエスケープする必要がないです。[]]とするとうまくいきません。

あと、targetに\が含まれないときエラーになるのでそれも対策しておいた方がいいかも。

vba

1 Dim l As Long 2 l = InStrRev(target, "\") 3 If l > 0 Then target = Mid(target, l) 4' target = Replace(target, "]", "[]]", , 1) 不要 5 target = Replace(target, "[", "[[]", , 1) 6 7 sql = "SELECT フルパス, 閲覧数 FROM テーブル2 WHERE [フルパス] LIKE '%" & target & "';" 8

投稿2021/07/24 19:22

編集2021/07/25 01:38
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyousuke8957

2021/07/25 02:28

sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '*" & target & " ' ;" を sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '%" & target & "';" に変更したら、期待通りの動きになりました。 最後に空白が入っているのに気が付いていませんでした。 また']'の置き換えを削除して、MIDの対策も実装致しました。 エラー発生の可能性と対策案も教えて頂きありがとうございます。
guest

0

デバッグしてみました。
どうやら]のエスケープがされないみたいですね。
これはADOでもDAOでも同じでした。
検索対象も含めて違う文字に置換するか、任意の1文字(_)に置き換えるとかでしょうか。

VBA

1 target = Replace(target, "]", "_", , 1) 2 target = Replace(target, "[", "[[]", , 1) 3 4 sql = "SELECT フルパス, 閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '%" & target & "%';"

投稿2021/07/25 00:46

編集2021/07/25 00:49
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

使用するデータベースが何かわかりませんが、
Accessだとしたら下記のように末尾にもアスタリスクをつけるとHITするはずです。

sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '*" & target & "*';"

投稿2021/07/24 12:48

odataiki

総合スコア973

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyousuke8957

2021/07/24 12:56

sql = "SELECT フルパス,閲覧数 FROM T_タイトル WHERE [フルパス] LIKE '*" & target & "*';" としても、結果はHITしませんでした。
odataiki

2021/07/24 12:59

なるほど。アスタリスクを`%`にしてみてはどうでしょうか? それでも駄目なら使用しているデータベースの特定が先決ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問