【问题标题】:For each cell in range, if cell value is not blank then vlookup对于范围内的每个单元格,如果单元格值不为空,则 vlookup
【发布时间】:2018-05-23 13:48:00
【问题描述】:

由于运行时错误“1004”:应用程序定义或对象定义错误,我正在努力使以下代码正常运行。

通常当我遇到此错误是由于工作表保护引起的,我已确保工作表不受保护,因此子开始处的行。

我将在这里花费场景和最终目标:

Sheet1 = 实时合同

此工作表包含一个 6 列和动态行数的表格。 第 1 列包含合同参考编号。第 2 - 6 列与此无关。

表 4 = 合同金额

此表包含所有合同、相应部门和合同价值。

目标

创建一个可以通过用户窗体按钮调用的模块。

模块需要查看 sheet1 的 A 列,并且对于每个单元格 - 如果有值 - 在 G 列中创建一个 vlookup 并使用以下参数。

Lookup Value = Cell.offset(0, -6)

Table array = Sheet4.range("A3:C676")

Col_Index_Num = 1

FALSE - Exact match

模块需要对范围内的所有单元格重复此过程。

现在是我制作的:

 Worksheets("Live Contracts").Unprotect

Dim rng As range
Dim lastrow As Long
Dim cell As range
Dim contractrange As range

'Find dynamic range
lastrow = Worksheets("Live Contracts").range("A" & Rows.Count).End(xlUp).Row

Set contractrange = Worksheets("Contract Sums").range("A3:C676")
Set rng = Worksheets("Live Contracts").range("A2:A" & lastrow)

For Each cell In rng
'If cell does not equal blank then for each cell in column A, offset to column G.
    If cell.Value <> "" Then

    'In column G, vlookup column A cell value in contractrange's column C, only return exact match
        cell.Offset(0, 6).Value = Application.VLookup(cell.Offset(0, -6), contractrange, 1, False)

        'In column H, vlookup column A cell value in contractrange's column A, only return exact match
        cell.Offset(0, 7).Value = Application.VLookup(cell.Offset(0, -7), contractrange, 3, False)
    End If
    'Repeat for all cells in range
Next cell


End Sub

以 cell.offset 开头的第一行在调试时被高亮显示

P.S 我对 VBA 比较陌生,为糟糕的代码道歉!

【问题讨论】:

  • 在定义之前使用lastrow,您不会也收到错误吗?我相信错误 1004 是因为你没有定义contractsum
  • 感谢您发现这一点,我已将 lastrow 移至 set rng 之前。我将编辑原帖
  • 谢谢 Jarom,看来我今天犯了很多错误!我已经定义了contractrange,但是在公式中使用了contractsum这个词。我已将公式更改为正确定义的范围,但不幸的是仍然收到相同的错误。
  • 哦,实际上主要问题可能是您在 A 列中,并且您试图通过使用 cell.offset(0,-6) 向左移动您只能偏移到 A 列的右侧。
  • 我想我发现了你为什么要在 vlookup 中使用偏移量。看看我的回答,让我知道这是否有意义。

标签: vba excel


【解决方案1】:

看起来您可能混淆了活动单元格的使用和您在循环中使用的CellCell 只会在完整循环迭代后更改。它不像活动单元格会在您选择不同的单元格后发生变化。

所以当你使用Cell.offset(0,6)时,Cell并没有改变,所以你不需要尝试在Vlookup中使用Cell.offset(0,-6)来返回。

试试这个:

For Each cell In rng
'If cell does not equal blank then for each cell in column A, offset to column G.
    If cell.Value <> "" Then

    'In column G, vlookup column A cell value in contractrange's column C, only return exact match
        cell.Offset(0, 6).Value = Application.VLookup(cell, contractrange, 1, False)

        'In column H, vlookup column A cell value in contractrange's column A, only return exact match
        cell.Offset(0, 7).Value = Application.VLookup(cell, contractrange, 3, False)
    End If
    'Repeat for all cells in range
Next cell


End Sub

【讨论】:

  • 效果很好,非常感谢您的帮助 Jarom。我现在可以看到哪里出错了
猜你喜欢
  • 2019-01-07
  • 2023-03-27
  • 2013-04-10
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多