微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅当单元格从空白变为填充时才执行工作表更改

如何解决仅当单元格从空白变为填充时才执行工作表更改

当我尝试为列表中的新项目编号并在相关列的同一行中填充相关认值时遇到了一个问题。如果单元格已经填充了数据,我不希望其他列中的单元格发生变化。即,如果目标列中的目标单元格中​​有信息并且有人编辑了信息,我不希望它删除该行其他列中的信息。

我已经编写了以下代码来实现这一点,但我不确定如何检查目标单元格中​​是否已经包含文本,因为我尝试的方法没有奏效(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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?