Visual Basic中的Vlookup:尝试设置具有可变范围的引用列

时间:2013-02-24 01:29:41

标签: excel excel-vba vba

我对以下代码有疑问。如果有人能提供一些见解,我将非常感激。基本上这是我正在建立的每周运行报告的一部分。我遇到的问题是参考列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

3 个答案:

答案 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