Excelでシート毎の最終更新日を所定の場所に表示する方法

このQ&Aのポイント
  • 複数人のスタッフで1つのエクセルファイルを管理しています。各スタッフは自分のシートに毎月の連絡の有無を記入します。シートの内容が書き換えられた最終更新日を所定のセルに表示させる方法を教えてください。
  • 現在、複数人のスタッフで1つのエクセルファイルを管理しています。各スタッフは自分のシートに毎月の連絡の有無を記入します。シートの内容が書き換えられた最終更新日を所定のセルに表示させたいのですが、正しく表示されません。どのように記述すればいいでしょうか?
  • 複数人のスタッフで1つのエクセルファイルを管理しています。各スタッフは自分のシートに毎月の連絡の有無を記入し、シートの内容が書き換えられた最終更新日を所定のセルに表示させたいです。現在、マクロを使用していますが、全てのシートの最終更新日が同じ時間に更新されてしまいます。どのようにすれば個別に最終更新日を表示できるでしょうか?
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

次の手順を行います。 1.ALT+F11でVBE画面を開く 2.今までに作成した ご質問に掲示したマクロ,lastsavetime関数のマクロ,各シートのシートモジュールに書いたマクロ,を漏れなく削除する(同じ目的の複数のマクロが競合するのを防ぎます) 3.プロジェクトエクスプローラで「VBAProject(作業をしている.xls)」の中に含まれているThisWorkbookをWクリックする 4.現れたシートに下記をコピー貼り付ける Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ’範囲外なら何もしない  if application.intersect(target, sh.range("E4:P100")) is nothing then exit sub ’そうでないならQ2に記録する  Application.EnableEvents = False  sh.range("Q2")= now  Application.EnableEvents = True End Sub ファイルメニューから終了してエクセルに戻る Q2には日付時刻の表示形式を設定しておく 各シートで作業すると,Q2に日付時刻が自動で更新される。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

先日も同じような質問してませんでしたか。 普通エクセルで、よく使われるような課題ではないし、本件はエクセルに適して無いように思う。 従って初心者らしい質問者には難しい課題だろう。わたしにも難しい。 >LastSaveTime()の使用など、ファイル(ブック)単位に使うものを使っていて、直ぐ不適当が判ってしまう程度のもの。 また質問の表現がしっかりしてなくて、よく情況が読み取れない。 質問を読んだついでに推測して、書いてみる。 ーー シートごとに使用された日時を考えなければならない。そこで1つ(データシートとは別に)シートを増やして「時間管理」という名にする。 「シートを開くこと」と、「そのシートのセルにデータを書き込んだり、変更したり」することは別であるが、別のイベントのシートのChangeイベントを使う(シートの内容を変えたことは確実)のでは、 シートのセルのデータを入力したりしたら、すべての場合に反応して、処理の負荷が大きいと思い、敢えて、アバウトではあるが、シートを開いたとき(シートタブをクリックしたとき)をとらえ、そのシートの1セルに日付・時刻情報を残す。本来目立たないところのセルが良いが、テストなのでC1セルにした。 ーー そしてブックを閉じるときに、下記VBAで、各シートのC1セルの日時時刻を「時間管理」シートに集約転記して、ブックがクローズされる。 後日この時間管理シートをみて、同じシート名を順に探れば、そのシートを開いた時刻がわかる。 これらは、ちゃちな感じがするが、思いつきだが、こんなのはどうだろう。 ==== ThisWorkbookのSheetActivateイベントに Private Sub Workbook_SheetActivate(ByVal Sh As Object) Sh.Range("C1") = Now() End Sub これで開いたシートのC1セルに日時・時刻を残す。 ーーーー ブックをクローズする前に、全シートのC1セルの時刻とシート名を、順次、使用管理シートの下の行に集約してその後クローズする。 Private Sub Workbook_BeforeClose(Cancel As Boolean) d = Worksheets("使用管理").Range("A65536").End(xlUp).Row i = i + 1 For Each Sh In Worksheets If Sh.Name <> "使用管理" Then Worksheets("使用管理").Cells(i, "A") = Sh.Name Worksheets("使用管理").Cells(i, "B") = Sh.Range("c1") i = i + 1 End If Next End Sub ーーーーー 自分の考えたコードばかり質問に書いている質問者が多いが、初心者は、的はヅレの方向のアイデアでコードを組み始めているケースも多い。だから役にたたないことが多い。心やさしい回答者がその線で考えてくれたとしても、良いアイデアの吸収にならず、質問者の勉強にならない。 まずやりたいことの説明を中心に、質問文章表現に心を砕くこと。 シートと行と列のデータ例 初期状態の例・最終結果の例 初期状態から最終ゴールをまでをつなぐ事項(理屈)などを、整理して表現する訓練をするほうが良い。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.5

