2

VBA を使用して配列内のすべての重複を削除する方法があり、最初の値も削除されます。重複していない値を維持するだけです

例:

Array_1 ['pedro','maria','jose','jesus','pepe','pepe','jose']

結果:

Array_1 ['pedro','maria','jesus']
4

4 に答える 4

4

このコードを試してください:

Sub Remove_All_Duplicated()
Dim Array_1
    Array_1 = Array("pedro", "maria", "jose", "jesus", "pepe", "pepe", "jose")
Dim Array_2()

Dim eleArr_1, x
x = 0
For Each eleArr_1 In Array_1
    If UBound(Filter(Array_1, eleArr_1)) = 0 Then
        ReDim Preserve Array_2(x)
        Array_2(x) = eleArr_1
        x = x + 1
    End If
Next

End Sub

関数としての追加のソリューションFilterは、「完全一致」を気にしません。この新しいものには、VBA プロジェクトで Microsoft Scripting Runtime への参照が必要です。

Sub alternative()
Dim Array_1
    Array_1 = Array("pedro", "pedro maria", "maria", "jose", "jesus", "pepe", "pepe", "jose")
Dim Array_2()
Dim Array_toRemove()

Dim dic As New Scripting.Dictionary
Dim arrItem, x As Long
For Each arrItem In Array_1
    If Not dic.Exists(arrItem) Then
        dic.Add arrItem, arrItem
    Else
        ReDim Preserve Array_toRemove(x)
        Array_toRemove(x) = dic.Item(arrItem)
        x = x + 1
    End If
Next
For Each arrItem In Array_toRemove
    dic.Remove (arrItem)
Next arrItem
Array_2 = dic.Keys

'quic tests to remove when unnecessary
Debug.Print UBound(Array_2), UBound(Array_toRemove)
Debug.Print Join(Array_2, "/")

End Sub
于 2013-04-08T11:19:19.510 に答える
0

別のバージョンは次のとおりです。

Public Sub ShortVersion()
    Dim varInput: varInput = Array("pedro", "pedro maria", "maria", "jose", "jesus", "pepe", "pepe", "jose")
    Dim colOutput As Collection: Set colOutput = New Collection
    Dim i As Long: For i = LBound(varInput) To UBound(varInput)
        If UBound(Split(Chr(1) & Join(varInput, Chr(1) & Chr(1)) & Chr(1), Chr(1) & varInput(i) & Chr(1))) = 1 Then
            colOutput.Add varInput(i)
        End If
    Next i
End Sub

利点:

  • より短いコード
  • 決定基準は、ループの後の反復から独立しているため、アルゴリズムで構築すると、後の要素に関する決定を待たずに最初の要素に進むことができます。
  • MS Scripting Runtime に依存しない

短所:

  • 配列が大きいほど効率が悪い
  • 配列の代わりに Collection を出力します (必要に応じて、配列に変換するためのループが必要です)
  • 配列にはテキストのみが含まれ、ASCII 1 (SOH) はどこにも表示されないと仮定します (ただし、これはかなりの確率で発生します)。
于 2016-11-08T21:54:55.920 に答える