清理VLOOKUP / INDEX(MATCH())VBA

时间:2014-05-20 15:07:00

标签: vba excel-vba excel

我录制了以下宏:

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 = "".

然后我会简单地重复这个所需的其他两个INDEX(MATCH())公式。

更新:

是否还有一种方法可以设置INDEX(MATCH()),以便只要单元格不为空(例如R2C1:Rnonblank),列范围就会继续。更具体地说,我可以使用相同的& Cells()方法?这些范围将更长或更短,具体取决于所针对的工作簿。

2 个答案:

答案 0 :(得分:1)

假设此公式从第2行开始在D列中向下,只要列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))"

答案 1 :(得分:1)

简答 你不需要这些线,他们什么都不做。当您使用键盘导航到数据底部时,它们被记录下来。

长答案 .End属性返回一个Range对象,但是你的宏在这些行上没有做任何事情。而不是完成所有这些选择,决定你想要的范围,并在该范围内调用.FillDown。最简单的方法是拥有一个固定的范围:Range("D2:D822").Filldown,但如果您愿意,可以使它更聪明。

详细描述如何决定下拉哪些单元格,我们可以帮助您将其转换为代码。