如何获取Excel电子表格以自动填充日期&;使用VBA的时间?

如何获取Excel电子表格以自动填充日期&;使用VBA的时间?,vba,excel,Vba,Excel,尝试在Excel上获取启用宏的工作表,以便在列B或C中输入任何值时自动填充日期和时间 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Integer For i = 2 To 100 If Cells(i, "B").Value <> " " And Cells(i, "C").Value = " " Then Cells(i, "F").Value = Date & " "

尝试在Excel上获取启用宏的工作表,以便在列B或C中输入任何值时自动填充日期和时间

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Integer
  For i = 2 To 100
    If Cells(i, "B").Value <> " " And Cells(i, "C").Value = " " Then
      Cells(i, "F").Value = Date & " " & Time
      Cells(i, "F").NumberFormat = "m/d/yyyy h:mm AM/PM"
    End If
  Next
  Range("F:F").EntireColumn.AutoFit
End Sub
Private子工作表\u更改(ByVal目标作为范围)
作为整数的Dim i
对于i=2到100
如果单元格(i,“B”).Value“”和单元格(i,“C”).Value=”“,则
单元格(i,“F”)。值=日期和时间
单元格(i,“F”).NumberFormat=“m/d/yyyy h:mm AM/PM”
如果结束
下一个
射程(“F:F”).Enterecumn.AutoFit
端接头
我写的代码有什么问题吗

“目标”将是更改的单元格。一次可以更改多个单元格(通过ctrl-enter键),因此检查目标中的所有单元格不是一个坏主意

如果使用Intersect方法,它将仅获取目标区域和要检查重叠的范围。然后,这将在这些单元格中循环(如果有),如果找到值,则给它们加上时间戳

正如其他人提到的,在插入戳记之前禁用事件将阻止调用另一个工作表更改事件。调试时要小心,不要关闭事件

您可以在此处阅读有关事件参数的更多信息:


几个小变化:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Integer
  Application.EnableEvents = False
    If Target.Column = 2 Or Target.Column = 3 Then
      For i = 2 To 100
        If Cells(i, "B").Value <> " " And Cells(i, "C").Value = " " Then
          Cells(i, "F").Value = Date & " " & Time
          Cells(i, "F").NumberFormat = "m/d/yyyy h:mm AM/PM"
        End If
      Next
    End If
  Range("F:F").EntireColumn.AutoFit
  Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
作为整数的Dim i
Application.EnableEvents=False
如果Target.Column=2或Target.Column=3,则
对于i=2到100
如果单元格(i,“B”).Value“”和单元格(i,“C”).Value=”“,则
单元格(i,“F”)。值=日期和时间
单元格(i,“F”).NumberFormat=“m/d/yyyy h:mm AM/PM”
如果结束
下一个
如果结束
射程(“F:F”).Enterecumn.AutoFit
Application.EnableEvents=True
端接头
关闭偶数,以便在代码进行修改时不触发偶数,并测试目标列以查看其是否为B或C,并且仅在其为B或C时触发偶数


另外,您知道您的代码将更新第2行到第100行,而不管哪一行被正确更改?如果您只需要更改的行,则可以使用target.row获得该行。您不希望每次工作表上的任何内容更改时都执行所有这些操作;仅当影响时间戳有效性的内容发生更改时。通常,我们将使用
Intersect
来确定更改的值之一是否应接收新的时间戳。您也不希望例程尝试在自身之上运行,因此建议在更改值(即添加时间戳)之前关闭事件处理

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B:C")) Is Nothing Then
        On Error GoTo SafeExit
        Application.EnableEvents = False
        Dim bc As Range   'no sense in declaring something until we actually need it
        For Each bc In Intersect(Target, Range("B:C")) 'deal with every cell that intersects. This is how to handle pastes into more than one cell
            If Not IsEmpty(Cells(bc.Row, "B")) And Not IsEmpty(Cells(bc.Row, "C")) Then
                Cells(bc.Row, "F").Value = Now 'Now is the equivalent of Date + Time
                Cells(bc.Row, "F").NumberFormat = "m/d/yyyy h:mm AM/PM"
            End If
        Next bc
        'Range("F:F").EntireColumn.AutoFit 'this slows things down. you may want to comment this out and just set an apprpriate column width that will handle everything
    End If
SafeExit:
    Application.EnableEvents = True
End Sub

这就是我对这个老问题的看法。有很多例子。查看本页右侧下方的相关部分,可以找到一些链接。

您有一个and=并需要将and改为Or:)还要检查空白单元格,您不需要在这些引号中留空格。如果通过内容清除,B列和C列中的一个或两个单元格都是空白的,是否应该删除F列中的时间戳?好问题。不,我不希望发生这样的事情,因为实现EnableEvents是必要的,而且实现多个值可以改变。我错过了那些:)
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B:C")) Is Nothing Then
        On Error GoTo SafeExit
        Application.EnableEvents = False
        Dim bc As Range   'no sense in declaring something until we actually need it
        For Each bc In Intersect(Target, Range("B:C")) 'deal with every cell that intersects. This is how to handle pastes into more than one cell
            If Not IsEmpty(Cells(bc.Row, "B")) And Not IsEmpty(Cells(bc.Row, "C")) Then
                Cells(bc.Row, "F").Value = Now 'Now is the equivalent of Date + Time
                Cells(bc.Row, "F").NumberFormat = "m/d/yyyy h:mm AM/PM"
            End If
        Next bc
        'Range("F:F").EntireColumn.AutoFit 'this slows things down. you may want to comment this out and just set an apprpriate column width that will handle everything
    End If
SafeExit:
    Application.EnableEvents = True
End Sub