在“列”参数上使用变量时,RemoveDuplicates检索错误5:无效的过程调用或参数

时间:2019-08-13 13:55:21

标签: excel vba

我需要'RemoveDuplicates'上特定的'Selection',它可以随时具有任何行/列大小。我为'Columns'参数使用了Variant类型变量,但它正在获取'Error 5'。我的代码有什么问题?

下面共享的代码显示了宏如何从已知的CSV文件完整路径'RutaArchivo(i)'复制数据并将它们全部粘贴到一个唯一的工作簿'LibroTemporal(0)'中,一个又一个的工作簿。作为一个可能相关的信息,我需要在每个粘贴过程中插入一个'TextToColumns'过程,以便能够用正在编译的唯一数据的多少列来不断更新'Ancho'

'MiArray()''MiArray2()'是Variant类型变量,用于替换过程中的手动数组:'MiArray(1 To Ancho)'用于'TextToColumns'过程(它非常完美!),现在,在'MiArray2(1 To Ancho)'过程中使用了'RemoveDuplicates'(它不起作用...帮助!)。

请注意,我已省略了代码的其他部分,以避免出现不相关的信息,但是本部分将花很多时间来查找问题。不过,请随时询问您是否需要更多信息。

我知道这个问题已经被很多人提出,但是由于某种原因,它对我的​​案子没有任何帮助,我需要一些定制的支持。我已经在这里和其他网站上进行了一些研究,其中大多数(获得成功)以与我正在使用的解决方案(根据我的情况进行调整)相似的解决方案结束,但是我没有成功。

Dim LibroTemporal(1) As Workbook
Dim i As Integer
Dim j As Integer
Dim Ancho As Integer
Dim MiArray() As Variant
Dim MiArray2() As Variant

    For i = 1 To UBound(RutaArchivo)
        Workbooks.Open RutaArchivo(i)
        Set LibroTemporal(1) = ActiveWorkbook
        Cells(1, 1).Activate
        If Cells(2, 1) <> "" Then
            If Cells(1, 2) = "" Then
                Range(ActiveCell, ActiveCell.Offset(ActiveCell.End(xlDown).Row - 1, 0)).Select
            Else
                Range(ActiveCell, ActiveCell.Offset(ActiveCell.End(xlDown).Row - 1, ActiveCell.End(xlToRight).Column - 1)).Select
            End If
            Selection.Copy
            LibroTemporal(0).Activate
            ActiveCell.PasteSpecial (xlPasteValues)
            Ancho = Application.WorksheetFunction.Max(Selection.Columns.Count, 1 + Len(ActiveCell) - Len(Replace(ActiveCell, Chr(9), "")), Ancho)
            If Selection.Columns.Count = 1 Then
                ReDim MiArray(1 To Ancho)
                ReDim MiArray2(1 To Ancho)
                For j = 1 To Ancho
                    MiArray(j) = Array(j, 1)
                    MiArray2(j) = j
                Next j
                Selection.TextToColumns Destination:=Cells(1, 1), DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
                    :=(MiArray), TrailingMinusNumbers:=True
            End If
            ActiveCell.Offset(Selection.Rows.Count, 0).Select
        End If
        Application.DisplayAlerts = False
        LibroTemporal(1).Close
        Application.DisplayAlerts = True
    Next i

    Range(ActiveCell, Cells(1, 1).Offset(0, Ancho - 1)).Select
    Selection.RemoveDuplicates Columns:=(MiArray2), Header:=xlNo

我期望没有错误,并且重复删除成功,但是我得到了'Runtime Error 5: Invalid Procedure Call or Argument'

预先感谢。 AJ

1 个答案:

答案 0 :(得分:1)

我打算将其标记为重复,但发现当前的现有答案不能解决以下事实:使用变量作为列参数时可能会出现两个问题,都导致运行时错误5。

使用数组变量时,它必须基于0。所以,你需要写

ReDim MiArray2(0 To Ancho-1)
For j = 1 To Ancho
    MiArray2(j-1) = j
Next j

(不要对Myarray有所了解,但我认为这不是问题所在)

您必须将数组放入()中(您已经这样做了)

额外的一句话:您不需要Select语句,只需编写

Range(ActiveCell, Cells(1, 1).Offset(0, Ancho - 1)).RemoveDuplicates _
    Columns:=(MiArray2), Header:=xlNo