【问题标题】:Excel VBA: How to concatenate variant array elements (row numbers) into a range object?Excel VBA:如何将变量数组元素(行号)连接到范围对象中?
【发布时间】:2018-07-04 07:03:49
【问题描述】:

我确实研究了这个问题,但找不到我正在寻找的具体答案,实际上目前更加困惑。

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

我的问题是,现在我有了行号(存储在变量数组中) - 我无法弄清楚如何正确地将这些数据连接到一个范围中,然后对这些项目执行批量 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() 尝试找到解决方法,但仍然收到相同类型的错误。

谢谢。

【问题讨论】:

  • Range 语法应该可以工作。我自己也试过了,只是为了确定。我的代码是range("1:1,3:3,5:5").EntireRow.Delete,它愉快地删除了这些行。
  • 这是完整的错误信息吗?
  • 完整消息是:运行时错误'1004':对象'_Global'的方法'范围'失败当我使用该语法输入值时,是的,它工作得很好,但对于某些人因为它不会接受它作为具有相同语法的预制字符串
  • 您可以尝试完全限定范围:ThisWorkbook.Sheets("Sheet1").Range(...?如果没有它应该引用 ActiveSheet 如果它在标准模块中,或者如果它在工作表的模块中,则应该引用父工作表,但我不知道您的上下文是什么或您的焦点在哪里(这可能会影响这一点)。最好完全限定范围以确保。
  • 啊,我想通了。我会发布我的解决方案。非常感谢您的帮助,我很感激!错误信息对我来说还是有点奇怪。

标签: arrays vba excel concatenation


【解决方案1】:

在对上述宏的数据集进行了一些实验后,我发现它适用于 A:A 中的小型数据集,但不适用于较大的数据集。

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

如果我想使用我目前的方法,我将不得不向后循环遍历我的数组以删除这些行......或者我可以尝试其他方法。

感谢 Andrew 对此的关注!

【讨论】:

  • 啊,我没想到。接得好。是的,在这种情况下,您必须一个一个地删除它们(在删除时向后迭代将比消隐和删除空白更容易)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多