【发布时间】: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