Microsoft Access 掲示板

検索文字列にハイライト 検索文字が複数に対応したい

12 コメント
views
4 フォロー

フィルターで検索する際に検索した文字列にハイライトを付けたいと思い、下記のリンクを参照にハイライトすることができました。
検索文字列をすべてハイライト表示で強調する

ですが、スペースを空けて複数の検索文字をしても複数の文字列にハイライトを付けるにはどうしたらいいでしょうか。

チョコラブ
作成: 2022/09/30 (金) 14:11:51
通報 ...
1
hatena 2022/09/30 (金) 18:32:33 修正

関数だけでは難しいので、VBAでユーザー定義関数を作成することになると思います。

標準モジュールに下記のような関数を作成します。

Public Function SearchHighlight(フィールド, 検索文字列, 色 As String) As String
    Dim s As String
    s = フィールド
    If s = "" Then Exit Function
    If Nz(検索文字列, "") = "" Then
        SearchHighlight = s
        Exit Function
    End If
    Dim i
    For Each i In Split(検索文字列)
        s = Replace(Nz("<p>" & s & "</p>", ""), Chr(13), "</p><p>")
        s = Replace(s, i, "<font style='background-color:" & 色 & ";'>" & i & "</font>")
    Next
    SearchHighlight = s
End Function

「感想リッチテキスト」のコントロールソースを下記のように設定します。

=SearchHighlight([感想],[検索文字列])

上記で一致した文字列の背景色は黄色になります。

もし、黄色以外にしたい場合は、第3引数に指定します。
例えば水色にしたい場合は下記になります。

=SearchHighlight([感想],[検索文字列],"#7FCCE3")

色は下記などを参照して # で始まる色コードで指定します。

WEBカラー見本一覧(基本色、セーフカラー)

2
チョコラブ 2022/10/01 (土) 08:00:50 9af1b@d60f0 >> 1

ありがとうございます。

試してみましたが、ハイライトにはならず、検索した文字が繰り返しコピーされてしまいました。
検索文字列に”〇〇” スペース ”〇〇” という風にスペースを空けた文字にハイライトを付けたいのですが。。。

3

あっ、すみません。修正前のコードをアップしてしまいました。

s = Replace(s, i, "<font style='background-color:" & 色 & ";'>" & s & "</font>")
の部分を下記に修正してください。
s = Replace(s, i, "<font style='background-color:" & 色 & ";'>" & i & "</font>")

上の回答も修正しておきました。

4
チョコラブ 2022/10/01 (土) 20:36:36 9af1b@d60f0 >> 3

複数検索文字がハイライトできました!ありがとうございます。

ですが、検索文字が増えるたび、スペースが一つ空くと1行改行されてしまいます。
おそらく検索文字列にスペースが入ってしまっているからだと思うのですが、
検索文字が3つあれば、2行改行されてしまうのですがそれはどうしたらいいでしょう?

検索文字が増えても改行せずにしたいです。

5

あっ、またまたすみません。
SearchHighlight関数を下記に修正してください。

Public Function SearchHighlight(フィールド, 検索文字列, Optional 色 As String = "#ffff00") As String
    Dim s As String
    s = Nz(フィールド)
    If s = "" Then Exit Function
    If Nz(検索文字列) = "" Then
        SearchHighlight = s
        Exit Function
    End If
    Dim color As String
    Dim i
    s = Replace("<p>" & s & "</p>", Chr(13), "</p><p>")
    For Each i In Split(検索文字列)
        s = Replace(s, i, "<font style='background-color:" & 色 & ";'>" & i & "</font>")
    Next
    SearchHighlight = s
End Function
6
チョコラブ 2022/10/02 (日) 08:40:27 a1353@d60f0 >> 5

思うとおりの動きができました!
ありがとうございます。

勉強になりました。

7
チョコラブ 2022/10/05 (水) 09:02:40 9af1b@93fe9

複数文字のハイライトができました。
ですが、たとえば"キズ"で調べたいとき、もしかしたら"キズ","きず"という言葉があるかも…ということで
"キズ","きず"で検索しましたら本来、キズで登録してるはずなのに、検索したらReplaceで置き換えられてしまい、きずという言葉になってしまいます。
漢字とカナは区別できているみたいですが、ひらがなとカタカナは区別しないみたいです。

ひらがなとカタカナを区別して検索する方法はありますか?

8
チョコラブ 2022/10/05 (水) 09:07:09 9af1b@93fe9 >> 7

ちなみにStrCompも試してみましたが、”s”がフィールドのため、文章全体と検索文字列を比較しているため
一致しないという結果になってしまいました。

9
チョコラブ 2022/10/05 (水) 09:26:05 9af1b@93fe9 >> 7

    For Each i In Split(検索文字列)
        If InStr(1, s, i, 0) > 0 Then
            s = Replace(s, i, "" & i & "")
        End If
    Next

  これでひらがな カナを区別できましたが、合っていますでしょうか。

10

InStr(1, s, i, 0) は最後の引数0でバイナリモードの比較になりますのでOKだと思いますが、
Replace関数の方でバイナリモードの比較にすればIf文は不要です。

    For Each i In Split(検索文字列)
        s = Replace(s, i, "<font style='background-color:" & 色 & ";'>" & i & "</font>", ,vbBinaryCompare)
    Next
11
チョコラブ 2022/10/05 (水) 11:00:50 a1353@b3d22 >> 10

replace関数でその通りにやってみましたが、ハイライトされませんでした...

12

また、ミスってました。たびたび済みません。
カンマが一つ足りませんでした。
下記に修正してください。

s = Replace(s, i, "<font style='background-color:" & 色 & ";'>" & i & "</font>", , ,vbBinaryCompare)