将多个外部工作簿范围设置为当前工作簿的变量Range.Find宏

时间:2017-08-09 21:11:00

标签: excel excel-vba variables range external vba

我一直在尝试创建代码,将列表中的条目从一个工作簿与另一个工作簿上的两个列表(主列表)进行比较。最终目标是拥有一个宏,该宏将运行并标记列表中的条目是否在两个主列表中的一个中找到,称为"统计"和"非统计" (分别为表1和表2)然后进行相应的标记。为了做到这一点,我需要将主列表工作簿的两个范围定义为Range.Find方法中使用的变量,或任何其他可行的方法。

列表设置如下:

  1. 在对其进行检查运行的原始列表中(以及代码所在的位置),通常有大约150个条目的输出,过滤(按预先确定的标准),这样只有100个可见,在标有"更改"
  2. 的工作表上,每天输出的数字会有所变化
  3. "主统计清单"工作簿设置有两个工作表,我有另一个宏填充和添加条目。 Sheet1命名为"统计"并包含所有被视为"统计"和Sheet2命名为"非统计"并包含所有被视为非统计的条目。这些列表有数千行,所以我尽量避免使用.Select函数。
  4. 两个主列表都存储在从A开始的A列中,而"更改"正在检查的列表从A2开始(由于标题)。
  5. 以下是仅范围参考代码

    的内容
    '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中的最后一个条目,因为条目计数总是在源表上更改并在主列表上增加。

1 个答案:

答案 0 :(得分:0)

当您要选择的Range.Select位于有效工作表上时,您只能使用Range

在下面的代码中,有两个工作簿:TestMaster.xlsmTestSlave.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