【问题标题】:Cleaning up VLOOKUP / INDEX(MATCH()) VBA清理 VLOOKUP / INDEX(MATCH()) VBA
【发布时间】:2014-05-20 15:06:59
【问题描述】:

我录制了以下宏:

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() 方法吗?这些范围会更长或更短,具体取决于目标工作簿。

【问题讨论】:

    标签: vba excel


    【解决方案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))"
    

    【讨论】:

    • 是否还有一种方法可以设置 INDEX(MATCH()),以便只要单元格不为空(例如 R2C1:Rnonblank),列范围就会继续。更具体地说,我可以只使用相同的 & Cells() 方法吗?
    • 是的 - 我已经修改了我的答案来证明这一点。
    【解决方案2】:

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

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

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

    【讨论】:

    • 已编辑以包含一般指南。我认为 Rory 的答案可能是我需要的 - 我只需要尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多