在Visual Basic中查找:尝试设置具有可变范围的参考列

我有一个关于下面的代码的问题。 如果有人能提供一些见解,我将非常感激。 本质上这是我正在build设的每周运行报告的一部分。 我遇到的问题是参考列K是可变的input大小,我讨厌把一个常数,导致一堆N / A#S(K行不能超过300)。 我敢肯定,这是简单的,我忽略了,但我试图写一些东西来计算K2:Kn,然后在范围(q2:r2:s2:t2:qrstn)中input它。 请分享你的智慧=)

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 

希望我已经正确理解你的问题

以下将自动填充范围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 

第一个查看最后一行的表单,第二个查找表单从最大行到最后一行。

你可以用你需要的任何列来replaceQ,因为你看起来对很多列做同样的事情!

更新

我已经更新了示例,它现在在K列中find已使用的范围,并将其偏移到所需的列。 ColumnOffset的值将与R1C1公式中使用的值相同(虽然为正值)。

另外,因为K范围应该保持不变,并且你的公式是相当可预测的,你可以缩短一点。 像以下(我没有testing,只是玩耍)

 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 

当您使用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 

不需要循环或使用不同的公式来处理每一列!

而不是这些公式:

列Q:= VLOOKUP(K2,表15,FALSE)
列R:= VLOOKUP(K2,table,16,FALSE)
 ...

你可以简单地使用

  = VLOOKUP($ K2,表,COLUMN() -  2,0) 

作为所有专栏的一个公式! $K2 (在R1C1: RC11 )而不是K2 (在R1C1中RC[-6]RC[-7] ,…)将保留列K.并且COLUMN()将返回实际单元格的列号,即列Q = 17,R = 18等(我也用0代替了FALSE ,因为这减less了像我这样的懒惰types的打字,但结果相同。:-))。

因此,你可以减less你的macros

 Sub MakeVLOOKUP Sheets(2).Range("Q2:T300").FormulaR1C1 = "=VLOOKUP(RC11,table,COLUMN()-2,0)" End Sub 

并取得相同的结果。

如果你想在Dick的解决scheme中灵活调整范围,你可以这样做:

 Sub MakeVLOOKUP Sheets(2).Range("Q2").Resize(Sheet1.Range("K2").End(xlDown)).Rows.Count-1,4).FormulaR1C1 = _ "=VLOOKUP(RC11,table,COLUMN()-2,0)" End Sub