首页 > 解决方案 > 对于范围内的每个单元格,如果单元格值不为空,则 vlookup

问题描述

由于运行时错误“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 开头的第一行

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

标签: vbaexcel

解决方案


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

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

试试这个:

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

推荐阅读