excelでシート毎の最終更新日を表示する方法とは?

このQ&Aのポイント
  • 複数人でエクセルファイルを管理する場合、各シートの最終更新日を表示する方法を教えてください。
  • エクセルのマクロを使用して、シート内が更新された時に最終更新日を記載する方法を紹介します。
  • 初心者でも分かりやすいように、具体的な記述内容を例としてご説明します。
回答を見る
  • ベストアンサー

excelでシート毎の最終更新日を所定の場所に表示

複数人のスタッフで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、マクロともに初心者のため分かりやすくお教え頂ければと思います。 お手数をおかけ致しますが、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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に日付を入れる」処理が実現すると思います。

misato_design
質問者

補足

Cor_moriyan様 上記の方法でシートを作成してみましたが、最終更新日を表示させるセルに =LastSaveTime() を記述したところ #NAME? と表示されてしまいました。 セルの書式設定も日付に変更しましたが変化がありません。 VBEを適用するまでの流れは下記アドレスのNo.5様を参考にさせて頂いております。 http://oshiete.goo.ne.jp/qa/4367944.html 上記の方法と今回の方法はそもそも目的としているものが違うのでしょうか? 素人目には同じような目的だと感じたので参考にさせていただいたのですが… 何度もお手数をおかけ致しますがご回答の程、宜しくお願い致します。

その他の回答 (2)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

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

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

>どれか1つのセルを変更すると全てのシートの最終更新日が同じ時間に更新されたような表記になってし>まします。  ⇒シートイベントだから対象シートしか処理されない筈です。   他のシートにも反映されているとしたら全シートが選択されている状態になって   いればそのような結果になりますので、全シート選択状態を解除してから入力して下さい。 >誰がいつ担当のシートを書き換えたかを記載  ⇒Environ("USERNAME")で環境変数のユーザ名を取得できるのでこれを追記しては   如何でしょうか。   (例).Range("Q2").Value = Date & Environ("USERNAME")

