Excel VBA:如何将变量数组元素(行号)连接到范围对象?

时间:2018-01-25 05:01:23

标签: arrays vba excel-vba concatenation excel

我研究了这个问题,但找不到我想要的具体答案,实际上我现在更加困惑。

我创建了一个宏,它将遍历工作表上的行,并对每行中查找特定值是否存在的多个单元格运行布尔检查,或者计算特定不等式的结果。在这些检查的基础上,宏可能会也可能不会将行号传递到特定的数组中。那部分工作正常。

我的问题是,现在我有行号(存储在变量数组中) - 我无法弄清楚如何将数据正确地连接到一个范围,然后对这些项进行批量excel操作。我想要做的是创建一系列这些值,然后一次删除所有这些行而不是循环。

我的宏在我的工作计算机上,但是我写的这些内容应该解释我想要做的事情:

    Sub Test()
Dim Str As String
Dim r As Range
Dim i, a As Integer
Dim Count As Integer
Dim RngArray()



Count = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "A:A").End(xlUp).Row
ReDim RngArray(Count)


a = 0
For i = 1 To Count
    If Not i = Count Then
        RngArray(a) = i
        Str = Str & RngArray(a) & ":" & RngArray(a) & ", "
        a = a + 1
    ElseIf i = Count Then
        RngArray(a) = i
        Str = Str & RngArray(a) & ":" & RngArray(a)
        a = a + 1
    Else: End If
Next i

Set r = Range(Str)'Error Can Appear here depending on my concatenation technique
Range(Str).EntireRow.Delete 'error will always appear here

End Sub

我在这里结合了几个步骤并省略了任何布尔检查;在我的实际宏中,数组中的值已经存储,我从LBound循环到UBound并将这些值连接成一个表格的字符串(" 1:1,2:2,3:3,.... ,n:n")

我这样做的原因是行遍布在工作表上,我想达到可以传递参数的点

Range("1:1, 2:2, 3:3, ..., n:n").EntireRow.Delete

我认为很清楚,我只是不了解如何将正确的信息传递给范围对象。当我尝试运行这个时,我得到一个"对象全局的方法范围"错误信息。

我的短期解决方法是循环并清除行,然后删除所有空白行(宏跟踪行的绝对位置,而不是迭代删除后的行) - 但我'我想知道如何以我的方式做到这一点以及它为什么不起作用。

我也对其他解决方案持开放态度,但我想了解我在这里做错了什么。我还应该提一下,我使用Join()尝试找到一种解决方法,但仍然收到了相同类型的错误。

谢谢。

1 个答案:

答案 0 :(得分:1)

在对上面的宏的数据集进行一些实验之后,我发现它在A:A但不是更大的集合中处理小数据集。

我在调整设置大小和宏的同时运行Debug.Print Len(Str),发现它出现Range()最多只能接受240个字符。我仍然不明白为什么这是我收到的特定错误消息的原因,但是如果Len(Str)< 240.

如果我想使用我现在的方法,我将不得不向后循环我的数组以删除这些行......或者我可能只是尝试别的东西。

感谢Andrew对此的关注!