我有一个在excel表格中记录使用情况的代码,但我有一个bug和一个问题
这是一个通用的日志系统,这里的一些人和我自己创建的。我很自豪。。。我遇到了两个问题。。。如果有人能帮助解决问题,那就太好了 代码如下:我有一个在excel表格中记录使用情况的代码,但我有一个bug和一个问题,excel,vba,Excel,Vba,这是一个通用的日志系统,这里的一些人和我自己创建的。我很自豪。。。我遇到了两个问题。。。如果有人能帮助解决问题,那就太好了 代码如下: Option Explicit Dim PreviousValue Private Sub Worksheet_Change(ByVal Target As Range) Dim sLogFileName As String, nFileNum As Long, sLogMessage As String sLogFileName = Thi
Option Explicit
Dim PreviousValue
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sLogFileName As String, nFileNum As Long, sLogMessage As String
sLogFileName = ThisWorkbook.path & Application.PathSeparator & "Log.txt"
On Error Resume Next ' Turn on error handling
If Target.Value <> PreviousValue Then
' Check if we have an error
If Err.Number = 13 Then
PreviousValue = 0
End If
' Turn off error handling
On Error GoTo 0
sLogMessage = Now & Application.UserName & " changed cell " & Target.Address _
& " from " & PreviousValue & " to " & Target.Value
nFileNum = FreeFile ' next file number
Open sLogFileName For Append As #nFileNum ' create the file if it doesn't exist
Print #nFileNum, sLogMessage ' append information
Close #nFileNum ' close the file
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
PreviousValue = Target(1).Value
End Sub
选项显式
模糊先前值
私有子工作表_更改(ByVal目标作为范围)
Dim sLogFileName为字符串,nFileNum为长,sLogMessage为字符串
sLogFileName=ThisWorkbook.path和Application.PathSeparator&“Log.txt”
错误恢复下一步“打开错误处理”
如果Target.Value PreviousValue,则
'检查我们是否有错误
如果错误编号=13,则
上一个值=0
如果结束
'关闭错误处理
错误转到0
sLogMessage=Now&Application.UserName&“已更改单元格”&Target.Address_
&“from”&PreviousValue&“to”&Target.Value
nFileNum=FreeFile的下一个文件号
打开sLogFileName以附加为#nFileNum'如果文件不存在,则创建该文件
打印#nFileNum,sLogMessage'附加信息
关闭#nFileNum“关闭文件”
如果结束
端接头
专用子工作表\u选择更改(ByVal目标作为范围)
PreviousValue=目标(1)。值
端接头
以下是两个问题
8/30/2012 1:45:01 PM Matthew Ridge将单元格$K$3从测试更改为,而不是8/30/2012 1:45:01 PM Matthew Ridge将单元格$K$3从测试更改为空白或空
错误恢复下一步
处理不正确。除非绝对必要,否则应避免工作表\u Change
事件时,最好先关闭事件,然后在结束时再打开它们,以避免可能出现的无休止循环PreviousValue
中存储单个单元格,因此我假设您不希望在用户选择多个单元格时运行代码选项显式
模糊先前值
私有子工作表_更改(ByVal目标作为范围)
Dim sLogFileName为字符串,nFileNum为长,sLogMessage为字符串
昏暗的纽瓦尔
关于错误转到哇
Application.EnableEvents=False
sLogFileName=ThisWorkbook.Path&Application.PathSeparator&“Log.txt”
如果不是Target.Cells.Count>1,则
如果Target.Value PreviousValue,则
如果Len(Trim(Target.Value))=0,则_
NewVal=“Blank”否则NewVal=Target.Value
sLogMessage=Now&Application.UserName&_
“已更改单元格”&目标地址&“发件人”&_
上一个值&“to”&新值
nFileNum=FreeFile
打开附加为#nFileNum的sLogFileName
打印文件、慢消息
关闭#nFileNum
如果结束
如果结束
让我们继续:
Application.EnableEvents=True
出口接头
哇
MsgBox错误说明
继续
端接头
专用子工作表\u选择更改(ByVal目标作为范围)
PreviousValue=目标(1)。值
端接头
Matt
几件事
错误恢复下一步
处理不正确。除非绝对必要,否则应避免工作表\u Change
事件时,最好先关闭事件,然后在结束时再打开它们,以避免可能出现的无休止循环PreviousValue
中存储单个单元格,因此我假设您不希望在用户选择多个单元格时运行代码选项显式
模糊先前值
私有子工作表_更改(ByVal目标作为范围)
Dim sLogFileName为字符串,nFileNum为长,sLogMessage为字符串
昏暗的纽瓦尔
关于错误转到哇
Application.EnableEvents=False
sLogFileName=ThisWorkbook.Path&Application.PathSeparator&“Log.txt”
如果不是Target.Cells.Count>1,则
如果Target.Value PreviousValue,则
如果Len(Trim(Target.Value))=0,则_
NewVal=“Blank”否则NewVal=Target.Value
sLogMessage=Now&Application.UserName&_
“已更改单元格”&目标地址&“发件人”&_
上一个值&“to”&新值
nFileNum=FreeFile
打开附加为#nFileNum的sLogFileName
打印文件、慢消息
关闭#nFileNum
如果结束
如果结束
让我们继续:
Application.EnableEvents=True
出口接头
哇
MsgBox错误说明
继续
端接头
专用子工作表\u选择更改(ByVal目标作为范围)
PreviousValue=目标(1)。值
端接头
这对我很有效。理想情况下,您应该在被跟踪的工作表上有一个命名范围,您可以使用该范围将跟踪限制为仅对该范围内发生的更改进行跟踪
Const MAX_TRACKED_CELLS As Long = 50
Dim PreviousValues As Object
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Dim haveDict As Boolean, val, addr
haveDict = Not PreviousValues Is Nothing
If Target.Cells.Count <= MAX_TRACKED_CELLS Then
For Each c In Target.Cells
addr = c.Address()
If haveDict Then
If PreviousValues.exists(addr) Then
val = PreviousValues(addr)
End If
Else
val = "{unknown}"
End If
If c.Value <> val Then
Debug.Print "Changed:", addr, IIf(val = "", "Empty", val), _
" to ", IIf(c.Value = "", "Empty", c.Value)
End If
Next c
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
If PreviousValues Is Nothing Then
Set PreviousValues = CreateObject("scripting.dictionary")
Else
PreviousValues.RemoveAll
End If
If Target.Cells.Count <= MAX_TRACKED_CELLS Then
For Each c In Target.Cells
PreviousValues.Add c.Address(), c.Value
Next c
End If
End Sub
Const MAX\u跟踪的\u单元格长度=50
将以前的值设置为对象
私有子工作表_更改(ByVal目标作为范围)
调光范围
Dim haveDict作为布尔值、val、addr
haveDict=非先前值为零
如果Target.Cells.Count这对我有效。理想情况下,您应该在被跟踪的工作表上有一个命名范围,您可以使用该范围将跟踪限制为仅对该范围内发生的更改进行跟踪
Const MAX_TRACKED_CELLS As Long = 50
Dim PreviousValues As Object
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Dim haveDict As Boolean, val, addr
haveDict = Not PreviousValues Is Nothing
If Target.Cells.Count <= MAX_TRACKED_CELLS Then
For Each c In Target.Cells
addr = c.Address()
If haveDict Then
If PreviousValues.exists(addr) Then
val = PreviousValues(addr)
End If
Else
val = "{unknown}"
End If
If c.Value <> val Then
Debug.Print "Changed:", addr, IIf(val = "", "Empty", val), _
" to ", IIf(c.Value = "", "Empty", c.Value)
End If
Next c
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
If PreviousValues Is Nothing Then
Set PreviousValues = CreateObject("scripting.dictionary")
Else
PreviousValues.RemoveAll
End If
If Target.Cells.Count <= MAX_TRACKED_CELLS Then
For Each c In Target.Cells
PreviousValues.Add c.Address(), c.Value
Next c
End If
End Sub
Const MAX\u跟踪的\u单元格长度=50
将以前的值设置为对象
私人分包工程