[英]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.