【问题标题】:VBA Timestamp executing first instance but not secondVBA时间戳执行第一个实例但不是第二个
【发布时间】:2020-02-14 13:04:54
【问题描述】:

我有一个大型数据集,其中包含许多要更新的不同列。我正在尝试创建一种方法来标记日期/时间,以了解上次更新列的时间。我需要为 4 个单独的实例执行此操作。

我遇到的问题是它似乎对 VBA 的第一个实例工作正常,但无论如何都不会在另一列上执行。请在下面查看我的完整代码示例:

Sub Worksheet_Change(ByVal Target As Range)

Dim myTableRange1 As Range
Dim myDateTimeRange1 As Range
Dim myUpdatedrange1 As Range

Set myTableRange1 = Range("S:S")

If Intersect(Target, myTableRange1) Is Nothing Then Exit Sub

Set myDateTimeRange1 = Range("A" & Target.Row)
Set myUpdatedrange1 = Range("X" & Target.Row)


If myDateTimeRange1.Value = "" Then
    myDateTimeRange1.Value = Now

End If
myUpdatedrange1.Value = Now

End Sub

Sub Worksheet_Change2(ByVal Target As Range)

Dim myTableRange2 As Range
Dim myDateTimeRange2 As Range
Dim myUpdatedrange2 As Range

Set myTableRange2 = Range("T:T")

If Intersect(Target, myTableRange2) Is Nothing Then Exit Sub

Set myDateTimeRange2 = Range("zz" & Target.Row)
Set myUpdatedrange2 = Range("Y" & Target.Row)


If myDateTimeRange2.Value = "" Then
    myDateTimeRange2.Value = Now

End If
myUpdatedrange2.Value = Now

End Sub

****更新****

我也尝试将这段代码合并在一起,如下所示:

Sub Worksheet_Change(ByVal Target As Range)

Dim myTableRange1 As Range
Dim myDateTimeRange1 As Range
Dim myUpdatedrange1 As Range
Dim myTableRange2 As Range
Dim myDateTimeRange2 As Range
Dim myUpdatedrange2 As Range

Set myTableRange1 = Range("S:S")
Set myTableRange2 = Range("T:T")

If Intersect(Target, myTableRange1) Is Nothing Then Exit Sub
If Intersect(Target, myTableRange2) Is Nothing Then Exit Sub

Set myDateTimeRange1 = Range("A" & Target.Row)
Set myUpdatedrange1 = Range("X" & Target.Row)
Set myDateTimeRange2 = Range("zz" & Target.Row)
Set myUpdatedrange2 = Range("Y" & Target.Row)


If myDateTimeRange1.Value = "" Then
    myDateTimeRange1.Value = Now
If myDateTimeRange2.Value = "" Then
    myDateTimeRange2.Value = Now

End If
myUpdatedrange1.Value = Now
End If
myUpdatedrange2.Value = Now

End Sub

这导致两者都不起作用。

我是 VBA 新手,因此我们将不胜感激。谢谢你

【问题讨论】:

  • 每张工作表只能有一个Worksheet_Change事件,所以你需要结合你的代码。
  • 谢谢你会按照Sub Worksheet_Change(ByVal Target As Range) Dim myTableRange1 As Range Dim myTableRange2 As Range的方式写然后对每个部分重复这个吗?
  • 是的,您必须更改相交线以覆盖两列,然后根据更改的列设置一个块。如果 Target 是多个单元格,您将需要遍历该范围(或者可以在代码 if target.count>1 then exit sub 中排除该范围)。
  • @SJR 我已经用修改后的代码更新了我的问题,结果没有产生任何结果
  • 使用这个很酷的indenter,你会发现你的End Ifs 不是都在正确的位置。

标签: excel vba timestamp


【解决方案1】:

你需要这样的东西(大纲形式),以免对单个列的更改打折扣。

如果您只更改了 T,则更新后的代码将在获取相关代码之前退出。

如果你改变了 S 和 T,它只会做 S 位。

Sub Worksheet_Change(ByVal Target As Range)

Dim myTableRange1 As Range
Dim myDateTimeRange1 As Range
Dim myUpdatedrange1 As Range
Dim myTableRange2 As Range
Dim myDateTimeRange2 As Range
Dim myUpdatedrange2 As Range

Set myTableRange1 = Range("S:S")
Set myTableRange2 = Range("T:T")

If Not Intersect(Target, myTableRange1) Is Nothing Then
    'your column S code

ElseIf Not Intersect(Target, myTableRange2) Is Nothing Then
    'your column T code

End If

End Sub

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2020-12-12
    相关资源
    最近更新 更多