首页 > 解决方案 > RemoveDuplicates 检索错误 5:在“列”参数上使用变量时,过程调用或参数无效

问题描述

我需要'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'

提前致谢。阿杰

标签: excelvba

解决方案


我正要将此标记为重复,但发现当前现有的答案并没有解决使用变量作为列参数时可能存在两个问题的事实,这两个问题都会导致运行时错误 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

推荐阅读