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