如何修复由Target.Formula函数引起的“运行时错误'1004'”

时间:2019-05-22 10:09:35

标签: excel vba

我有一个文件,我想检查单元格“ $ A $ 2”是否为空,如果是这样,我想在该单元格中添加公式(=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE)。我运行下面的代码会生成

  

运行时错误“ 1004”(应用程序定义的错误或对象定义的错误)。

我已经使用了目标公式,并且如果我使用简单的公式,例如=B1+B2,那么它会起作用,并且我不会收到错误消息。因此,似乎与导致错误的Vlookup公式有关。

Private Sub Worksheet_Change(ByVal Target As Range)
    If (Target.Cells.Address = "$A$2" And Target = vbNullString) Then
        Target.Formula = "=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE)"
    End If
End Sub

我希望单元格"$A$2"会显示公式=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE)的结果,除非该单元格被手动覆盖。

感谢您的帮助@Pᴇʜ@eirikduade @Gareth!

现在,我正在尝试对A列中所有具有相同值的I列中的值的所有单元格执行相同的操作,而我却难以使用.Range函数。您能否给我任何有关如何修复以下代码的建议:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lastRowF As Integer
    lastRowF = Sheet3.Cells(Sheet3.Rows.Count, "I").End(xlUp).Row
    For j = 1 To lastRowF
        If Intersect(Target, Me.Range(Cells(j, 2))) Is Nothing Then Exit Sub
        If Me.Range(.Cells(j, 2)) = vbNullString Then
            Me.Range(.Cells(j, 2)).Formula = "=VLOOKUP(""" & cells.(y, 1) & """,'Raw Data'!$A$1:$AH$5000,4,FALSE)"
            Exit For
        End If
    Next j
End Sub

3 个答案:

答案 0 :(得分:2)

主要问题

您需要将;切换为,,因为.Formula必须是使用,的公式的原始英文版本。

如果Target是多个单元格范围,则您的代码将失败

请注意,例如,您的代码将失败。复制粘贴一个范围(而不是单个单元格)。

将其更改为以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("A2")) Is Nothing Then Exit Sub

    Application.EnableEvents = False
    On Error Goto ENABLE_EVENTS

    If Me.Range("A2").Value = vbNullString Then
        Me.Range("A2").Formula = "=VLOOKUP($I$2,'Raw Data'!$A$1:$AH$5000,4,FALSE)"
    End If

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

如果您需要对A列中的多个单元格执行此操作,则应如下所示:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim AffectedRange As Range
    Set AffectedRange = Intersect(Target, Me.Range("A2:A" & Me.Rows.Count))

    Application.EnableEvents = False
    On Error Goto ENABLE_EVENTS

    If Not AffectedRange Is Nothing Then
        Dim iCell As Range
        For Each iCell In AffectedRange.Cells
            If iCell.Value = vbNullString Then
                iCell.Formula = "=VLOOKUP($I" & iCell.Row & ",'Raw Data'!$A$1:$AH$5000,4,FALSE)"
            End If
        Next iCell
    End If

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

请注意,您可能打算使用

"=VLOOKUP($I" & iCell.Row & ", 'Raw Data'!$A$1:$AH$5000,4,FALSE)"

代替

"=VLOOKUP($I$2, 'Raw Data'!$A$1:$AH$5000,4,FALSE)"

答案 1 :(得分:0)

在VBA代码中,即使本地定界符为分号,也必须使用逗号分隔函数中的参数。

即换行

Target.Formula = "=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE)"

Target.Formula = "=VLOOKUP($I$2,'Raw Data'!$A$1:$AH$5000,4,FALSE)"

看看是否可行

答案 2 :(得分:-2)

您不能使用

Target = vbNullString

因为目标是一个范围,并且在代码运行时它更改了重新调用Sub的单元格。现在,Range具有无法明确评估为Text的公式,因此会引发错误。 为了避免这种用途

Target.Cells(1, 1).Text = vbNullString

这是明确的,可以防止错误。

但是正如eirikdaude指出的那样,您还需要将分号更改为逗号。

说了这么多,您实际上不需要显式检查哪个单元已更改,因此您可以使其更简单。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Me.Range("A2").Text = vbNullString Then
        Me.Range("A2").Formula = "=VLOOKUP($I$2,'Raw Data'!$A$1:$AH$5000,4,FALSE)"
    End If
End Sub