0

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

3 回答 3

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
于 2013-02-24T01:55:43.537 回答
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
于 2013-02-24T15:24:27.300 回答
1

无需使用不同的公式循环或寻址每一列!

而不是这些公式:

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

你可以简单地使用

=VLOOKUP($K2,table,COLUMN()-2,0)
作为所有列的一个公式!$K2(in R1C1: RC11) 而不是K2(in R1C1 RC[-6], RC[-7], ...) 将保留 K 列。COLUMN()并将返回实际单元格的列号,即 Q = 17、R = 18 等列。(我也替换了因为这减少FALSE0像我这样懒惰的人的打字,但结果相同。:-))。

因此,您可以将宏减少到

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

并达到相同的结果。

如果你想像迪克的解决方案那样灵活地调整范围,你可以这样做:

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
于 2013-02-24T19:38:38.417 回答