如何从活动页面(或其他)设置范围
我很困惑VBA如何在不同情况下处理Range
我有2张“主”和“数据”。 “主”表中有button,其中包括以下代码:
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))
因为即使激活并select“数据”表,SrchRange也会参考“主”表。 对于“LastRow”,我发现这个解决方法,把它作为ActiveSheet.Cells(…但是“SrchRange”我找不到办法做到这一点,我已经试过至less:
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”。 我不明白如果更详细地描述范围情况如何改变。 即使使用Sheets和ActiveSheet,它是否仍然是范围? 我该如何做到这一点?
我设法通过不使用Rangevariables来绕过这个问题。 这里是使用SrchRangevariables的部分。
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的概念并select表单。 如果我仍然需要将它作为ActiveSheet引用,那么激活表格有什么意义? 为什么不使用Sheets()来select特定的表单,如果你总是需要使用引用。 并搅动它更多什么是使用select?
当同时处理2个或更多工作表时,使用ActiveSheet
会令人困惑。 最好将工作表设置为如下代码的variables:
Dim ws1 as Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2")
然后用这两个variables做你的东西指向一个工作表。 另外,使用With
块会使代码更清晰,以告诉你正在处理哪个工作表。 所以你给的代码可以重写成如下:
Dim wsData As Worksheet Set wsData = Worksheets("Data") With wsData LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row Dim SrchRange As Range Set SrchRange = .Range(.Cells(1, 1), .Cells(LastRow, 7)) End With
我给了一些ActiveSheet
testing和调用集合,没有指定一定的参考。 说我有一个Workbook
与2个Worksheets
,一个名为SheetA
和另一个是SheetB
。 下面的代码放在SheetA
。
Private Sub test() Worksheets("B").Activate MsgBox Range("A1").Parent.Name MsgBox ActiveSheet.Range("A1").Parent.Name End Sub
结果是第一个MsgBox
给了SheetA
,第二个给了SheetB
。 因此,我假设如果你没有指定引用而调用一个集合,默认情况下是marco被调用的那个集合。
然后我把代码放在一个模块中。 这次,无论执行代码之前哪个工作表处于活动状态, MsgBox
都会给出相同的结果SheetB
。 所以这是我的结论。
- 在不指定引用的情况下调用集合,默认情况下是代码所属的位置。
- 处于模块级别时,默认为当前活动工作表。
- 指定参考是一个好方法,可以避免一些不可预知的错误。 请注意,最好在同时处理多个工作
Workbook
时指定Workbook
簿。
让我们来看看你问的这三行:
-
Set SrchRange = Range(Cells(1, 1), Cells(LastRow, 7))
所有三个集合,即Range
, Cells
和Cells
。 来自同一父,代码属于或activesheet,取决于代码的位置。 所以它总是会通过编译器,但并不总是给你正确的结果。
-
Set SrchRange = Sheets("Data").Range(Cells(1, 1), Cells(LastRow, 7))
Range
集合来自Sheets("Data")
,但这两个Cells
可能来自另一个表单,所以有时会出现错误。
-
Set SrchRange = Range(Sheets("Data").Cells(1, 1), Sheets("Data").Cells(LastRow, 7))
两个Cells
都来自同一张表单,但Range
的父级取决于。 所以它和[2]一样,有时会通过,有时会失败。
如果所有工作表都在包含vba代码的工作簿中,则可以使用工作表代码名称,而不必将其设置为单个variables。
示例我将工作表“数据”的代码名称更改为cnData并使用此…
With cnData LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row Dim SrchRange As Range Set SrchRange = .Range(.Cells(1, 1), .Cells(LastRow, 7)) End With
感谢您的快速回复。 两个以前的答案似乎是伎俩。 我通过将工作表定义为variables并通过块操作来获得代码。
我仍然很困惑,这是如何工作的。 有人可以对这些不同的陈述如何不同有所了解吗?
LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow = Sheets("Data").Cells(Rows.Count, 1).End(xlUp).Row
这两个似乎工作正常。 即使“数据”表被激活,第一个是从“主”表获取值。 第二个将给出“数据”表的后缀。 总而言之,即使结果不同,它们也都可以工作。
Set SrchRange = Range(Cells(1, 1), Cells(LastRow, 7)) Set SrchRange = Sheets("Data").Range(Cells(1, 1), Cells(LastRow, 7)) Set SrchRange = Range(Sheets("Data").Cells(1, 1), Sheets("Data").Cells(LastRow, 7))
但是,对于这三个只有第一个工作,但其他人会给运行时错误。 我也尝试了没有设置,没有预先定义的variables是像LastRow是范围。
我认为问题是,如果表格(“数据”)不再是一个范围。 被添加。 我的variables应该可能是其他东西呢? 即使表(“数据”),LastRowvariables如何工作。 被添加?