「みんな教えて! 選手権!!」開催のお知らせ

複数人のスタッフで1つのエクセルファイルを管理しています。
管理方法は下記の通りです。

現在、担当しているお客様から連絡やアポイントなどがあったかを記録に残すためのexcelデータを作成しています。
1つのexcelファイルに人数分のシートを作成し、それぞれが自分のシートに毎月の連絡の有無を○×形式で記入していきます。
シート内には各自が担当している案件名と1月~12月までの見出し、備考欄などが記載されています。
それぞれのシートの内容が書き換えられた最終更新日を所定のセルに記載させたいのです。
マクロを使用して下記のような記述をしてみましたが、どれか1つのセルを変更すると全てのシートの最終更新日が同じ時間に更新されたような表記になってしまします。

【使用している関数】=LastSaveTime()
【記述内容】
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
With Sh
If Intersect(Target, .Range("E4:P100")) Is Nothing Then Exit Sub
.Range("Q2").Value = Date
End With
End Sub

複数人でエクセルファイルを管理するため、誰がいつ担当のシートを書き換えたかを記載するためにはどの様な記述をすれば良いのでしょうか?
excel、マクロともに初心者のため分かりやすくお教え頂ければと思います。
お手数をおかけ致しますが、宜しくお願い致します。

A 回答 (3件)

SheetChangeイベントはご理解されているようですね(^^)


で、このSheetChangeイベントは「シートに変更が入った時点で」イベントが発生。処理が動きます。
つまり、この処理の中で「シートに変更」を行うと、またイベントが発生してしまうんですね。
なので・・・イベント発生を一時的に抑止する必要があります。(EnableEvets)


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  'イベント抑止
  Application.EnableEvents = False

  With Sh
    If Intersect(Target, .Range("E4:P100")) Is Nothing Then GoTo EndRtn
    .Range("Q2").Value = Date
  End With

EndRtn:
  'イベント抑止を解除
  Application.EnableEvents = True
End Sub

イベント抑止は、この処理終了時に必ず解除する必要があります。そのため、Exit Sub は使用せず、GoToでラベル(例ではEndRtn)へ飛ばし、抑止解除してから終了するようにしています。
これで「どこかのシートのセル範囲E4:P100に変更が加えられたら、そのシートのセルQ2に日付を入れる」処理が実現すると思います。

この回答への補足

Cor_moriyan様

上記の方法でシートを作成してみましたが、最終更新日を表示させるセルに
=LastSaveTime()
を記述したところ
#NAME?
と表示されてしまいました。
セルの書式設定も日付に変更しましたが変化がありません。

VBEを適用するまでの流れは下記アドレスのNo.5様を参考にさせて頂いております。
http://oshiete.goo.ne.jp/qa/4367944.html

上記の方法と今回の方法はそもそも目的としているものが違うのでしょうか?
素人目には同じような目的だと感じたので参考にさせていただいたのですが…
何度もお手数をおかけ致しますがご回答の程、宜しくお願い致します。

補足日時:2011/11/30 12:32
    • good
    • 0

NO2です。


>どれか1つのセルを変更すると全てのシートの最終更新日が同じ時間に更新されたような表記に
>なってしまします。
 ⇒LastSaveTime()の自作関数マクロに「Application.Volatile」が定義されており、
  セル変更により自動計算されているからだと思います。(通常のワークシート関数の振舞と同じ)
   
  先ずは、コード云々より自作関数マクロとこのイベントマクロの適用方法を検討する必要が
  あるのではないでしょうか。
   
    • good
    • 0

>どれか1つのセルを変更すると全てのシートの最終更新日が同じ時間に更新されたような表記になってし>まします。


 ⇒シートイベントだから対象シートしか処理されない筈です。
  他のシートにも反映されているとしたら全シートが選択されている状態になって
  いればそのような結果になりますので、全シート選択状態を解除してから入力して下さい。

>誰がいつ担当のシートを書き換えたかを記載
 ⇒Environ("USERNAME")で環境変数のユーザ名を取得できるのでこれを追記しては
  如何でしょうか。
  (例).Range("Q2").Value = Date & Environ("USERNAME")
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報