2017-08-09 59 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

相關問題