Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我有一个在excel表格中记录使用情况的代码,但我有一个bug和一个问题_Excel_Vba - Fatal编程技术网

我有一个在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
    将以前的值设置为对象
    私人分包工程