Microsoft Access 掲示板

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

6 コメント
views
2
hatena 2025/01/25 (土) 00:09:26 修正

例をみると連続した複数文字列を対象にするようにも思えますが、
一文字単位でも重複していれば削除するという仕様であれば、
mayuさんのコードでいいでしょう。
単純に下記でも同様の結果になります。

Function RemoveDuplicates(ByVal argA As Variant, ByVal argB As Variant) As Variant
    RemoveDuplicates = argB
    If argA <> "" And argB <> "" Then
        Dim i      As Long
        For i = 1 To Len(argA)
            RemoveDuplicates = Replace(RemoveDuplicates, Mid(argA, i, 1), "")
        Next i
    End If
End Function
通報 ...
  • 4
    hatena 2025/01/25 (土) 11:06:02 修正 >> 2

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

    mayuさんの上記の定義を仕様とする場合は下記のコードでもよさそう。

    Function RemoveDuplicatesX(ByVal argA As Variant _
                          , ByVal argB As Variant _
                          , Optional ByVal argMinimum As Long = 3) As Variant
        RemoveDuplicatesX = argB
        Dim lA As Long, lB As Long, l As Long
        lA = Len(Nz(argA))
        lB = Len(Nz(argB))
        If lA < argMinimum Or lB < argMinimum Then Exit Function
        If lB < lA Then l = lB Else l = lA
        
        Dim i As Long, j As Long
        For i = l To argMinimum Step -1
            For j = 1 To lA - i
                RemoveDuplicatesX = Replace(RemoveDuplicatesX, Mid(argA, j, i), "")
            Next
        Next
    End Function
    
    Private Sub コマンドボタン名_Click()
        '// 重複と見なす文字列の最小連続長は関数の第三引数で指定します(省略時は3)
        Me.テキストボックスB.Value = _
            RemoveDuplicatesX(Me.テキストボックスA.Value, Me.テキストボックスB.Value)
    End Sub
    
    5
    mayu 2025/01/25 (土) 14:43:28 修正 fc5d2@6c788 >> 4

    hatenaさんのコード、シンプルで素敵ですね
    RemoveDuplicatesX 関数の内側ループ、終了の数値を 1 だけ足せば更に完璧かもです

    -         For j = 1 To lA - i
    +         For j = 1 To lA - i + 1
    
    6

    mayuさん、バグのご指摘ありがとうございます。
    理由も含めてのていねいな解説、納得です。