如何从活动页面(或其他)设置范围

我很困惑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 

我给了一些ActiveSheettesting和调用集合,没有指定一定的参考。 说我有一个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 。 所以这是我的结论。

  1. 在不指定引用的情况下调用集合,默认情况下是代码所属的位置。
  2. 处于模块级别时,默认为当前活动工作表。
  3. 指定参考是一个好方法,可以避免一些不可预知的错误。 请注意,最好在同时处理多个工作Workbook时指定Workbook簿。

让我们来看看你问的这三行:

  1. Set SrchRange = Range(Cells(1, 1), Cells(LastRow, 7))

所有三个集合,即RangeCellsCells 。 来自同一父,代码属于或activesheet,取决于代码的位置。 所以它总是会通过编译器,但并不总是给你正确的结果。

  1. Set SrchRange = Sheets("Data").Range(Cells(1, 1), Cells(LastRow, 7))

Range集合来自Sheets("Data") ,但这两个Cells可能来自另一个表单,所以有时会出现错误。

  1. 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如何工作。 被添加?