我对在Excel中对VBA进行编码非常陌生,仅需要有关excel中简短脚本的帮助。请参见下面的脚本:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim rng As Range
Set rng = Range("D4:D10")
Dim CellLocation
Set CellLocation = Application.Intersect(Target.Dependents, rng)
If Not CellLocation Is Nothing Then
MsgBox "Current Cell Location is" & CellLocation.Address
If CellLocation.Value = "True" And CellLocation.Value <> "" And CellLocation.Offset(0, 1) = "Ready" Then
'Call Initiate_Email_Sending
MsgBox "Second Trigger"
Else
Exit Sub
End If
End If
End Sub
我的问题是,每次我编辑一个单元格(与此有关的任何一个单元格)并在工作表中按Enter时,似乎总是会触发第二个if语句。 请参见下表的屏幕截图:
例如在编辑单元格B4,然后按Enter键之后,它似乎绕过了第一个If语句,而直接进入了第二个if语句。
我想在这里实现的是,我希望宏能够在D列具有“ True”状态时自动触发,因为E列具有“ Ready”状态,并且我认为差不多。
我在这里做错了什么? :(
D列上的公式只是一个虚拟公式,用于基于C列的值模拟自动更新(公式为= if(C4 = 1,“ True”,“ false”))。请参见下面的屏幕截图。
答案 0 :(得分:0)
在编码之前需要导入一些东西,我们需要正确设置公式。您可以通过“ 显示公式(Ctrl +`)”进行检查。如果该行不包含正确的公式,然后您操作一个单元格(例如带有1/2的列),则将忽略 CellLocation 上的操作,我不确定这是否是已知的错误/行为。由于操作被忽略,因此将显示“ 第二触发器”。如果我们正确设置了公式,则 CellLocation.Value 将返回True或false。
根据我的测试,您可以修改if语句(如果正确配置了公式):
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim rng As Range
Set rng = Range("D4:D100")
Dim CellLocation
Set CellLocation = Application.Intersect(Target.Dependents, rng)
If Not CellLocation Is Nothing Then
MsgBox "Previous Cell Location is " & CellLocation.Address
'MsgBox "Previous Cell Offset's value is " & CellLocation.Offset(0, 1).Text & CellLocation.Offset(0, 1).Value
If IsEmpty(Target) Or IsEmpty(Target.Offset(0, -1)) Then Exit Sub
If CellLocation.Value = "True" And CellLocation.Offset(0, 1).Value = "Ready" Then
'Call Initiate_Email_Sending
MsgBox "Second Trigger"
Else
Exit Sub
End If
End If
End Sub
如果公式设置不正确,我们将无法继续代码中的If语句。
答案 1 :(得分:-2)
在空单元格中似乎没有一个空字符串。有几种方法可以测试单元格中是否没有内容,即null,nothing,empty,empty-string等。please read here a bit。基本上
希望这会有所帮助。