【问题标题】:VBA increasing dynamic range in VLOOKUPVBA 在 VLOOKUP 中增加动态范围
【发布时间】:2026-02-06 15:30:01
【问题描述】:

我在为 VLOOKUP 正确设置动态范围时遇到问题,每个循环应该增加 58(我有 96 个不同的范围)。 VLOOKUP 表在其他(“Gefco”)表中。我得到的错误是:

应用程序定义或对象定义的错误

代码:

Sub vlookup_rates()

Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
Dim rr, dupa As Range
Dim ws, wws As Worksheet
Dim wb As Workbook


c = 1
a = 2
b = 59
d = 2
e = 59

Set wb = ActiveWorkbook
Set ws = wb.Sheets("Gefco")
With ws
Set rr = Range(Cells(d, 4), Cells(e, 8))
End With

Set wws = wb.Sheets("Waberers")
wws.Activate

    Do While c < 97
        Cells(4, a).Select
        Cells(4, a).Formula = "=VLOOKUP($A$4;" & rr.Address & ";5;0)"  <-ERROR

        c = c + 1
        a = a + 1
        b = b + 1
        d = d + 58
        e = e + 58

    Loop
End Sub

我认为范围以某种方式定义错误,但我无法破解它。 请停下来。

谢谢!

【问题讨论】:

  • 哪一行给你错误?是公式行吗?
  • 你需要在循环内设置rr,否则d&e永远不会增加,我没有看到“b”被使用,你可以删除它。 Cells(4, a).Select 你也可以删除这一行。
  • 为错误行编辑
  • 也看看这个..With ws Set rr = .Range(.Cells(d, 4), .Cells(e, 8)) End With

标签: vba excel vlookup


【解决方案1】:

以下是你做错的一些事情:

Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
Dim rr, dupa As Range '// rr will be dimensioned as variant
Dim ws, wws As Worksheet '// ws will be dimensioned as variant
Dim wb As Workbook


c = 1
a = 2
b = 59
d = 2
e = 59

Set wb = ActiveWorkbook
Set ws = wb.Sheets("Gefco")
With ws
Set rr = Range(Cells(d, 4), Cells(e, 8)) '// This range refers to the ActiveSheet, not the 'ws' object.
End With

Set wws = wb.Sheets("Waberers")
wws.Activate '// No need to activate a sheet if you've set a reference to it.

    Do While c < 97
        Cells(4, a).Select '// No need to select a range, you can access it's properties and methods directly.
        '// The below formula will work if 'rr' is on the ActiveSheet, however the "rr" range has been set, and so it's address will never change unless you change the range that "rr" is actually set to
        Cells(4, a).Formula = "=VLOOKUP($A$4;" & rr.Address & ";5;0)"

        '// b, d & e are not used in the loop - so updating their values serves no purpose.
        c = c + 1
        a = a + 1
        b = b + 1
        d = d + 58
        e = e + 58

    Loop
End Sub

下面是一个示例,说明如何做到这一点:

Dim counterInt As Integer, d As Integer, e As Integer
Dim ws1 As Excel.Worksheet, ws2 As Excel.Worksheet

d = 2
e = 59
Set ws1 = Sheets("Gefco")
Set ws2 = Sheets("Waberers")

    For counterInt = 1 to 96
        ws2.Cells(4, counterInt).Value = Application.Vlookup([A4], ws1.Range(ws1.Cells(d, 4), ws1.Cells(e, 4)), 5, False)
        d = d + 58
        e = e + 58
    Next counterInt

Set ws1 = Nothing
Set ws2 = Nothing

【讨论】:

  • 现在出现错误:未找到具有指定名称的项目。用公式表示行。
  • @5yp10n 错误是什么,发生在哪一行?
  • @5yp10n 有人打败了我 - 但 Cells() 方法不合格 - 试试上面的编辑。
  • 效果很好,只是稍作编辑: ws2.Cells(4, counterInt + 1).Value 因为它是指查找值并将表查找到 ws1.Range(ws1.Cells(d, 4 ), ws1.Cells(e, 8))。非常感谢!
【解决方案2】:

除了上述答案之外,您还可以在公式中使用 R1C1 表示法:

wws.Cells(4, a).FormulaR1C1 = "=VLOOKUP(R1C4, R" & d & "C4:R" & e & "C8,5,FALSE)"

【讨论】:

  • 不错的选择,但是 OP 使用 ; 作为分隔符
  • 好点 - 必须将它们更改为逗号,以便我可以在我的计算机上进行测试。我认为这只是将它们改回';'的情况让它工作。
【解决方案3】:

编辑解决方案以供参考。 感谢 SOofWXLS 的上述解决方案,我能够用 VLOOKUPS 的动态范围填充从 B4 到 CS61 的所有表格,它逐行填充单元格:

Sub vlookup_rates_2()
Dim rowInt As Integer, counterInt As Integer, d As Integer, e As Integer
Dim ws1 As Excel.Worksheet, ws2 As Excel.Worksheet

d = 2
e = 59
Set ws1 = Sheets("Gefco")
Set ws2 = Sheets("Waberers")

For rowInt = 4 To 61
    For counterInt = 1 To 96
        ws2.Cells(rowInt, counterInt + 1).Value = Application.VLookup(Cells(rowInt, 1), ws1.Range(ws1.Cells(d, 4), ws1.Cells(e, 8)), 5, False)
        d = d + 58
        e = e + 58
    Next counterInt
    d = 2
    e = 59
Next rowInt

Set ws1 = Nothing
Set ws2 = Nothing
End Sub

【讨论】: