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
;
以前も同じような質問がありましたが、プログラムでは「zawaーzawa」→変換対象、「トーキョー」→問題ないので変換しない、という判断が難しいと思います。
「半角文字に囲まれている場合は変換対象」等では判断できるかもしれませんが、そういった複雑な判断はクエリにあまり向きません。
なるほどです。
であれば、前後がアルファベット(大文字・小文字問わず)だけであれば抽出は可能でしょうか?
その場合も「前後がアルファベットに挟まれた「ー」の場合は置換する」という判断をクエリで行うのがとても難しいと思います。
不可能では無いかもしれませんが、クエリにこだわらないほうが良いかと。
mayuさんが下記に例を記載されていますが、このようなVBAを使用する方法が良いのではないかと思います。
アルファベットに囲まれた"ー"を含むレコードを抽出するだけであれば可能でしょうか?という意味です!
抽出したレコードのどの"ー"を置換するかは、フォームか選択クエリ上で目視・手動で行おうと思います。
ですので抽出条件のみ書き方が分かればOKかなと思います。
Access-SQLの構文で抽出条件を記述するなら
になります
ただし、Access-SQLには以下のような問題があるようなので
参照先のコンテンツに掲載されているラッパー関数を用いて
以下のように記述すればいいでしょう
そういう引当ての方法は知りませんでした。参考になります!
お二人ともありがとうございます!
■正規表現版
■InStr関数+ループ版
■SQL
■結果
コード提示ありがとうございます。
確認してみます。