=LastSaveTime()は不要だと思います。 マクロの方も記述内容で正常に動作します。 もし時間まで必要であればDateをNowに変更 すればいいと思います。

回答No.3

まず、LastSaveTime関数の記述は Public Function LastSaveTime() As Variant '←変更箇所   Application.Volatile   LastSaveTime = ThisWorkbook.BuiltinDocumentProperties("Last save time").Value End Function でよろしいでしょうか? で、さらに Workbook_SheetChange イベントにも記述していると。 > 最終更新日を所定のセルに ここで言う「所定のセル」とは Q2 セルの事で良いでしょうか? Workbook_SheetChange イベントで動くマクロの内容ですが、わかりやすく言うと 「どこかのシート上のセル範囲 E4:P100 に変更が行われた時、そのシートの Q2 セルに【現在】の日付を入れる」という動作をしてくれます。変更した「今」の日付を、対象のシートのQ2セルに入れるだけなので、変更していないシートのQ2セルに日付が入る事はありません。 LastSaveTime は 「その【Excelファイル】が【最後に保存】された日付を返す」関数です。これはシート単位ではなく「ブック」=ファイル単位なので、複数のシートに入れたとしても、すべて同じ値が返ってきます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

リンク先で紹介されているユーザ関数「LastSaveTime」は、あくまでもブックの保存日時を表示するだけの物です。 また、ユーザ関数「LastSaveTime」と質問で提示されたコードの関係が良く判りません。 ユーザ関数「LastSaveTime」は今回の質問とどう関係するんでしょう? 要りませんよ。 提示されたコードで、問題なく各シートのQ2セルに更新した日付が入りました。 ちゃんとThisWorkBookにコード書いていますか? 何かマクロの基本が判っていないのにネット上で集めたコードを切り貼りしてドツボにはまって居る様な印象です。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Intersect(Target, Range("E4:P100")) Is Nothing Then GoTo EndRtn Range("Q2").Value = Date EndRtn: 'イベント抑止を解除 Application.EnableEvents = True End Sub をそれぞれのシートのマクロに記載してください。 =LastSaveTime() は不要です。

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

  • 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)の何かが間違っていますか? ご教授願います。

  • エクセルでデータを変更・入力した時だけ日付が更新される方法

    QNO.2915892を参考にさせていただき、マクロを設定しました。 正常に作動したのですが、その後シートの一部が変更できないように、ロックをかけることになりました。 するとロックのかかっている状態だと、このコードでは日付が更新されませんでした。 そこで、ロックのかかっていないセルのデータを更新した時だけ、 任意のセルに今日の日付(更新日)が自動で入るようにしたいです。 つまりエクセルを開いただけで、データを修正しなかったら日付は変わらないようにしたいです。 この場合はこのコードに何を足したり、どこを変更したらよいのでしょうか? もしくは全く別のものになるのでしょうか? 別のものであれば、それを教えていただけると助かります。 コードの意味はほとんどわかっていません。。。 *****以下今使っているコードです******** Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("B1") = Format(Date, "yyyy/m/d") Application.EnableEvents = True 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でシートを追加更新していきたいのですがうまくいきません

    エクセルのVBAでシートを追加更新していきたいのですがうまくいきません…。 すみません、どなたかぜひ教えてください。 エクセルはそこそこ使えますが、マクロ関係はまったくの初心者です。 excel2003で作業しています。 やりたいのは、実行することによって (1)同一ブックの中に同じ形式のシートを追加する。 (シート名は「0」「1」「2」…というように、ただの数字にしています) (2)セル「K4」の数式 「=I4+'( 1 )'!K4」を 「=I4+'( 2 )'!K4」 というように、どのシートでも、直前のシートのセル「K4」の数値と更新したシートのセル「I4」の数値の合計を「K4」に表示する。 (以下、「I5」「K5」、「I6」「K6」…も同様にしていきます) ようにしたいのです。 (2)のために、 Range("k4").Value = "=I4+'(" & Range("j1").Value - 1 & ")'!K4" (「J1」には、「新しいシート名(数字)と同じ数字」が入るようにしてあります) としましたが、 「 =I4+'(1)'!K4 」としたいのに、 「 =I4+'[1](1)'!K4 」 と表示され、うまくいきません。 また、実行するたびに、 「値の更新」ということで、ファイルを指定するよう指示が出ます。キャンセルすると「#REF!」になります。 何が原因なのか、どうすればいいのかがさっぱり分かりません。 身の程知らずなレベルに挑戦しているのかもしれませんが、どなたか助けていただければ幸いです。 よろしくお願いします! (よく分かっていないため、質問の仕方が適当でなかったらすみません…)

  • Excelで更新日時と更新者を表示させる

    Excel97で、ファイルの最終更新日時と最終更新者を任意のセルに表示させようとしています。 組込み関数では無理なようなので、VBAで関数を作成し始めました。 日時については、FileDateTime(パス名)で日付のシリアル番号を表示させることができましたが、これをセルの書式設定ではなく、VBA内で日付型にさせたいのです。 更新者は、BuiltinDocumentProperties(7)というのを使用するようですが、記述方法がまったくわかりません。 VBAは初心者です。 Functionステートメントを使用していますがこれ自体は間違いないでしょうか。 ご指導願います。

  • Excel 2007 マクロ 複数シートの更新

    Excel 2007 マクロ 複数シートの更新 Sheet1に元データがあり、Sheet2以降に複数シートがあります。 複数シートにはSheet1を元データとしてピボットテーブルを作成しています。 下記はSheet2で行う作業のマクロです。 同様の内容がSheet3以降あります。 どのようにすれば複数シートを一括で更新できるようでしょうか。 Sub Sagyo() 'ピボットテーブル更新 Worksheets("Sheet2").Range("A1").RefreshAll   'A1を含むピボットテーブル表をA15にコピーして値貼り付け Worksheets("Sheet2").Range("A1").CurrentRegion.Copy Range("A15").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

  • VBA 別シートの最終行に追記

    ExcelのSheet1で作成した表の一部項目を、Sheet2に一覧表としてまとめたいのです。 例えばSheet1にアンケート項目のような入力されていて、毎日使いまわします。 セルA1: 訪問日→固定     セルB1: (日付)→更新 セルA3: お客様指名→固定  セルB3: (氏名)→更新 使いまわすので、1度入力されたものは、Sheet2に一覧表として転記しておきたいのです。Sheet2の一覧表の最終行をみつけて追記していきたいです。 書いてみたのは以下の通り。 Private Sub 登録ボタン_Click() Dim SH1 As Worksheet, SH2 As Worksheet Dim GYO As Long Set SH1 = ThisWorkbook.Worksheets("回答内容") Set SH2 = ThisWorkbook.Worksheets("情報シート") ' Sheet2の最終行を取得 GYO = SH2.Range("$A$65536").End(xlUp).Row ' 最終行の次行を取得 If SH2.Cells(GYO, 1).Value <> "" Then GYO = GYO + 1  ' 現在の収容位置の下に転記 SH2.Cells(GYO, 1).Resize(1, 20).Value = SH1.Range("$c$2:$D$10").Value With SH1 .Range("A3").Copy Destination:=SH2.Range("A2") .Range("B3").Copy Destination:=SH2.Range("B2") End With End Sub 項目は飛び飛びのセルに入力されていて、それらをまとめて一覧表の1行にまとめたいと思っています。 ここでは例としてSheet1[A3][B3]セルをSheet2へ転記していますが、項目はもっといっぱいあります。 記載したコードで実行すると、1回目は転記されますが、2回目以降が追記されていきません。 ' 現在の収容位置の下に転記 のところに問題があると思っています。 全くの初心者が、コードを書くのには無理があると思いますが、どなたか教えていただけないでしょうか。宜しくお願いします。

  • エクセルのシート名更新のマクロについて

    エクセルのシート名更新のマクロについて B1の値を元に、シート名を更新するマクロでつまづいています。 (1)B1セルに9/1と入力したら、2010年9月と表示されるように 「セルの書式設定」で調整しています。 (2)「(1)」で表示された年と月の情報をシート名に反映させたいと 思っています。 そこで、次のコードを記入しました。 --------------------------------------------------- Sub 更新作業() 'ひと月更新する。 Worksheets(1).Activate Range("B1").Select For Each r In Selection r.Value = DateSerial(Year(r.Value), Month(r.Value) + 1, Day(r.Value)) Next r 'シート名を変更する。 Worksheets(1).Activate ActiveSheet.Name = Format(Range("b1"), "yyyy年m月") ' 数量を削除する。 Range("C4:D9").Select Selection.ClearContents Range("C4").Select End Sub --------------------------------------------------- この場合「ActiveSheet.Name = Format(Range("b1"), "yyyy年m月")」で エラーが出てしまいます。 なぜ問題が出るのか、 また、解決策があれば、教えていただけないでしょうか。

  • [エクセル]先頭シートから最終シートまでをサマリー

    先頭シートから最終シートまでをサマリーしたいのですが、 シートが追加された場合にもサマリーの範囲を先頭シートから その追加されたシートにまでしたいのです。 例えば、 sheet1のA1セルに10、sheet2のAセルに20,sheet3のAセルに30の値があるとして、 合計は =Sheet1!A1+Sheet2!A1+Sheet3!A1 これにsheet4,sheet5,sheet6と追加されたとして、 この計算式に+・・・と追加していく方法ですと大変なため、 先頭~最終シートを合計する方法はございますでしょうか? 分かりにくい内容で申し訳ございませんが、 よろしくおねがいいたします。

専門家に質問してみよう