アプリ版:「スタンプのみでお礼する」機能のリリースについて

複数人のスタッフで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

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

A 回答 (6件)

次の手順を行います。


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に日付時刻が自動で更新される。
    • good
    • 4

先日も同じような質問してませんでしたか。


普通エクセルで、よく使われるような課題ではないし、本件はエクセルに適して無いように思う。
従って初心者らしい質問者には難しい課題だろう。わたしにも難しい。
>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
ーーーーー
自分の考えたコードばかり質問に書いている質問者が多いが、初心者は、的はヅレの方向のアイデアでコードを組み始めているケースも多い。だから役にたたないことが多い。心やさしい回答者がその線で考えてくれたとしても、良いアイデアの吸収にならず、質問者の勉強にならない。
まずやりたいことの説明を中心に、質問文章表現に心を砕くこと。
シートと行と列のデータ例
初期状態の例・最終結果の例
初期状態から最終ゴールをまでをつなぐ事項(理屈)などを、整理して表現する訓練をするほうが良い。
    • good
    • 1

=LastSaveTime()は不要だと思います。


マクロの方も記述内容で正常に動作します。
もし時間まで必要であればDateをNowに変更
すればいいと思います。
    • good
    • 0

まず、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ファイル】が【最後に保存】された日付を返す」関数です。これはシート単位ではなく「ブック」=ファイル単位なので、複数のシートに入れたとしても、すべて同じ値が返ってきます。
    • good
    • 0

リンク先で紹介されているユーザ関数「LastSaveTime」は、あくまでもブックの保存日時を表示するだけの物です。



また、ユーザ関数「LastSaveTime」と質問で提示されたコードの関係が良く判りません。
ユーザ関数「LastSaveTime」は今回の質問とどう関係するんでしょう?
要りませんよ。

提示されたコードで、問題なく各シートのQ2セルに更新した日付が入りました。
ちゃんとThisWorkBookにコード書いていますか?

何かマクロの基本が判っていないのにネット上で集めたコードを切り貼りしてドツボにはまって居る様な印象です。
    • good
    • 0

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()
は不要です。
    • good
    • 0

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

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