对于范围内的每个单元格,如果单元格值不为空,则vlookup

时间:2018-05-23 13:48:00

标签: excel vba excel-vba

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

通常当我遇到这个错误是由于纸张保护时,我已经确保纸张不受保护,因此在子纸张的开头就有了这条线。

我将在这里支付方案和最终目标:

Sheet1 =实时合约

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

工作表4 =合同总和

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

目标

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

模块需要查看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比较陌生,为代码不好道歉!

1 个答案:

答案 0 :(得分: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
相关问题