2013-07-22 31 views
1

我希望我的Excel电子表格列B仅在列A第一次更改时加盖日期时间。我看过很多VBA代码,但它捕获了最后一次更改,而不是第一次更改。Excel - 使用日期时间更新另一个单元格的更新列

我试图用这样的:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Column = 1 And Target.Offset(0, 1).Value = "" Then 
     Target.Offset(0, 1) = Format(Now(), "HH:MM:SS") 
    End If 
End Sub 

它的工作除了当我复制并粘贴到发言权3行,日期时间标记只显示了第一个的3条记录。

+0

什么意思是“第一次更改” - 每次打开工作簿后;总是在B空时; ...? – KekuSemau

回答

0

下面的代码对我的作品

Private Sub Worksheet_Change(ByVal Target As Range) 

    On Error Resume Next 

    Application.EnableEvents = False 

    If Target.Column = 1 And Target.Offset(0, 1).Value = "" Then 
     Target.Offset(0, 1) = Format(Now(), "HH:MM:SS") 
    End If 

    Application.EnableEvents = True 
End Sub 
+0

如果B列中已经存在值并且某些值被再次粘贴,那么这不起作用,因为错误处理被禁用,并且忽略对“Value =”“'的检查。 –

+0

@AndyG如果列中存在值,则表示列A中的相应值已编辑。 – Santosh

-1

我收到当试图粘贴到A列的几个单元,从该行的错误消息:

Target.Offset(0, 1).Value = "" 

这是因为偏移量是一个多于一个单元格的范围,我们无法将此范围的Value与单个值进行比较。您可以检查Target.Rows.Count。如果这个值大于1,那么你可以遍历Target范围,每次在输入Offset(0, 1)之前检查相邻单元是否为空。

通过Target细胞下面的循环,并有效,即使目标是单细胞:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rng As Range 

    If Target.Column = 1 Then 
     Application.EnableEvents = False 
     For Each rng In Target 
      If rng.Offset(0, 1).Value = "" Then 
       rng.Offset(0, 1) = Format(Now(), "HH:MM:SS") 
      End If 
     Next rng 
     Application.EnableEvents = True 
    End If 
End Sub 

您也应该检查是否Target超出一列。如果是这样,那么大概你只想把邮票输入到B栏(对于A栏的更改)。

相关问题