関連するQ&A

  • excelでシート毎の最終更新日を所定の場所に表示

    複数人のスタッフで1つのエクセルファイルを管理しています。 管理方法は下記の通りです。 現在、担当しているお客様から連絡やアポイントなどがあったかを記録に残すためのexcelデータを作成しています。 1つのexcelファイルに人数分のシートを作成し、それぞれが自分のシートに毎月の連絡の有無を○×形式で記入していきます。 シート内には各自が担当している案件名と1月~12月までの見出し、備考欄などが記載されています。 それぞれのシートの内容が書き換えられた最終更新日を所定のセルに記載させたいのです。 マクロを使用して下記のような記述をしてみましたが、どれか1つのセルを変更すると全てのシートの最終更新日が同じ時間に更新されたような表記になってしまします。 複数人でエクセルファイルを管理するため、誰がいつ担当のシートを書き換えたかを記載するためにはどの様な記述をすれば良いのでしょうか? 【使用している関数】=LastSaveTime() 【記述内容】 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 上記の方法でシートを作成してみましたが、最終更新日を表示させるセルに =LastSaveTime() を記述したところ #NAME? と表示されてしまいました。 セルの書式設定も日付に変更しましたが変化がありません。 VBEを適用するまでの流れは下記アドレスのNo.5様を参考にさせて頂いております。 http://okwave.jp/qa/q4367944.html 上記の方法と今回の方法はそもそも目的としているものが違うのでしょうか? 素人目には同じような目的だと感じたので参考にさせていただいたのですが… 何度もお手数をおかけ致しますがご回答の程、宜しくお願い致します。

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • エクセルでマクロを使って新規シートを作成する方法を教えてください!(条件あります)

    初めて質問するのですが、エクセルで原紙シートのマクロまで全てをコピーして新規のシートを作成させるにはどうしたらいいですか? 新規のシートの特定のセルに入力した時に新規シートが作成されるようにできますか? 原紙は Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address = "$A$1" Then ActiveSheet.Name = Target.Value End If End Sub のマクロが現在できあがってます。これを残しつつできますか?よろしくお願いします!

  • EXCELマクロでのシート間のデータ同期方法

    質問させていただきます。 EXCELにて、"シート1"のA1~C3と"シート2"のD4~F6を 同期化したく考えております。 ・いわゆる一方のシートが「読み取り専用」になってしまうリンク貼り付けではなく、シート1、シート2相互が書き換え可能の同期化です。 ・A1とD4、B3とE6、のように互いに照合箇所のセル同士を同期反映させたいと考えております。 なお、他の質問を参照したところ、 シート1のA1とシート2のD4の単一セルを同期かする方法は確認できました。(以下参照) ***************************************************************** シート1のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Worksheets("シート2").Range("D4") = Target End If End Sub シート2のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$4" Then Worksheets("シート1").Range("A1") = Target End If End Sub *************************************************************** これを参考にVBAの シート1のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then Worksheets("シート2").Range("D5") = Target End If End Sub シート2のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$5" Then Worksheets("シート2").Range("A2") = Target End If End Sub というように追記していったのですが、エラーとなってしまいます。 お詳しい方がおられましたらお願いいたします。

  • 非表示シートに関して(エクセル・マクロ)

    度々ご教授お願い致します。 今までの質問に対して回答は得られたのですが 下記が質問内容 >>1)シート1のA1セルを右クリックするとシート2を印刷。 >>2)シート1のB1セルを右クリックするとシート3を印刷。 >>3)それぞれのシート印刷時に2部印刷が行われるようにする。 下記が回答済みのマクロ Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("A1:B1")) Is Nothing Then Exit Sub If Target.Address = "$A$1" Then Sheets("Sheet2").PrintOut Copies:=2 ElseIf Target.Address = "$B$1" Then Sheets("Sheet3").PrintOut Copies:=2 End If Cancel = True End Sub シート2とシート3を非表示にした場合、 今まで出来た(印刷)作業が出来なくなったのですが、 こちらを解消するためにはどのような記述を増やせばよろしいのでしょうか。 よろしくお願い致します。

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • マクロでシート名を変更を変更したい

    A1セルの値をシート名にするマクロは以下のとおりだと思います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub では、E6セルの値をシート名にすることは可能でしょうか? よろしくお願いします。

  • Excel VBA シート名を条件に使用して…

    Excel2003を使用しています。 C列に特定の文字が入力されたら、その行のG列に、ある数式を入力したく、イベントマクロを作成しましたが、シートがたくさんあるときや、シートの追加がある場合は、クラスモジュールを使用するとよいということを過去の質問から参考にさせていただき、下記のクラスモジュールを作成しました。 ------------------------------------------------------- Public WithEvents myApp As Application Private Sub myApp_sheetchange(ByVal sh As Object, ByVal target As Range)  If Len(sh.Name) = 4 Then   If target.Column = 3 And target.Row >= 4 Then    If target.Value = "特定の文字" Then     Cells(target.Row, 7).FormulaR1C1 = "=数式A"    End If   End If  End If End Sub ------------------------------------------------------- 上記マクロを使用しているBook中の30数枚のシート名は「1234」というように、4桁の数字(全角)になっているのですが、さらに条件を加えて、例えば、シート名の数字が「1250」以下の場合は、Aという数式を入力し、シート名の数字が「2000」以上の場合は、Bという数式を入力するという条件でも可能でしょうか? 可能な場合、どのようにコードを記述すればいいのでしょうか? よろしくお願いします。

  • オープンオフィスでシート名をセルから参照するには

    マクロ初心者です。 こちらの質問(http://okwave.jp/qa/q2025849.html)と同じような内容ですが、 試行錯誤してもOpenOffice Calcでできなかったため質問させていただきます。 OpenOffice Calcで、セル「A1」に入力されてある文字を対応するシートの名前に自動で設定するには、どのようなマクロを記述すればいいのでしょうか? エクセルで使用できる Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub をVBA互換モードで試しましたが、無理そうでしたのでOpenOffice.org Basicで使えるように変換して記述したいところです。 ですが、オープンオフィスのThisWorkbookはどのように使うのかなどさっぱり理解できなかったので、どなたか詳しい方教えてください。 よろしくお願いします。

  • エクセル デバッグできるのとできないのがある

    シートイベントについて教えてください。 シートモジュールに --------------------------------------------------------- Option Explicit Private Sub Worksheet_Activate() MsgBox "" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "" End Sub Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "" End Sub --------------------------------------------------------- と記載した時に、 F8で動かせるのは、Worksheet_Activateだけなのですがなぜでしょうか? ほかのイベントは、F8で実行させても、OSの音が鳴るだけで、マクロの実行はされません。 ご回答よろしくお願いします。

専門家に質問してみよう