我可以使以下代码中的一个或另一个工作,但同时需要它们。第一个在输入数据时将单元格锁定在范围内,第二个在完成每行D列中的最终数据输入时插入日期戳。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim xRg As Range
On Error Resume Next
Set xRg = Intersect(Range("A8:D5005"), Target)
If xRg Is Nothing Then Exit Sub
Target.Worksheet.Unprotect Password:="Midnight"
xRg.Locked = True
Target.Worksheet.Protect Password:="Midnight"
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Range("D8:D5005")
If Not Intersect(Target, rng) Is Nothing Then
Target.Offset(0, 1) = Now
Target.Offset.NumberFormat = "dd/mm/yyyy hh:mm:ss"
End If
End Sub
答案 0 :(得分:1)
我不确定您的工作表的结构100%正确,因此以下是我的回答假设。您只希望用户修改“ A8:D5005”范围内的单元格…以及要在工作表上的某个位置记录更改的单元格的日期/时间戳。
因此,我将首先通过转到Excel“查看”功能区(不在VBA中)来保护工作表,并按如下所示设置可编辑范围。
在关闭对话框之前,单击“保护表”,以便表的其余部分受到密码保护。
完成此操作后……您可以使用下面的代码来记录日期/时间戳。在此示例中……我将它们记录在可编辑范围右侧的列中(假设您的可编辑数据仅在D列中)。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vIntersect As Variant
Set vIntersect = Application.Intersect(Target, Range("A8:D5005"))
If Not vIntersect Is Nothing Then
Application.EnableEvents = False
Target.Worksheet.Unprotect Password:="Midnight"
Target.Offset(0, 5) = Now
Target.Offset(0, 5).NumberFormat = "dd/mm/yyyy hh:mm:ss"
Target.Worksheet.Protect Password:="Midnight"
Application.EnableEvents = True
End If
End Sub
希望这会有所帮助。
答案 1 :(得分:1)
我仍在猜测您要尝试做的事情……但是这是允许您的用户输入四个数据点,然后按按钮将数据点添加到受保护列表的方法……并且包括时间戳。
首先通过使用“格式化单元格”选项在A4到D4中设置4个数据输入单元格,对于“保护”选项卡上的 Locked (锁定)未选中的这些单元格,请确保。
接下来创建一个按钮并将该按钮链接到以下代码:
Sub ButtonCode()
ActiveSheet.Unprotect Password:="A"
Range("A7:E7").Insert xlShiftDown
Range("A4:D4").Copy Range("A7:D7")
Range("E7") = Now()
Range("A7:E7").Interior.Color = rgbLightBlue
Range("A7:E7").Font.Color = rgbBlack
ActiveSheet.Protect Password:="A"
End Sub
保护工作表是一次只能做的一步;我的示例始终使用密码“ A”。请注意,您的用户无需随时输入密码。
设置工作表后,单击按钮,代码将解锁工作表(允许它进行编辑),将现有数据向下移动,将新数据点复制到列表顶部,添加时间戳和一些最小的格式。然后,它将重新启用保护,以使用户无法覆盖现有条目。
下面的屏幕快照让您大致了解它的外观,包括显示A4:D4需要解锁。
也许不是您正在考虑的实现方向……但是此示例中包含的原理可能对您有用。一切顺利。