Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将多个外部工作簿范围设置为当前工作簿范围的变量。查找宏_Excel_Variables_Range_External_Vba - Fatal编程技术网

Excel 将多个外部工作簿范围设置为当前工作簿范围的变量。查找宏

Excel 将多个外部工作簿范围设置为当前工作簿范围的变量。查找宏,excel,variables,range,external,vba,Excel,Variables,Range,External,Vba,我一直在尝试创建代码,将一个工作簿列表中的条目与另一个工作簿(主列表)中的两个列表进行比较。最终目标是要有一个宏,如果在两个主列表(分别称为“统计”和“非统计”(第1页和第2页))中的一个主列表中找到列表中的条目,则该宏将运行并进行标记,然后相应地进行标记。为此,我需要将主列表工作簿的两个范围定义为Range.Find方法或任何其他有效方法中使用的变量 列表设置如下: 在对其进行检查的原始列表(以及代码所在的位置)中,通常有大约150个条目的输出,经过过滤(按预先确定的标准),以便只有100个条

我一直在尝试创建代码,将一个工作簿列表中的条目与另一个工作簿(主列表)中的两个列表进行比较。最终目标是要有一个宏,如果在两个主列表(分别称为“统计”和“非统计”(第1页和第2页))中的一个主列表中找到列表中的条目,则该宏将运行并进行标记,然后相应地进行标记。为此,我需要将主列表工作簿的两个范围定义为Range.Find方法或任何其他有效方法中使用的变量

列表设置如下:

  • 在对其进行检查的原始列表(以及代码所在的位置)中,通常有大约150个条目的输出,经过过滤(按预先确定的标准),以便只有100个条目可见,并且每天的输出在标记为“更改”的表上的数量会发生变化
  • “主统计列表”工作簿由两个工作表组成,我有另一个宏填充并向其中添加条目。表1命名为“统计”并包含所有被视为“统计”的条目,表2命名为“非统计”并包含所有被视为非统计的条目。列表有数千行,所以我尽量避免使用.Select函数
  • 两个主列表都存储在A列中,从A1开始,而正在检查的“更改”列表从A2开始(由于标题)
  • 以下是我到目前为止对的了解,只是范围参考代码

    '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))