如何获取Excel电子表格以自动填充日期&;使用VBA的时间?
尝试在Excel上获取启用宏的工作表,以便在列B或C中输入任何值时自动填充日期和时间如何获取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 & " "
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