如何解决仅当单元格从空白变为填充时才执行工作表更改
当我尝试为列表中的新项目编号并在相关列的同一行中填充相关默认值时遇到了一个问题。如果单元格已经填充了数据,我不希望其他列中的单元格发生变化。即,如果目标列中的目标单元格中有信息并且有人编辑了信息,我不希望它删除该行其他列中的信息。
我已经编写了以下代码来实现这一点,但我不确定如何检查目标单元格中是否已经包含文本,因为我尝试的方法没有奏效(If IsEmpty(Target.Value) = True Then)。
If IsEmpty(Target.Value) = True Then
Dim Description_Column_No As Integer
Dim Default_Start As String
'Inputs
Default_Start = "N/A"
Description_Column_No = 3
'Output Columns
Output_Col_Item = Description_Column_No - 1
Output_Col_1 = Description_Column_No + 6
Output_Col_2 = Description_Column_No + 18
Output_Col_3 = Description_Column_No + 28
Output_Col_4 = Description_Column_No + 38
Output_Col_5 = Description_Column_No + 44
Output_Col_6 = Description_Column_No + 55
Output_Col_7 = Description_Column_No + 62
'Adding the date to the relevant cell
'Setting the Item Number for the new Item
With _
Target(Target.Row,Output_Col_Item).Value = Target.Row - 5
End With
'Setting the dropdowns to default values
With _
Target(Target.Row,Output_Col_1).Value = Default_Start
End With
With _
Target(Target.Row,Output_Col_2).Value = Default_Start
End With
With _
Target(Target.Row,Output_Col_3).Value = Default_Start
End With
With _
Target(Target.Row,Output_Col_4).Value = Default_Start
End With
With _
Target(Target.Row,Output_Col_5).Value = Default_Start
End With
With _
Target(Target.Row,Output_Col_6).Value = Default_Start
End With
With _
Target(Target.Row,Output_Col_7).Value = Default_Start
End With
End If
解决方法
先拆开这个:
With _
Target(Target.Row,Output_Col_1).Value = Default_Start
End With
这是一个空的 With
块(如果去掉 _
会更明显)
With Target(Target.Row,Output_Col_1).Value = Default_Start
'nothing here...
End With
这个:
Target(Target.Row,Output_Col_1)
与
相同Target.Cells(Target.Row,Output_Col_1)
但可能会产生意想不到的结果,因为 Cells()
总是相对于它被调用的对象运行,例如,如果 Target
是(例如)B5,那么上面的表达式与 [B5].Cells(5,9)
或 J9...
最后,当 With
块运行时,看起来像值赋值(“将范围值设置为 'N/A'”)作为值比较运行 ("是范围值 'N/A' 吗?") ,因此它不会导致对您的工作表进行任何更新。
也就是说,感觉我们在其余未显示的代码中遗漏了一些上下文,但您发布的代码可以改进/压缩:
Const DESCR_COL As Long = 3
Const DEFAULT_VAL As String = "N/A"
Dim v,c As Range
'...
'...
If IsEmpty(target.Value) Then
With target.EntireRow
.Cells(DESCR_COL - 1).Value = .Row - 5
For Each v In Array(6,18,28,38,44,55,62)
Set c = .Cells(DESCR_COL + v)
If Len(c.Value) = 0 Then c.Value = DEFAULT_VAL
Next v
End With
End If
使用行号来分配“Id”是一个问题 - 重新排序或插入/删除行会导致下一个条目出现问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。