【问题标题】:Remove reverse duplicates from VBA array从 VBA 数组中删除反向重复项
【发布时间】:2020-02-23 16:52:23
【问题描述】:

我需要从数组中删除反向重复。

1,22,1 我想删除2,1,因为它的反向是1,2 的重复。

Sub go()
    Dim arr() As String
    ReDim Preserve arr(0)

    Dim i, k As Integer

    For i = 1 To 2
        For k = 1 To 10    
            If i <> k Then
                arr(UBound(arr)) = i & "," & k
                ReDim Preserve arr(UBound(arr) + 1)
            End If
        Next
    Next
    'Debug.Print Join(arr, vbCrLf)

    For z = 0 To UBound(arr)
        For q = 0 To UBound(arr)    
            rev = StrReverse(arr(z))
            If arr(q) = rev Then
                Debug.Print arr(z) & "-" & rev
            End If
        Next
    Next
End Sub

【问题讨论】:

  • 你能解释一下你的问题是什么,或者这怎么行不通?
  • 我不知道如何从 arr() 数组中删除 2,1 重复项。
  • 也许只是将它复制到一个新数组中?您不想更改您在循环中迭代的数组。
  • 添加到@Jeremy 评论,你可以有一个循环来遍历你的数组。在循环中有一个集合。检查您当前的项目是否存在于集合中,如果不存在,则添加到集合和新数组中
  • 不相关,但以下行很可能与您认为的不同:Dim i, k As Integer。您实际上在这里声明的是Dim i As Variant, k As Integer。 VB6 和 VBA 不支持在 one 语句中将多个变量声明为某种数据类型。如果要将两者都声明为Integer,则声明需要类似于Dim i As Integer, k As Integer

标签: excel vba duplicates reverse


【解决方案1】:

正如 cmets 所说,最简单的方法是创建一个新数组并向其中添加元素。同样正如 Hel O'Ween 所说,VBA 变量需要像下面这样的显式声明。

Public Sub goTest()

Dim inputArray() As String
ReDim Preserve inputArray(0)
Dim resultArray() As String
ReDim Preserve resultArray(0)

Dim i As Long, j As Long
Dim rev As String, notDuped As Boolean

'[[-- Loop to generate the test array
For i = 1 To 2
    For j = 1 To 10
        If i <> j Then
            inputArray(UBound(inputArray)) = i & "," & j
            ReDim Preserve inputArray(UBound(inputArray) + 1)
        End If
    Next j
Next i
'--]]

'The actual reverse removed code
For i = 0 To UBound(inputArray)
    rev = StrReverse(inputArray(i))
    notDuped = True
    For j = 0 To i 'Only loop up to the current point, not all of the array
        If inputArray(j) = rev Then
            notDuped = False
            Exit For
        End If
    Next j
    If notDuped Then 'If no reverse found add to new array
        resultArray(UBound(resultArray)) = inputArray(i)
        ReDim Preserve resultArray(UBound(resultArray) + 1)
    End If
Next i

'[[-- To check that it worked
For i = 0 To UBound(resultArray)
    Debug.Print (resultArray(i))
Next i
'--]]

End Sub

代码的底部仅输出结果数组,因此您可以看到它没有反转,它与代码正常工作无关。

如果您对此有任何问题,请给我留言,我会尽快回复您。

【讨论】:

  • 谢谢,它完成了这项工作。我只需要更改'实际的反向删除代码 For i = 0 To UBound(inputArray) rev = StrReverse(inputArray(i)).
  • 没问题 J Doe。你能告诉我为什么我需要改为 0 而不是 1 吗?
  • 因为设置 i = 1 将删除 1,2 和 2,1。但我想保留 1 个重复项,因此设置 i = 0 保留 1,2 并删除 2,1。可能我没有说清楚我需要什么。很抱歉。
  • 不,你解释得很好,这更像是我忘记了跳过第一个元素,因为它不能有重复项也会跳过将其添加到结果中。
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
相关资源
最近更新 更多