Microsoft Access 掲示板

長音記号を置換したい

9 コメント
views
4 フォロー

住所録を封筒に印字するためのレポートを作成しています。

例:株式会社zawazawa worldrescue株式会社
といった、アルファベットに囲まれた"ー"を"-"に置換するクエリを作成したいです。

前後がアルファベットに囲まれた"ー"というのをどのように抽出すればよいか分からず困っております。
また、例:株式会社zawaーzawaトーキョー のようなトーキョーの長音記号はそのままにしたいです。
よろしくお願い致します。

A
作成: 2024/02/20 (火) 09:40:46
最終更新: 2024/02/20 (火) 09:48:21
通報 ...
1
すずやん 2024/02/20 (火) 11:15:57

以前も同じような質問がありましたが、プログラムでは「zawaーzawa」→変換対象、「トーキョー」→問題ないので変換しない、という判断が難しいと思います。

「半角文字に囲まれている場合は変換対象」等では判断できるかもしれませんが、そういった複雑な判断はクエリにあまり向きません。

2
Anonymous 2024/02/20 (火) 11:29:07 23e8e@44ebd >> 1

なるほどです。
であれば、前後がアルファベット(大文字・小文字問わず)だけであれば抽出は可能でしょうか?

4
すずやん 2024/02/20 (火) 13:56:40 >> 2

その場合も「前後がアルファベットに挟まれた「ー」の場合は置換する」という判断をクエリで行うのがとても難しいと思います。
不可能では無いかもしれませんが、クエリにこだわらないほうが良いかと。

mayuさんが下記に例を記載されていますが、このようなVBAを使用する方法が良いのではないかと思います。

6
Anonymous 2024/02/20 (火) 17:57:48 23e8e@44ebd >> 2

アルファベットに囲まれた"ー"を含むレコードを抽出するだけであれば可能でしょうか?という意味です!
抽出したレコードのどの"ー"を置換するかは、フォームか選択クエリ上で目視・手動で行おうと思います。

ですので抽出条件のみ書き方が分かればOKかなと思います。

7

ですので抽出条件のみ書き方が分かればOKかなと思います。

 
Access-SQLの構文で抽出条件を記述するなら

SELECT * FROM テーブル名
WHERE フィールド名 Like '*[a-z]ー[a-z]*'
;

になります

ただし、Access-SQLには以下のような問題があるようなので

長音「ー」を含むデータをクエリであいまい抽出すると
クエリでLike演算子を使用してあいまい抽出すると合致しないデータが抽出されてしまうというバグがあります。それを知らないと想定外の結果になりあわせるということになりますので注意が必要です。 また、それに対する対応策も紹介します。 難易度:...
Fc2

参照先のコンテンツに掲載されているラッパー関数を用いて
以下のように記述すればいいでしょう

SELECT * FROM テーブル名
WHERE ILike(フィールド名, '*[a-z]ー[a-z]*')
;
8
すずやん 2024/02/21 (水) 08:33:35 >> 2

そういう引当ての方法は知りませんでした。参考になります!

9
Anonymous 2024/02/21 (水) 09:31:28 23e8e@44ebd >> 2

お二人ともありがとうございます!

3

■正規表現版

Public Function SampleA(ByVal argStr As String _
                      , ByVal argSrc As String _
                      , ByVal argDst As String) As String
    If Len(argStr) < 2 Then
        SampleA = argStr
        Exit Function
    End If
    
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = "([a-z])(" & argSrc & ")([a-z])"
        If .Test(argStr) Then
            SampleA = .Replace(argStr, "$1" & argDst & "$3")
        Else
            SampleA = argStr
        End If
    End With
End Function

 
■InStr関数+ループ版

Public Function SampleB(ByVal argStr As String _
                      , ByVal argSrc As String _
                      , ByVal argDst As String) As String
    If Len(argStr) < 2 Then
        SampleB = argStr
        Exit Function
    End If
    
    Dim pos    As Long
    Dim front  As String
    Dim back   As String
    Dim target As String
    
    pos = 1
    target = argStr
    
    While pos > 0
        pos = InStr(pos + 1, target, argSrc, vbBinaryCompare)
        If pos > 0 And pos < Len(argStr) Then
            back = Mid$(target, pos - 1, 1)
            front = Mid$(target, pos + 1, 1)
            If StrConv(front & back, vbLowerCase) Like "[a-z][a-z]" Then
                Mid(target, pos, 1) = argDst
            End If
        End If
    Wend
    
    SampleB = target
End Function

 
■SQL

SELECT
    SampleA(
        '株式会社zawaーZawa worldーrescue株式会社トーキョー'
      , 'ー'
      , '▼'
    ) as a
    , SampleB(
        '株式会社zawaーZawa worldーrescue株式会社トーキョー'
      , 'ー'
      , '▲'
    ) as b
;

■結果

AB
株式会社zawa▼Zawa world▼rescue株式会社トーキョー株式会社zawa▲Zawa world▲rescue株式会社トーキョー
5
Anonymous 2024/02/20 (火) 17:52:17 23e8e@44ebd >> 3

コード提示ありがとうございます。
確認してみます。