我正在尝试制作一个看似非常简单的宏,但事实证明它比我想象的要难。我开始使用“点击”方法制作它,但它没有像我想象的那样动态。基本上我使用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,因为我真的不知道如何合并之前制作的拉斯特罗对象,而且我不知道另一种方法可以让它变得动态。有更好的方法吗?
答案 0 :(得分:0)
就像我在上面的评论中提到的那样,你不需要VBA。您可以直接在Excel中键入公式并执行手动自动填充。话虽如此,如果您仍想要VBA,那么只需使用此代码,您就不需要使用自动填充功能。此代码将使用公式填充所有相关单元格。
你的公式也没有给你正确的结果,因为你的表数组不是常数,并且当你向下移动时它正在改变。为防止这种情况发生,只需使用$
符号。
另一个提示: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