Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2013)
数値の中の文字列の開始位置
投稿日時: 20/02/12 19:13:20
投稿者: えあろん

アクセスのクエリで数値の中に
文字列が何か入っていればその開始位置を返すといった
関数ややり方はないでしょうか?
例として
2-18-20豊洲ハイツ203 であれば8
 
3313林ハイツ であれば5といったような
 
Instr 関数でワイルカードが使用できればいいのですが
使用できません。
 
何かやり方はありますか?

回答
投稿日時: 20/02/13 15:26:59
投稿者: hatena
投稿者のウェブサイトに移動

標準の関数ではないですので、関数を自作することになります。
 
ループで一文字ずつチェックしていくか、正規表現を使うか。
 

投稿日時: 20/02/13 15:41:11
投稿者: えあろん

hatenaさん
返信ありがとうございます。
関数を自作もしくは
ループでという事はVBAですか?
やはり関数では無理そうですかね。。。

回答
投稿日時: 20/02/13 16:15:14
投稿者: mayu.

一般機能のみで実現するのは、難しいでしょう。
ユーザ定義関数を自作するという方法は、必然的にVBAになります。
以下は、hatenaさんの回答を実装した例
 

Public Function air1(ByVal arg) As Long
    air1 = 0
    If (LenB(Nz(arg)) = 0) Then Exit Function
    
    Dim i As Long
    For i = 1 To Len(arg)
        If (Mid$(arg, i, 1) Like "[!0-90-9-]") Then
            air1 = i
            Exit Function
        End If
    Next i
End Function

とか
 
Public Function air2(ByVal arg) As Long
    air2 = 0
    If (LenB(Nz(arg)) = 0) Then Exit Function
    
    With CreateObject("VBScript.RegExp")
        .Global = False
        .Pattern = "([^0-90-9-])"
        If (.Test(arg)) Then
            air2 = InStr(1, arg, .Execute(arg).Item(0), vbBinaryCompare)
        End If
    End With
End Function

■ SQL
SELECT '2-18-20豊洲ハイツ203 = ' & air1( '2-18-20豊洲ハイツ203' ) &
       ', 3313林ハイツ = '       & air2( '3313林ハイツ' )

■ 結果
2-18-20豊洲ハイツ203 = 8, 3313林ハイツ = 5

投稿日時: 20/02/13 16:19:42
投稿者: えあろん

mayuさん
 
返信ありがとうございます。
ご丁寧にありがとうございます。
VBA使わせて頂きます!