我对以下代码有疑问。如果有人能提供一些见解,我将非常感激。基本上这是我正在建立的每周运行报告的一部分。我遇到的问题是参考列K的输入大小是可变的,我讨厌输入一个常量,导致一堆N / A#s(K行不应超过300)。我确定这是一个简单的我忽略了,但我试着写一些东西来计算K2:Kn然后在Ranges中输入它(q2:r2:s2:t2:qrstn)。请分享你的智慧=)
Sub Vlookup()
Sheets(2).Select
Range("q2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-6],table,15,FALSE)"
Range("q2").Select
Selection.AutoFill Destination:=Range("q2:q300"), Type:=xlFillDefault
Range("r2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-7],table,16,FALSE)"
Range("r2").Select
Selection.AutoFill Destination:=Range("r2:r300"), Type:=xlFillDefault
Range("s2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-8],table,17,FALSE)"
Range("s2").Select
Selection.AutoFill Destination:=Range("s2:s300"), Type:=xlFillDefault
Range("t2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-9],table,18,FALSE)"
Range("t2").Select
Selection.AutoFill Destination:=Range("t2:t300"), Type:=xlFillDefault
答案 0 :(得分:2)
希望我能正确理解你的问题
以下内容将自动填充范围Q2:QN
,其中N是Q列中最后使用的单元格
Selection.AutoFill Destination:=Range(Range("K2"),Range("K2").End(xlDown)).Offset(ColumnOffset:=6), Type:=xlFillDefault
你可以反过来做,因为你有一个固定的最大值。
Selection.AutoFill Destination:=Range(Range("K2"),Range("K301").End(xlUp)).Offset(ColumnOffset:=6), Type:=xlFillDefault
第一行向下看最后一行的工作表,第二行从最大一行到最后一行查找工作表。
您可以将Q替换为您需要的任何列,因为您看起来对许多列执行相同的操作!
<强>更新强>
我已经更新了示例,它现在在K列中找到已使用的范围,并将其偏移到所需的列。 ColumnOffset
的值与R1C1
公式中使用的值相同(尽管为正)。
此外,由于K系列应保持不变,并且您的公式相当可预测,您可以稍微缩短它。喜欢以下(我没有测试它,只是玩游戏)
Sub Vlookup() ' might want to re-name, to avoid confusion with the worksheet function
Dim R As Range
Dim A As Range
Dim I As Integer
Set R = Range(Range("K2"), Range("K301").End(xlUp))
Set A = Range("K2")
For I = 6 To 9
A.Offset(ColumnOffset:=I).FormulaR1C1 = "=VLOOKUP(RC[-" & CStr(I) & "], table, " & CStr(I+9) & ", FALSE)"
A.Offset(ColumnOffset:=I).AutoFill Destination:=R.Offset(I), Type:=xlFillDefault
Next I
End Sub
答案 1 :(得分:1)
使用FormulaR1C1时无需填写。您可以将公式应用于整个范围。这是一个例子。
Sub MakeVlookup()
Dim lRows As Long, lCols As Long
Dim rCell As Range
Dim rRef As Range
'Set the first cell of the reference column
Set rRef = Sheet1.Range("K2")
'Count the rows of the reference column
lRows = Sheet1.Range(rRef, rRef.End(xlDown)).Rows.Count
'Loop through the row 2 cells where you want the formula
For Each rCell In Sheet1.Range("Q2:T2").Cells
'Compute the offset back to the reference column
lCols = rCell.Column - rRef.Column
'Write the formula to the whole range
rCell.Resize(lRows, 1).FormulaR1C1 = _
"=VLOOKUP(RC[-" & lCols & "],Table1," & rCell.Column - 2 & ",FALSE)"
Next rCell
End Sub
答案 2 :(得分:1)
无需使用不同的公式循环或寻址每个列!
而不是这些公式:
Column Q: =VLOOKUP(K2,table,15,FALSE) Column R: =VLOOKUP(K2,table,16,FALSE) ...
您只需使用
=VLOOKUP($K2,table,COLUMN()-2,0)作为所有列中的一个公式!
$K2
(在R1C1:RC11
)而不是K2
(在R1C1 RC[-6]
中,RC[-7]
,...)将保留列K. {{1将返回实际单元格的列号,即列Q = 17,R = 18等。(我还将COLUMN()
替换为FALSE
,因为这样可以减少像我这样的懒人类型的输入但结果相同。:-))。
因此,您可以将宏缩小为
0
并获得相同的结果。
如果你想像Dick的解决方案那样灵活化范围,你可以这样做:
Sub MakeVLOOKUP
Sheets(2).Range("Q2:T300").FormulaR1C1 = "=VLOOKUP(RC11,table,COLUMN()-2,0)"
End Sub