

複数人のスタッフで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://oshiete.goo.ne.jp/qa/4367944.html
上記の方法と今回の方法はそもそも目的としているものが違うのでしょうか?
素人目には同じような目的だと感じたので参考にさせていただいたのですが…
何度もお手数をおかけ致しますがご回答の程、宜しくお願い致します。
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に日付時刻が自動で更新される。
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
ーーーーー
自分の考えたコードばかり質問に書いている質問者が多いが、初心者は、的はヅレの方向のアイデアでコードを組み始めているケースも多い。だから役にたたないことが多い。心やさしい回答者がその線で考えてくれたとしても、良いアイデアの吸収にならず、質問者の勉強にならない。
まずやりたいことの説明を中心に、質問文章表現に心を砕くこと。
シートと行と列のデータ例
初期状態の例・最終結果の例
初期状態から最終ゴールをまでをつなぐ事項(理屈)などを、整理して表現する訓練をするほうが良い。
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ファイル】が【最後に保存】された日付を返す」関数です。これはシート単位ではなく「ブック」=ファイル単位なので、複数のシートに入れたとしても、すべて同じ値が返ってきます。
No.2
- 回答日時:
リンク先で紹介されているユーザ関数「LastSaveTime」は、あくまでもブックの保存日時を表示するだけの物です。
また、ユーザ関数「LastSaveTime」と質問で提示されたコードの関係が良く判りません。
ユーザ関数「LastSaveTime」は今回の質問とどう関係するんでしょう?
要りませんよ。
提示されたコードで、問題なく各シートのQ2セルに更新した日付が入りました。
ちゃんとThisWorkBookにコード書いていますか?
何かマクロの基本が判っていないのにネット上で集めたコードを切り貼りしてドツボにはまって居る様な印象です。
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
Excelで更新日時と更新者を表示させる
Excel(エクセル)
-
【エクセル】行の最終更新日を、あるセルに自動で入力させる方法。
Excel(エクセル)
-
4
Excelでシート名と最終更新日を自動表示したい
その他(Microsoft Office)
-
5
☆Excelエクセルで入力した日の日付を表示したいです☆
Excel(エクセル)
-
6
Excel2013でシート毎に更新日を設定したい
Excel(エクセル)
-
7
Excelで更新日を自動的に入れたい
Excel(エクセル)
-
8
ハイパーリンクされているファイルの更新日付を取得するユーザー関数
Visual Basic(VBA)
-
9
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
10
エクセルで参照しているデータを常に最新の状態にしたい
Excel(エクセル)
-
11
エクセルの最終保存者の表示
Excel(エクセル)
-
12
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
13
EXCELで特定のセルに表示された項目をヘッダーやフッターに出力するには
Excel(エクセル)
-
14
有無、要否、賛否、是非、可否、当否…これらの言葉について
その他(教育・科学・学問)
-
15
エクセルで特定のセルを表示のみで印刷しない方法。
Excel(エクセル)
-
16
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
17
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
18
【Excel VBA】ネットワーク上の共有フォルダにあるExcelを開く
Excel(エクセル)
-
19
VBAのタイマー
Excel(エクセル)
-
20
日付が未入力の際はゼロか、空白にしたい
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
エクセル 計算式も入っていない...
-
5
エクセルで前のシートを連続参...
-
6
別シートの最終行に貼り付けす...
-
7
EXCELで1ヶ月分の連続した日付...
-
8
EXCEL:同じセルへどんどん足し...
-
9
エクセルでファイルを開いたと...
-
10
VBAでシートコピー後、シート名...
-
11
Excelが開かない!印刷プレビュ...
-
12
別シート参照のセルをシート毎...
-
13
エクセルで「ウィンドウを元の...
-
14
複数シートの特定の位置に連番...
-
15
複数のピボットを同じフィルタ...
-
16
エクセル計算式解説
-
17
特定のシートの削除を禁止した...
-
18
エクセルで複数シートを別のシ...
-
19
シート番号からシート名を取得する
-
20
Excelで、リストから順番に値を...
おすすめ情報
公式facebook
公式twitter