【问题标题】:How to fix "Run-time error '1004'" cause by Target.Formula function如何修复由 Target.Formula 函数引起的“运行时错误'1004'”
【发布时间】:2019-05-22 10:09:34
【问题描述】:

我有一个文件,我想检查单元格“$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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    主要问题

    您需要将; 切换为,,因为.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)"
    

    【讨论】:

    • 到目前为止工作,但我需要添加另一行来检查 I 列中是否有值。因为如果 I 列中没有值,则代码会产生错误。你能帮忙解决这个问题吗?
    • 您可以使用Me.Cells(iCell.Row, "I").Value 访问第一列同一行中的值。使用它来构建您的支票If iCell.Value = vbNullString And Me.Cells(iCell.Row, "I").Value &lt;&gt; vbNullString Then。另请注意,我添加了 Application.EnableEvents = False 包含错误处理,这是避免写入单元格触发另一个更改事件所必需的(我忘记了)。
    【解决方案2】:

    在 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)"
    

    看看有没有效果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多