[[20100111103159]] 『エクセルデータの変更前と変更後の記録』(あらいぐま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセルデータの変更前と変更後の記録』(あらいぐま)

 いつも拝見させて頂いております。あるエクセルデータ
 を複数人が追加、変更、修正しているのですが、誰が変
 更したのか、どこを変更したのか、翌日分からないとい
 う問題が出ました。

 私としては、「誰が」はいらないとしても、どこが変更
 されたのか、変更するたびに別シートにその変更履歴が
 出るようにしたいのですが、そのようなことは可能でし
 ょうか?

 変更したセル 変更前 変更後
 B2    山田  村上

 ブックの[共有]設定をしてしまえば自動的に変更履歴が記録されるようになります。
 (私はお勧めしませんが)
 一度ヘルプで調べて下さい。
 (seiya)

 共有にしたのですが、変更履歴というのはどこに
 残るものなのでしょうか。

                (あらいぐま)


http://www.juno-e.com/excel/waza/wazaxp192.htm

http://www.atmarkit.co.jp/fwin2k/win2ktips/410excelshare/excelshare.html

 こんなことですか?
 (seiya)


 横から失礼します。
 マクロOKならこんな方法が有ります。
 ブックと同じフォルダに
 shtlog.txt
 というテキストファイルを作成し変更ログを記述していきます。
 ブックの全てのシートが対象になります。
 マクロを無効にされると機能しません。

 'ThisWorkbookモジュール
 'シート変更履歴
 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim logtxt As String
  Dim logtxtstr As String
  Dim rngad As String
  Dim ima As String
  Dim c As Range
   logtxt = ThisWorkbook.Path & "\shtlog.txt"
   If Dir(logtxt) <> "" Then
   Else
      Call TxtOutput(logtxt, "")
   End If
   logtxtstr = Txtinput(logtxt)
   ima = Now
   For Each c In Target
    rngad = Sh.Name & "/" & c.Address(0, 0)
    If logtxtstr <> "" Then logtxtstr = logtxtstr & vbCrLf
    logtxtstr = logtxtstr & ima & vbTab & rngad & vbTab & c.Value
   Next c
   Call TxtOutput(logtxt, logtxtstr)
 End Sub

 '標準モジュール
 Function Txtinput(ByVal txtpath As String) As String
  Dim fnum As Integer
  Dim txtline As String
   Txtinput = ""
   fnum = FreeFile
    Open txtpath For Input As #fnum
     Do Until EOF(fnum)
      Line Input #fnum, txtline
      If Txtinput <> "" Then Txtinput = Txtinput & vbCrLf
      Txtinput = Txtinput & txtline
     Loop
    Close #fnum
 End Function

 Function TxtOutput(ByVal newtxtpath As String, newtxtstr As String)
  Dim fnum As Integer
   fnum = FreeFile
   Open newtxtpath For Output As #fnum
    Print #fnum, newtxtstr;
   Close fnum
 End Function

 変更後のみの記録なのでご希望のものとは違いますが、
 特定のセルのアドレスを抽出すると履歴を追うことができます。

 (MARBIN)

 MARBIN様、ありがとうございます。

 このログに、エクセルデータが開いた時に
 入力する社員番号をのせたいのですが、
 社員番号の変数「shaban」です。

 可能でしょうか。できればログの日付と
 時間の次に表示させたいのですが・・・・

             (あらいぐま)


 >できればログの日付と
 >時間の次に表示させたいのですが・・・・

 こういうことですか?

 >logtxtstr = logtxtstr & ima & vbTab & rngad & vbTab & c.Value

 logtxtstr = logtxtstr & ima & vbTab & rngad & vbTab & c.Value & VbTab & shaban

 (MARBIN)


 ご返信ありがとうございます。

 社員番号が表示されました。ログについて一つ問題が
 あり、基本的にセル内への書き込みについてはマクロ
 を使って入力しています。

 入力しようとしまいと、20個分のセルを同時に上書
 きする形になり、空白であろうとそれがログに残って
 しまいます。またそのため、上書きをするためのコマ
 ンドボタンをクリックしてから、上書きの処理時間+
 ログへの書き込みで、時間がかかってしまいます。

 入力項目が空白だった場合、そのログは書き込まない
 という処理は可能でしょうか?

                  (あらいぐま)


 'シートの変更履歴を残す処理(module2と併用)
 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

  Dim logtxt As String
  Dim logtxtstr As String
  Dim rngad As String
  Dim ima As String
  Dim c As Range
  Dim muneban As Long

  muneban = InputBox

   logtxt = ThisWorkbook.Path & "\log.txt"
   If Dir(logtxt) <> "" Then
   Else
      Call TxtOutput(logtxt, "")
   End If
   logtxtstr = Txtinput(logtxt)
   ima = Now
   For Each c In Target
    rngad = Sh.Name & "/" & c.Address(0, 0)
    If logtxtstr <> "" Then logtxtstr = logtxtstr & vbCrLf
    logtxtstr = logtxtstr & ima & vbTab & rngad & vbTab & muneban & " - " & c.Value
   Next c
   Call TxtOutput(logtxt, logtxtstr)
 End Sub

 社員番号ではなく、munebanとして変数を使おうと上記
 のようにインプットボックスでやってみると、「引数
 は省略できません」と出ます。なぜでしょうか。

                  (あらいぐま)


 MsgBoxでも単独で記入すると同じエラーになります。
 MsgBox "処理を開始します"
 のように引数が必要です。
 InputBoxの使用法をヘルプで確認してください。
 (semm)

  muneban = InputBox("胸番を入力して下さい。")

 上記のようなインプットボックスでやってみたの
 ですが、数値が0として格納されているみたいで
 す。変数の定義はLongにしているのですが・・・

                 (あらいぐま)


 >入力しようとしまいと、20個分のセルを同時に上書
 >きする形になり、空白であろうとそれがログに残って
 >しまいます。またそのため、上書きをするためのコマ
 >ンドボタンをクリックしてから、上書きの処理時間+
 >ログへの書き込みで、時間がかかってしまいます。

 >入力項目が空白だった場合、そのログは書き込まない
 >という処理は可能でしょうか?

 変更前はデータが入っていて、編集後空白になった場合
 はログに残さなくていいのでしょうか?

 そうでしたら、ループ中にTargetの値で条件分岐する
 方法が有ります。
 時間短縮に繋がるかは分かりませんが・・・。

 また、特定のシートのみを対象にしたい場合は
 ブックのイベントではなくシートのイベントのほうが
 適切です。
 セル範囲を限定したい場合は、 Intersectメソッド
 などでイベント起動セル範囲を限定することもできます。

 >muneban = InputBox("胸番を入力して下さい。")

 >上記のようなインプットボックスでやってみたの
 >ですが、数値が0として格納されているみたいで
 >す。変数の定義はLongにしているのですが・・・

 InputBoxで「0」を入力しない限り、「0」が格納
 されることは有りません。

 なお、変数の型をLongにしておくと、InputBoxを
 キャンセルしたりするとエラーになります。
 Variant型にするなどしてキャンセルされた場合
 などの条件 分岐をする必要があるように思います。
 InputBox関数を使っておられますが、
 「InputBox メソッド」というのも有りますので調
 べてみてください。
 (MARBIN)

 お手数をおかけしております。当方の技術が
 ふがいないばかりに、ご迷惑をおかけし申し
 訳ありません。

 >>変更前はデータが入っていて、編集後空白になった場合
 >>はログに残さなくていいのでしょうか?

 ログは残さなくて結構です。現段階では空白
 の分までログを出力している分の時間がかか
 っていると思っております。

 inputboxについてはもう少し調べてみます。

              (あらいぐま)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.