2017-08-09 104 views
0

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

的列表被设置为这样:

  1. 在其具有针对它的检查运行(以及其中所述代码驻留)原始列表中,通常约150条目的输出,过滤(通过预先确定的标准),以便只有大约100个可见,并且数字在标有“变更”的工作表上每天的输出变化
  2. “主统计列表”工作簿由两张表组成另一个宏填充和添加条目。 Sheet1被命名为“统计”,并包含所有被视为“统计”的条目,Sheet2被命名为“非统计”,并包含所有被视为非统计的条目。这些列表在成千上万行中,所以我尽量避免使用.Select函数。
  3. 这两个主列表都存储在A列中,从A1开始,而正在检查的“Changes”列表从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 

我将运行两个“转变”的范围和类似点心一套连击非统计一。

我试过几个不同的解决方案,包括使用以如下参数,例如:

With SP 
    Set rngStat = Range("A1", SP.Range("A1").End(xlDown)) 
End With 

或将SP在.Range功能的前如上图所示,但一旦当前工作表被改变没有什么作品。

是否有一种方法可以将rngStat设置为普遍引用从表格A1的条目列表到最终条目的条目列表,以便可以在后面的宏中使用任何循环或函数?重要的是,范围不是设置单元格,而是列A中的最后一个条目,因为条目的数量在源表单上始终发生变化,并且在主列表上增加。

+0

不知道这里是否有拼写错误,但是在With With SP中,您应该将“anchor”添加到Range(),即'.Range(...)'另外在主代码中,您锚定'.Range(“A1”)。End(xlDown)'到...什么?没有“With”语句显示。 – BruceWayne

+0

看起来你大多需要明确指出每个范围,包括其工作表。无论哪个表单处在这个例子中,我还包含了对代码工作簿的引用。如果不相关,你可以删除它,但是如果工作簿也需要明确引用,请将其保留:Set rng = Workbooks(ThisWorkbook.Name).Sheets(“Sheet2”)。Range(“A1”,Workbooks (ThisWorkbook.Name).Sheets(“Sheet2”)。Range(“A1”)。End(xlDown))' – David

+0

感谢您的帮助。 –

回答

0

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

在下面的代码中,有两个工作簿: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对象称为masterRng被定义为细胞A1:B5上工作簿TestMaster.xlsm的工作表Sheet1

虽然工作表Sheet1TestMaster.xlsm仍然是活动工作表,(第一个)masterRng.Select已成功执行。但是,一旦此条件更改(方法)的第二次调用失败。

在宏testRange_SameBook_DifferentSheets()中,活动工作表切换到与masterRng相同的工作簿中的其他工作表。在第二个宏testRange_DifferentBooks()活动工作表是在不同的工作簿中。

我怀疑大多数VBA相对陌生的用户偶然发现了诸如ActivateSelect等方法,因为这是他们从宏录像机获得的结果。通常,这些方法不是一个好主意 - 请参阅this post

相关问题