1

我正在尝试制作一个看起来很简单的宏,但事实证明它比我想象的要难。我开始使用“指向和单击”方法制作它,但它并没有我想象的那么动态。基本上我使用 vlookup 从另一个工作表中查找单元格 A2 中的名称,然后将 D 列中的数字复制到当前工作表中。查看代码时,这部分看起来像这样:

Range("D2").Select
ActiveCell.FormulaR1C1 = _
    "=VLOOKUP(RC[-3],'Downstairs'!R[-1]C[-3]:R[200]C[14],4,0)"

Range("D2").Select
Selection.AutoFill Destination:=Range("D2:D" & lastrow&)

找到第一个数字后,我正在尝试自动填充其余数字。当你运行它时它会起作用,但我认为这只是因为名称是有序的。但是,如果名称不按顺序排列,它将找不到正确的数字,部分原因是 R[] 和 C[] 中的所有数字随着您向下行而不断变化。如果我在列表中添加更多名称,我认为它不会起作用,这是我需要它做的事情。我将 R[] 中的数字从 93 更改为 200,因为我真的不知道如何合并我之前制作的 lastrow 对象,而且我不知道另一种方法可以使这个动态化。有一个更好的方法吗?

4

1 回答 1

1

就像我在上面的评论中提到的那样,您不需要 VBA。您可以直接在 Excel 中键入公式并进行手动自动填充。话虽如此,如果您仍然想做 VBA,那么只需在不需要使用 AutoFill 的地方使用此代码。此代码将使用公式填充所有相关单元格。

您的公式也没有给您正确的结果,因为您的表格数组不是恒定的,并且随着您向下移动而变化。为了防止这种情况发生,只需使用$符号。

另一个提示:R1C1如果您不擅长格式,格式会非常混乱。坚持正常A1格式。

这是实现您想要的最简单的方法。请修改代码以满足您的需求

Sub Sample()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim lastrow  As Long

    '~~> Change this to the releavnt sheet name
    '~~> This is the sheet where the formula will go
    Set ws1 = ThisWorkbook.Sheets("Sheet1")

    Set ws2 = ThisWorkbook.Sheets("Downstairs")

    With ws1
        '~~> Get the last row
        lastrow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Fill formula in all the relevant cells in one go
        '~~> replace my formula within quotes with your formula
        '~~> Do not forget to put the $ sign like I have done
        .Range("D1:D" & lastrow).Formula = "=VLOOKUP(A1,Downstairs!$C$1:$N$200,4,0)"
    End With
End Sub
于 2013-09-13T20:09:50.707 回答