【发布时间】:2018-05-06 09:23:15
【问题描述】:
我对 VBA 在不同情况下如何处理 Range 感到困惑..
我有 2 张“主要”和“数据”。 “Main”工作表上有一个按钮,其中包括以下代码:
Worksheets("Data").Activate
Worksheets("Data").Select
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Dim SrchRange As Range
Set SrchRange = Range(Cells(1, 1), Cells(LastRow, 7))
因为它是 SrchRange 将引用工作表“主要”,即使“数据”工作表被激活并选择。对于“LastRow”,我发现此解决方法将其作为 ActiveSheet.Cells(... 但对于“SrchRange”,我找不到这样做的方法。 我至少尝试过:
Set SrchRange = ActiveSheet.Range(Cells(1, 1), Cells(LastRow, 7))
Set SrchRange = Sheets("Data").Range(Cells(1, 1), Cells(LastRow, 7))
Set SrchRange = Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(LastRow, 7))
所有这些都会给我一个运行时错误“1004”。如果更详细地描述 Range,我不明白情况会如何变化。即使使用 Sheets 和 ActiveSheet,它不应该仍然是范围吗?我应该如何做到这一点?
我设法通过完全不使用 Range 变量来规避这个问题。 这是使用 SrchRange 变量的部分。
For Each HeaderMatch In SrchRange
If HeaderMatch Like HeaderKeyWord Then
我用这个代替了:
For Each HeaderMatch In ActiveSheet.Range(ActiveSheet.Cells(1, 1),
ActiveSheet.Cells(LastRow, 7))
If HeaderMatch Like HeaderKeyWord Then
我更喜欢第一个,因为它更清楚一点,而且不符合原则,我想让它按我的意图工作,因为我知道这是可能的,但我不知道如何。
我不太了解 ActiveSheet 和选择工作表的概念。如果我仍然需要将其称为 ActiveSheet,那么激活工作表有什么意义?如果您仍然需要始终使用参考,为什么不只使用 Sheets() 来选择特定的工作表。更要搅动它,选择有什么用?
【问题讨论】:
-
Set SrchRange = Sheets("Data").Range(Sheets("Data").Cells(1, 1), Sheets("Data").Cells(LastRow, 7)) -
SrchRange 将在您激活后引用工作表“DATA”。不知道你是如何让它仍然参考“MAIN”表的。但是您的方法是使用activesheet,这从来都不是一件好事。尝试按照其他人的建议直接引用您的工作表。
-
在我看来,如果您从“MAIN”表调用marco,即使您已激活“DATA”,
Range和Cells集合的默认母集将是“MAIN”表" 表格优先。 -
我已经测试了该代码,它将活动表设置为 DATA,范围和单元格默认为活动表。激活 DATA 后,您调用宏的工作表与 activesheet 有什么关系?
-
包含代码的按钮被放置在“MAIN”表上。我再次测试了代码,并且在 LastRow 语句中没有 ActiveSheet,即使激活并选择了工作表“数据”,它也会返回数字 3,这是“主”工作表上的行数。如果活动表。或Shees(“数据”)。被添加到 LastRow 语句,然后它会给出数字 513,这是“数据”表中的行数。