9

以下の変更を参照するようにコードが更新されました。

このログ システムは、Log.txt と呼ばれる Excel の外部ドキュメントを作成します。log.txt ファイルに次のような行が作成されます。

11:27:20 AM Matthew Ridge がセル $N$55 を ss から ss に変更しました

誰かが新しいコード行をシートに入力したかどうかはわかりませんが、コードが回答を要求している場合は、その回答がどのセルにあるかがわかります。以下のコードは、Mac と PC の両方のシステムを組み合わせて機能するはずです。人々がそれを見つけたら、言ってください。

このコードは、ここの人々の助けを借りて作成されたものであり、他の形式であるため、ドキュメントの独占所有権を取得することはできませんが、概念の所有権を取得することはできます。だから、助けてくれた人たちに感謝します.これがなければ、私の意見ではExcelの実行可能なログシステムはありません;)

ところで、だれかがびっくりして、このコードがどこにあるのか尋ねる前に、一般/新しいエンド ユーザーには明らかではありません。[開発者] タブを開いて [Visual Basic] をクリックし、新しいウィンドウが開いたら Microsoft Excel オブジェクトを探す必要があります。そのフォルダーの下にワークブックがあるはずです。コードを配置するシートをダブルクリックして、ThisWorkbook の下または任意のシート内に配置できます。

シートが右側のパネルで開かれると、Option Explicit が表示されます。そうでない場合は、Require Variable Declarationがチェックされていることを確認して有効にすることをお勧めします。これは再び Visual Basic ウィンドウに表示され、次のパスをたどります。

ツール->オプション->エディタ

チェックされている場合は心配ありませんが、チェックされていない場合はチェックしてください。Option Explicit はコードにとって良いことであり、変数を宣言することを強制します。これは、最初は良い方法です。

検証後、以下のコードをコピーして、必要に応じてワークブックまたは特定のシートに貼り付けることができます。

バージョン 2.01

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

時間が経つにつれて、このコードを更新して、適切と思われる機能を追加しようとします。

繰り返しになりますが、これを可能にしてくれたすべての人に感謝します。

4

3 に答える 3

3

問題は、結合されたセルを入力すると、PreviousValue(in Worksheet_SelectionChange)に入力された値がすべての結合されたセルの配列であり、新しい値と比較できないことです。編集時にWorksheet_Changeが起動されると、ターゲットはマージされた範囲の左上のセルのみになります。それでは、マージされた範囲についてそのセルを追跡してみましょう。Worksheet_SelectionChange次のように置き換えます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    PreviousValue = Target(1).Value
End Sub

免責事項:現時点ではExcel for Windowsにアクセスできないため、これはExcel for Mac 2011でテストされましたが、ExcelforWindowsでも機能すると確信しています。

于 2012-05-01T20:31:42.287 に答える
1

Matt Ridge - 一度に行われる複数の変更に関する解決策をあなたが求めたことは知っていますが、私は 3 年しか遅れていませんが、ここにあります :)。元のコードに若干の変更を加えましたが、これにより、結合されたセルが処理され、セルに対する複数の変更がログに記録されます。

    オプション明示
Dim PreviousValue()

Private Sub Worksheet_Change(ByVal Target As Range) Dim sLogFileName As String、nFileNum As Long、sLogMessage As String、r As Long

sLogFileName = ThisWorkbook.Path & Application.PathSeparator & "Log.txt" 'Check all cells for changes, excluding D4 D5 E5 M1 etc For r = 1 To Target.Count If Target(r).Value <> PreviousValue(r) And Intersect(Target(r), Range("D4,D5,E5,M1")) Is Nothing Then ' Check if we have an error If Err.Number = 13 Then PreviousValue(r) = 0 End If ' Turn off error handling 'On Error GoTo 0 'log data into .txt file sLogMessage = Now & " " & Application.UserName & " changed cell " & Target(r).Address _ & " in " & ActiveSheet.Name & " from " & "'" & PreviousValue(r) & "' to '" & Target(r).Value & "'" & " in workbook " & ThisWorkbook.Path & " " & ActiveWorkbook.Name 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 Next r End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i As Long 'looks at the uppermost cell (incase cells are merged) Redim PreviousValue(1 To Target.Count) For i = 1 To Target.Count PreviousValue(i) = Target(i).Value Next i End sub
于 2015-08-17T07:41:04.750 に答える