我一直在尝试创建代码,将列表中的条目从一个工作簿与另一个工作簿上的两个列表(主列表)进行比较。最终目标是拥有一个宏,该宏将运行并标记列表中的条目是否在两个主列表中的一个中找到,称为"统计"和"非统计" (分别为表1和表2)然后进行相应的标记。为了做到这一点,我需要将主列表工作簿的两个范围定义为Range.Find方法中使用的变量,或任何其他可行的方法。
列表设置如下:
以下是仅范围参考代码:
的内容'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-set组合。范围和非统计的。
我尝试了几种不同的解决方案,包括使用With参数:
With SP
Set rngStat = Range("A1", SP.Range("A1").End(xlDown))
End With
或者将SP放在.Range函数前面,如上所示,但一旦活动工作表更改,则无效。
有没有办法将rngStat设置为普遍引用从其工作表的A1到最终条目的条目列表,以便它可以在以后的宏中用于任何循环或函数?重要的是,范围不是设置单元格而是列A中的最后一个条目,因为条目计数总是在源表上更改并在主列表上增加。
答案 0 :(得分:0)
当您要选择的Range.Select
位于有效工作表上时,您只能使用Range
。
在下面的代码中,有两个工作簿:TestMaster.xlsm
和TestSlave.xlsx
,两者都是开放的。两个宏都在第二个masterRng.Select
语句中失败。
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
在这两个宏中,名为Range
的{{1}}对象在工作簿masterRng
的工作表A1:B5
上定义为单元格Sheet1
。
虽然TestMaster.xlsm
的工作表Sheet1
仍然是活动工作表,但是(第一个)TestMaster.xlsm
已成功执行。但是,一旦此条件发生更改,对该方法的(第二次)调用将失败。
在宏masterRng.Select
中,活动工作表将切换到与testRange_SameBook_DifferentSheets()
相同的工作簿中的其他工作表。在第二个宏masterRng
中,活动工作表位于不同的工作簿中。
我怀疑大多数VBA相对较新的用户会遇到testRange_DifferentBooks()
,Activate
等方法,因为这是他们从宏录制器获取的内容。通常,这些方法不是一个好主意 - 请参阅this post。