Microsoft Access 掲示板

ふたつのテキストボックスにある文字列を比較したい / 1

6 コメント
views
1

テキストボックスA="あいうえおかきく"
テキストボックスB="かきくけこさしす"
のとき、"かきく" が重複していると判定し
テキストボックスB="けこさしす"に変換したい

シンプルに、テキストボックスBに入力された文字列を一文字ずつチェックしていけばいいでしょう
 

Function OnesideUnique(ByVal argA As Variant, ByVal argB As Variant) As Variant
    OnesideUnique = argB
    If (LenB(Nz(argA)) = 0 Or LenB(Nz(argB)) = 0) Then Exit Function
    Dim i      As Long
    Dim c      As Long
    Dim buff() As String
    
    For i = 1 To Len(argB)
        If (InStr(1, argA, Mid$(argB, i, 1), vbBinaryCompare) = 0) Then
            ReDim Preserve buff(c)
            buff(c) = Mid$(argB, i, 1)
            c = c + 1
        End If
    Next i
    If (UBound(buff) > -1) Then
        OnesideUnique = Join(buff, "")
    End If
End Function

 
テキストボックスA, Bともにフォーム上に設置したコントロールだと仮定すると
コマンドボタンのクリック時イベント等で結果を確認するといいでしょう

Private Sub コマンドボタン名_Click()
    Me.テキストボックスB.Value = _
        OnesideUnique(Me.テキストボックスA.Value, Me.テキストボックスB.Value)
End Sub
通報 ...
  • 3
    mayu 2025/01/25 (土) 09:19:49 修正 fc5d2@6c788 >> 1

    慧眼のhatenaさんが仰せのように、もし 連続した複数文字列を対象 とするのでしたら
    「連続」の定義、つまり最小で何文字連続している必要があるのか
    を明確にする必要があるでしょう

    テキストボックスA = "あいうえおかきく"
    テキストボックスB = "[@あいうえお@おかき@きくうえお@いうえおかういあいうえおかきおかく]"

    Bの文字列で「 連続3文字以上で構成された語句でAに対する最長マッチ 」を繰り返す
    と定義した場合、

    [@あいうえお@おかき@きくうえお@いうえおかういあいうえおかきおかく]

    Bからは、背景色を付与した5箇所の語句を検知( グレーアウト部分は長さが不足 )し、
    最終的に

    テキストボックスB = "[@@@きく@ういおかく]"
    

    をご希望の結果とするサンプルも載せておきます
     

    Function OnesideUniqueX(ByVal argA As Variant _
                          , ByVal argB As Variant _
                          , Optional ByVal argMinimum As Long = 3 _
                          , Optional ByVal argPos As Long = 1) As Variant
        OnesideUniqueX = argB
        Dim i    As Long
        Dim j    As Long
        Dim buff As String
    
        If (LenB(Nz(argA)) = 0 Or LenB(Nz(argB)) = 0) Then Exit Function
        If (argMinimum < 1 Or argPos < 1) Then Exit Function
    
        For i = argPos To Len(argB) - argMinimum + 1
            If (InStr(1, argA, Mid$(argB, i, argMinimum), vbBinaryCompare) > 0) Then
                buff = Mid$(argB, i, argMinimum)
    
                For j = i + argMinimum To Len(argB)
                    buff = buff & Mid$(argB, j, 1)
                    If (InStr(1, argA, buff, vbBinaryCompare) = 0) Then
                        OnesideUniqueX = _
                            OnesideUniqueX(argA, Left$(argB, i - 1) & Mid$(argB, j), argMinimum, i)
                        Exit Function
                    End If
                Next j
                OnesideUniqueX = Left$(argB, Len(argB) - Len(buff))
                Exit Function
            End If
        Next i
    End Function
    

     

    Private Sub コマンドボタン名_Click()
        '// 重複と見なす文字列の最小連続長は関数の第三引数で指定します
        Me.テキストボックスB.Value = _
            OnesideUniqueX(Me.テキストボックスA.Value, Me.テキストボックスB.Value, 3)
    End Sub