Excel 将多个外部工作簿范围设置为当前工作簿范围的变量。查找宏
我一直在尝试创建代码,将一个工作簿列表中的条目与另一个工作簿(主列表)中的两个列表进行比较。最终目标是要有一个宏,如果在两个主列表(分别称为“统计”和“非统计”(第1页和第2页))中的一个主列表中找到列表中的条目,则该宏将运行并进行标记,然后相应地进行标记。为此,我需要将主列表工作簿的两个范围定义为Range.Find方法或任何其他有效方法中使用的变量 列表设置如下:Excel 将多个外部工作簿范围设置为当前工作簿范围的变量。查找宏,excel,variables,range,external,vba,Excel,Variables,Range,External,Vba,我一直在尝试创建代码,将一个工作簿列表中的条目与另一个工作簿(主列表)中的两个列表进行比较。最终目标是要有一个宏,如果在两个主列表(分别称为“统计”和“非统计”(第1页和第2页))中的一个主列表中找到列表中的条目,则该宏将运行并进行标记,然后相应地进行标记。为此,我需要将主列表工作簿的两个范围定义为Range.Find方法或任何其他有效方法中使用的变量 列表设置如下: 在对其进行检查的原始列表(以及代码所在的位置)中,通常有大约150个条目的输出,经过过滤(按预先确定的标准),以便只有100个条
'Establish the list references
Dim MSL As Workbook 'Master Statistical List
Dim SP As Worksheet 'Statistical Properties
Dim NSP As Worksheet 'Non-statistical Properties
Dim TWS As Workbook 'This Worksheet - the original one in which this code resides
Set MSL = Workbooks.Open(Filename:="Filepath\Master Statistical List.xlsm")
Set SP = MSL.Worksheets("Statistical") 'Alternatively .Worksheets(1)
Set NSP = MSL.Worksheets("Non-statistical") 'Alternatively .Worksheets(2)
Set TWS = ThisWorkbook
'Establish the Range references
'Statistical Properties List
SP.Activate
Dim rngStat As Range
Set rngStat = Range("A1", .Range("A1").End(xlDown))
'check if it actually worked
rngStat.Select 'it seems to work
Range("B1").Select 'select random cell so we know if selecting it again actually works (I run through this line-by-line to debug)
TWS.Activate 'Lets go back to the current workbook and then see if it still works!
rngStat.Select 'Here be errors
我会为“变化”范围和非统计范围运行类似的Dim集合组合
我尝试了几种不同的解决方案,包括使用With参数:
With SP
Set rngStat = Range("A1", SP.Range("A1").End(xlDown))
End With
或者如上所示将SP置于.Range函数前面,但一旦更改了活动工作表,任何操作都不会起作用
有没有一种方法可以将rngStat设置为从其工作表的A1到最终条目的条目列表的通用引用方式,以便它可以在宏中稍后的任何循环或函数中使用?重要的是,范围不应是设置单元格,而应是a列中的最后一个条目,因为条目的数量在源工作表上总是不断变化,在主列表上也不断增加。您只能使用
范围。当要选择的范围在活动工作表上时,请选择
在下面的代码中,有两个工作簿:TestMaster.xlsm
和TestSlave.xlsx
,它们都是打开的。两个宏在第二次masterRng时都失败。请选择语句
Option Explicit
Sub testRange_SameBook_DifferentSheets()
Dim masterRng As Range
Workbooks("TestMaster.xlsm").Worksheets("Sheet1").Activate
Set masterRng = Range("A1:B5")
masterRng.Select 'Works
Worksheets("Sheet2").Activate
masterRng.Select 'Fails: Run-time error 1004
End Sub
Sub testRange_DifferentBooks()
Dim masterRng As Range
Workbooks("TestMaster.xlsm").Worksheets("Sheet1").Activate
Set masterRng = Range("A1:B5")
masterRng.Select 'Works
Workbooks("TestSlave.xlsx").Worksheets("Sheet1").Activate
masterRng.Select 'Fails: Run-time error 1004
End Sub
在这两个宏中,称为masterRng
的Range
对象被定义为工作簿TestMaster.xlsm
的工作表Sheet1
上的单元格A1:B5
当TestMaster.xlsm
的工作表Sheet1
保持活动工作表时,成功执行(第一个)masterRng.Select
。但是,一旦该条件发生变化,对该方法的(第二次)调用就会失败
在宏testRange\u SameBook\u DifferentSheets()
中,活动工作表切换到与masterRng
相同工作簿中的不同工作表。在第二个宏testRange\u differentitbooks()
中,活动工作表位于不同的工作簿中
我怀疑大多数对VBA比较陌生的用户会偶然发现一些方法,如激活
,选择
,等等,因为这是他们从宏记录器中获得的。通常,这些方法不是一个好主意-请参阅 不确定这里是否输入错误,但在使用SP的中,您应该将“锚定”添加到范围(),
ie.Range(…)
在主代码中,您也将.Range(“A1”).End(xlDown)
锚定到…什么?没有显示带有
语句的。似乎您主要需要开始明确地引用每个范围,包括它的表。无论哪张图纸处于活动状态,这都将起作用。在本例中,我还包括对代码工作簿的引用。如果不相关,您可以将其删除,但我将其保留,以防工作簿也需要明确引用:Set rng=Workbooks(thishworkbook.Name).Sheets(“Sheet2”).Range(“A1”,Workbooks(thishworkbook.Name).Sheets(“Sheet2”).Range(“A1”).End(xlDown))