2014-05-20 74 views
0

我記錄了下面的宏:清理VLOOKUP/INDEX(MATCH())VBA

ActiveCell.FormulaR1C1 = _ 
      "=INDEX(Sheet1!R2C2:R491C2,MATCH(Sheet2!RC[-2],Sheet1!R2C1:R491C1,0))" 
     Range("D2").End (xlToLeft) 
     Range("C2").End (xlDown) 
     Range("D882").Select 
     Range(Selection, Selection.End(xlUp)).Select 
     Selection.FillDown 

,正如一些你可以告訴,是結果不只是記錄,而是試圖編輯所述記錄中的「選擇」語句。但是,VBA告訴我,我正在使用.End屬性不正確。編輯這個選項的最佳方法是什麼,以便不使用select,並且使得範圍的結尾完全取決於列A中爲每行填充的值?

一個更一般的宏結構將是:

1) Select cell D2 in Sheet(1) (the cell under Header_1) 
2) Write an INDEX(MATCH()) formula here referencing some specific columns in Sheet(1) and Sheet(2) 
3) Select D2 in Sheet(2) and copy down to Dn where n is the first row where An = "". 

然後,我會簡單地重複這對其他兩個索引所需(MATCH())的公式。

UPDATE:

是否有還辦法有INDEX(MATCH())設置以使得該柱範圍繼續只要細胞不是空白(例如R2C1:Rnonblank)。更具體地說,我可以只使用相同的& Cells()方法嗎?這些範圍將根據所針對的工作簿而變長或變短。

回答

1

在此公式變爲列d從行2倒只要有在列A中的條目,並且需要使用所有的細胞在Sheet1 B列的假設:

Dim LR as long 
lr = sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).row 
Range("D2:D" & Cells(Rows.Count, "A").End(xlUp).Row).FormulaR1C1 = _ 
       "=INDEX(Sheet1!R2C2:R" & lr & "C2,MATCH(RC[-2],Sheet1!R2C1:R" & lr & "C1,0))" 
+0

還有一種設置INDEX(MATCH())的方法,只要單元格不是空白(例如R2C1:Rnonblank),列範圍就會繼續。更具體地說,我可以使用相同的&Cells()方法嗎? – 114

+0

是的 - 我修改了我的答案以證明這一點。 – Rory

1

簡短回答 你不需要這些線,他們什麼都不做。當您使用鍵盤瀏覽數據的底部時,他們會被記錄下來。

Long Answer .End屬性返回一個Range對象,但是你的宏在這些行上沒有做任何事情。而不是做所有這些選擇,決定你想要的範圍,並在該範圍內撥打.FillDown。最簡單的是有一個固定的範圍:Range("D2:D822").Filldown,但如果你願意,你可以使它更聰明。

請嘗試詳細描述您將如何決定要下拉的單元格,並且我們可以幫助您將其轉換爲代碼。

+0

修改爲包含一般指導原則。我認爲羅裏的回答可能是我需要的,但我只需要嘗試一下。 – 114