繁体   English   中英

清理VLOOKUP / INDEX(MATCH())VBA

[英]Cleaning up 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 = "".

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

更新:

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

假设此公式在第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))"

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM