[[20041018110642]] 『NOWやTODAYを使うと…』(なっぴ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『NOWやTODAYを使うと…』(なっぴ)
 いつもお世話になっています。 
 最後に書類に手を加えた日付が印刷されるようにしたいのですが、
 NOWやTODAYを使うと、書類を開いた日付になってしまいますよね。
 最終更新日を、シート内に表現する方法はありますか?
 Excel2000,Windows98です。
 よろしくお願いします。

 マクロしか思いつかないですね・・(--;)

 エクスプローラーで日付を表示しながら、
 ブックを開いてみると更新日時が変更されるのがわかります。
 これはExcelというアプリケーションがブックを開いた時点で、
 更新日時を変更してしまうためです。
 そして、保存せずに終了すると、
 ブックを開いたときに取得していた「更新日時」に戻すためです。
 このためマクロでも開いているブックの更新日時に取得はできないので、
 保存時の時間をセルに書き込むようなマクロを利用するのがよいかと思います。 
   (INA)

 INAさん、ありがとうございます。
 保存時に、マクロを使って日付を入力するということですね。
 マクロはほとんど分からないのですが、どのようなコードになりますか?
 できたら教えてください。
 (なっぴ) 

 よこから失礼いたします。
 Thisworkbookに
 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     Sheets(1).Range("A1").Value = Now()
 End Sub

 でいかがでしょうか?
 Sheets(1) 一枚目のシートを指定
 Range("A1") セルA1に
 Value 値として
 Now() 日付を代入します。

 (Null)

 Nullさん フォローどうもです。
 シート名を指定するときは、 
   Sheets(1) → Worksheets("Sheet1")
 のようにしてください。

 使い方は
 1.ALT+F11キーで、VBEを起動
 2.プロジェクトウィンドウのThisWorkBook を ダブルクリック
 3.中央の真っ白なウィンドウ(コードウィンドウ)にコードをコピペ
 です。

 〜余談〜 
 Nullさんがちょうど書いていたので思い出しました。
 ぜんぜん関係ない話で恐縮ですが、以前から気になっていたので、
 分かるか違いましたら教えて下さい。

 「よこから失礼いたします。」 って掲示板で回答しているとよく見かけます。 
 この「よこから」というのは、何からきてるのでしょうか? 
 最初は「よこやり」からかなと思ったのですが、
 「よこやり」って邪魔するときの言葉ですよね。
 掲示板だと回答者はたくさんいるのだから邪魔というのもおかしいと思いますし。

 ふざけてたのでしょうけど、「下から〜」というのも見たことあります・・。 
  (INA)

 INAさん フォローどうもです。
 やっぱ説明が大雑把なようです_| ̄|○

 〜余談〜
 「よこから失礼します」ですけど
 私の場合は「こんにちは」「はじめまして」等と同じような感覚でつかっています。
 語源までしっかりと知っていてつかっているわけではないですが・・・
 話の途中に入っていくときに入りやすいとは思います。

 >「よこやり」って邪魔するときの言葉ですよね。
 でも これを考えるとなんか不自然なきもしますよね(^o)っ旦~

 〜余談〜
 INAさんのページのURLをなくしてしまいました。
 よろしければ教えていただきたいのですが・・・
 検索したが見つからず
 エクセルマークがあった気がするのですがマークで検索はできず_| ̄|○
 おねがいいたします。(INAさんてフラッシュ使いなんですか?ってかなんでOKそうですよね)

 (Null)


 INAさん、Nullさん、ありがとうございます。 
 うまくできましたヽ(^-^*)ノ
 またよろしくお願いします。

 〜余談〜
 どんどんよこから来ていただくと、質問したほうはうれしいですっ!
 レスに時間がかかってしまいますけど。
 (なっぴ)


 to なっぴさん
 解決できて何よりです。

 to Nullさん
 > やっぱ説明が大雑把なようです_| ̄|○
 耳が痛い・・ 私が大雑把回答者No1と自覚してます (^^;)
 (いちおう回答者のレベルを知りたいというのもあります)

 > 話の途中に入っていくときに入りやすいとは思います。
 同感です。ニュアンスではその通りだと思います。

 >これを考えるとなんか不自然なきもしますよね(^o)っ旦~
 自分でも使おうと思ったときに、なんか気になってしまったもので・・(^_^;)

 >(INAさんてフラッシュ使いなんですか?ってかなんでOKそうですよね)
 残念ながら違います。(∋_∈)
 一時期、ネットや参考書で勉強しましたが、いまでは経験値 0 になってしまいました。
 アプリケーションの使い方は覚えることはできても
 デザイン能力が追いつかず、いろいろなものの寄せ集めで作っていたら
 自分の無能さに嫌気がさしてきたのでやめました。(+_+) 

 >INAさんのページのURLをなくしてしまいました。
 新・単語検索で camaro で検索してみてください。過去ログからURLでてきます。

 パソコン関係については、 そこそこ概要だけ知っておけば、
 あとは必要に応じて調べればよいと思っているので、広く浅くといった感じです。
 いずれも趣味程度ですので、私はNullさんの方がぜんぜん識者だと思ってます。(^o^)
  (INA)

 (なっぴ)さん
 > どんどんよこから来ていただくと、質問したほうはうれしいですっ!
 そういってもらえると入りやすいですv
 今後もよろしくお願いいたします。

 >いずれも趣味程度ですので、私はNullさんの方がぜんぜん識者だと思ってます。(^o^)
 うーん 私もなにかするたびに参考書やらネットのぺーじやらあさってますよぉ
 基本的にはカンとノリだけで行動してる人なので「知識」に関しては0に等しいです。
 簡易リファレンスやら関数辞典やらは手放せません

 INAさんのページ発見いたしました。

 (Null)

 うまくいかないのです。
 これって、複数のシートに日付入れるときにも使えますか?

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     Worksheets("出力用").Range("Q1").Value = Now()
     Worksheets("進行表").Range("AC1").Value = Now()
     Worksheets("計算書").Range("L1").Value = Now()
 End Sub

 と入れてみたのですが、うまく動いてくれません。
 助けてくださいm(_ _)m
 こういう場合は、新たに質問した方がいいのかな?('.')?
 (なっぴ)


 ここで良いでしょうね^^
 上記で良いみたいですが、どのように上手くいきませんか。
※NOW の()が要らないのかな・・・
 (川野鮎太郎)


 お騒がせしました。
 書類に変更を加えないで、閉じてしまっていました。
 何度開いても前と同じなのでパニクってしまって…
 大丈夫です。ちゃんと動きます。
 ごめんなさい(≧o≦*)
 (なっぴ)


 しつこくてごめんなさい。
 ここで教えていただいたのは、保存時に日付を入力する方法ですが、
 保存時に、変更のあったシートだけ、日付を入力することもできますか?
 上の例でいうと、("出力用")と("計算書")は、一度決まると変更しないのです。
 ("進行表")は、日々、予定と実績を確認するので、毎日更新します。

 (゚0゚;)あ!
 ここで教えていただいた方と同じ方に、今日も教わっていました!
 INAさん、Nullさん、川野鮎太郎さん、いつもありがとうございます。

 ("進行表")を更新するたびに、("出力用")と("計算書")の日付が変わらないように、
 アレンジできますか?

 (なっぴ)  


 またまた登場~~\(^o^)/~~
 上記のコードで不要な2行を消すだけで良いのじゃないかな。
 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     Worksheets("出力用").Range("Q1").Value = Now() ←これと
     Worksheets("進行表").Range("AC1").Value = Now()
     Worksheets("計算書").Range("L1").Value = Now() ←これ
 End Sub

 または、消すのがもったいないなら・・・(^_^A;
 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Worksheets("出力用").Range("Q1").Value = Now()
     Worksheets("進行表").Range("AC1").Value = Now()
    'Worksheets("計算書").Range("L1").Value = Now()
 End Sub
 行頭に ' を付けたら、その行のコードは無効になります。
 (川野鮎太郎)


 川野鮎太郎さん、いつも登場ありがとうございます。
 ええと、、、
 ("出力用")("計算書")("進行表")とも、上司にOKもらうまでは、
 最新の日付にしなくちゃならないんです。
 ("出力用")と("計算書")は、OKもらうと、確定版になるので、もう変更しません。
 ("進行表")は、日々、予定と実績を確認するので、その後も毎日更新します。

 ファイルの複製をとって、("進行表")として使えばいいかなと思ったのですが、
 保存時に、"変更のあったシートだけ"に、日付を入れられたら、
 ファイルの管理がシンプルでいいなぁと思ってo(^-^)o おねがい! 

 (なっぴ)  


 う〜ん(/-_-\)
 >("出力用")と("計算書")は、OKもらうと、確定版になるので、もう変更しません。
  ↑ってことで、確定した時点で、コードの頭に ' を付けるだけでいいと思ったんですが・・・。
 シート内の変更を比較するってのは、中々難しそう・・・。
 単純に出力用シートと計算書シートの複製を作っておいて、比較する・・・。処理に時間掛かりそう_/ ̄|○ il||li
 バージョンが2002(?)からは、変更履歴がわかる様になってるって小耳に挟んだけど定かではないです_/ ̄|○ il||li
 シートモジュールでチェンジイベントでも良いかも知れないけど、チェンジイベントでは、
 完全な変更ではなく、単に入力だけで元に戻しても変わってしまうし_/ ̄|○ il||li
 どなたかの良い案が出るまで待ってみてください。
 (川野鮎太郎)

 おばんです。
変更って値だけでいいんでしょ??
あのぅ、、エクセル・マイスターの9番見てくれないかなぁ。。
わちきの(昔はネカマだった(^^;; ヒヤアセ)傑作??九番!!
九番!!あっ〜〜九番!後にも先にも九番だけでしたぁ。。_/ ̄|○ il||li
これは、わがサンプルブックに入れようv(=∩_∩=)v
ちょっと宣伝まんの
(SoulMan)
Option Explicit
Dim mae As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ato As Variant
If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    ato = Target.Value
    If mae <> ato Then
        MsgBox "変更されました"
        Range("A1").Value = Date
    End If
    Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    mae = Target.Value
End Sub
あっ!!失礼!!ぐっぐと複数を選択して、どっか〜〜んっと消したら駄目ですね( ̄□ ̄;)!!
あっ〜〜!!おおぼけでしたぁ_/ ̄|○ il||li
(SoulMan)

 SoulManさん?
 スミマセン…
 ええと、これはダメってことですか?
 エクセルマイスターを読みましたが、私には少し難しいです。
 分かるようになるまで、だいぶ時間がかかりそうですぅ(>_< )( >_<)
 (なっぴ)

 おはようございます。
一対一ならOKだと思います。
でも、
If Target.Count > 1 Then Exit Sub
があるから、範囲を選択して消去した分については感知しませんので
変更があったシートとはならないですね( ̄□ ̄;)!!
でも、一対一なら変更を感知しますので使えそうな気がしないでも・・・ない(^^;; ヒヤアセ
というかぁ、、お試しになってみたらどうですか?
v(=∩_∩=)v
(SoulMan)

 SoulManさん、ありがとうございます。
 なんだか、落ち込んだり、知らないことばがいっぱいあったりしたので、
 ちょっと怖い感じで…
 どうしていいか分からなかったのです。m(..)m
 試してみました。
 できました\(^o^)/
 それぞれのシートに記述するということでいいんですね。
 MsgBoxは、はずしてみましたが、問題ありませんよね。
 (なっぴ)

 >問題ありませんよね。
のぅぷろぶねむv(=∩_∩=)v
発音があやすぃ(^^;; ヒヤアセ
Soulまんちゃん語で「問題ない」という意味です。d=(^o^)=b
まいさんぷるぶっくに追加決定!!
(SoulMan)

 SoulManさん、HELP!
 ほんちゃんのブックにコピーしたら、反応なしですぅ(≧o≦*)

 作業内容は次のとおりです。
 MsgBoxは、はずしました。
 DateをNow()に変えました。
 4枚のシートのタグを右クリックして、コードをペーストしました。
 そのうち3枚はA1をQ1に変えました。
 1枚はA1をE1に変えました。
 ThisWorkbookには、別のコードが書き込んであります。

 テストファイルと見比べても違うところは無いのだけれど、
 なんでなの(TへT)。。。
 (なっぴ)

 >    Application.EnableEvents = False
 を実行後、エラーなどで ture に戻せずに停止したりしていませんか?

 sub aaa
    Application.EnableEvents = true
 end sub

 を実行してみては?

  (INA)


 衝突しました。
 INAさんと同じです。
 Application.EnableEvents = False
 どこかで躓いたため、これのために動かないのかも知れません。
 標準モジュールに以下を入れて実行してみてください。
 Sub Test()
    Application.EnableEvents = True
 End Sub

 ※シートの変更だけなら以下だけでも良いような気がするんですけど。
 これなら複数セルの削除やコピー、オートフィルでも変わりますから。
 Private Sub Worksheet_Change(ByVal Target As Range)
     Range("A1").Value = NOW()
 End Sub
 (川野鮎太郎)

 INAさん、川野鮎太郎さんありがとうございました。
チェンジイベントはこれがあるのよねぇ。。
でも、もうサンプルに登録しちゃったしなぁ。。
頑張ってイベントを復活させてください。
ではでは、v(=∩_∩=)v
(SoulMan)

 INAさん、川野鮎太郎さん、教えていただいたとおりにやってみました。
 Private Sub Worksheet_Change(ByVal Target As Range)
     Range("A1").Value = NOW()
 End Sub
 を各シートに入れたら、止まってしまいました。
 もう、ぐしゃぐしゃになってきてしまった。
 escすると、コードの途中だと言われます。
 一度、コードを全部消した方がいいのかな?
 (なっぴ)

 >止まってしまいました。
 どういうことでしょう? 何かのエラーですか?

  (INA)

 セルの内容を変更してEnterキーを押したら、
 その下のセルから動かせなくなりました。
 とりあえず、保存しないでファイルを閉じました。
 もう一回、
 Sub Test()
    Application.EnableEvents = True
 End Sub
 を入れるところからやり直します。
 (なっぴ)

 横から失礼します。
おせっかいかもしれませんが、ヘルプがありますから少し理解したほうがよくありません?
本来
Sub Test()
    Application.EnableEvents = True
 End Sub
は要りません。なっぴさんが途中で止めてイベントを無効にしてしまったため
皆さんのアドバイスですから・・・
(ケン)

 みなさん、ほんとにすみません。
 ぜんぜん分かっていなくて、勉強不足です。
 TESTは入れないで、やり直しましたが、また、
 セルの内容を変更してEnterキーを押したら、
 その下のセルから動かせなくなりました。
 VBの画面に戻って、中断したらセルが移動できるようになりました。
 やっぱり基本的に勉強不足です。
 もっと勉強してから、また来ます。
 みなさんの貴重なお時間をすみませんでした。 
(なっぴ)

 >みなさんの貴重なお時間をすみませんでした。 
みんな好きでお答えしてますし、そんなことかないでしょう。
解決出来ず終わってしまう方が・・・
もう一度、整理して今の状況を、こと細かに説明して見ては如何ですか?
>その下のセルから動かせなくなりました。
皆さん提示のコードだけなら考えにくいです。(検証はしていませんが)
ThisWorkbookモジュールにはどんなコードがありますか?
(ケン)


 もしかしたら・・・。
 コードをコピペするとき、またはセル参照を修正するときに、
     Application.EnableEvents = True ←の1行を消した、コピペ忘れたってことは・・・。
 最初から行きましょう。
 (1)シートタブを右クリック、コードの表示、出てきたコードを全て削除。
 (2)標準モジュールに入れた、
 Sub Test()
    Application.EnableEvents = True
 End Sub
 を実行。
 一回実行したら、削除して良いです。

 (3)シートタブを右クリック、コードの表示、
 Private Sub Worksheet_Change(ByVal Target As Range)
     Range("A1").Value = Now()
 End Sub
 を貼り付け。
 ここまでで該当シートのセルに何かを入れたら、A1に時間が入るか確認してみてください。
 (川野鮎太郎)

 ちょっと、失礼します。
川野鮎太郎さんの方法でも、やっぱり
Application.EnableEvents 
は、上下に入れた方がいいんじゃないんですかぁ??
ばわぁんばわぁんしますぅ(^^;
(SoulMan)


 とりあえず何が原因か判らないので、最小限の構成で試してもらおうかと。
 (川野鮎太郎)

 ケンさんに報告します。
 ThisWorkbookには、このスレの上のほうで教えていただいたモノが入っていましたが、
 もう削除していました(≧o≦*)
 標準モジュール1に作業して記録したものが入っています。
 コピペと並べ替えとセルの削除が記録されています。

 川野鮎太郎さんに報告します。
 教えていただいた通りにやりました。
 4枚のシートのうち、3枚では正常に動作します。
 ただ、1枚だけ固まってしまうと、思い込んでいました。
 このシートは、別のスレで教えていただいた条件付書式がたくさん入っています。
 ほかのシートがすぐに動くのに、このシートだけ次の作業ができるようになるまで、
 1分以上かかるのです。
 これを、動作しなくなってしまったと思い、
 ありえない状況報告をしてしまったようです(>_< )( >_<)
 条件付書式の中に=NOW()を使っているためでしょうか?
 ほかのシートのほうが複雑な参照を多用しているため、
 このシートだけがケタハズレに時間がかかるとは思いもしなかったものですから。

 Soulmanさんに報告します。
 教えていただいたコードで、問題はなかったのだと思います。
 まいさんぷるぶっくは、大丈夫じゃないでしょうか?
 私が自分で記録したマクロを動かしたときに、イベントを中断というか、
 問題を残した状態のまま、Soulmanさんのコードをコピペしたからでしょう。
 ちなみに、問題というのは、シートの保護を解除したら解決しました。
 この件は、もう少し調べて納得できなかったら、また別の場所で質問させてください。

 最後に、INAさんに報告します。
 いつもちゃんとコードを理解するようにおっしゃっているところを、
 早とちりや勘違いばかりで、ごめんなさい。
 いつかは、みなさんと対等(はムリかなぁ)にお話できるようになりたいと思っています。

 みなさん、懲りずにいろいろ教えてくださいね
 ほんとにありがとうございましたm(..)m
 それじゃ(^o^)/~~~
 (++)へとへと(なっぴ)


 1分以上かかる・・・。
 ちゃんと動くのが確認できたのなら、SoulManさんの言われるように
 Application.EnableEvents = False と
 Application.EnableEvents = True を入れましょう。
以下に修正してください。

 Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
     Range("A1").Value = Now()
 Application.EnableEvents = True
 End Sub
 ※これでも1分以上掛かるなら、原因は他にあるんでしょうね。
 (川野鮎太郎)

 ていねいにありがとうございます。(^o^)
 ちゃんと理解しないとっ!
 少し質問させてください。

 Application.EnableEvents = False 
 というのは、このコードの前にあるイベントを無効にする
 Application.EnableEvents = True
 というのは、このコードの前にあるイベントを有効にする
 という意味ですか?
 つまり、
 Worksheet_Change
 の時に、他に何かをさせないで、
 Range("A1").Value = Now()
 だけさせるためのコードということでしょうか?
 また、おかしなこと書いちゃってるのかな?

 この処理をするのは、処理に時間のかかったシートだけなのでしょうか?
 全部のシートに入れたほうがいいのかなぁ…
 (なっぴ)


 詳しい説明は出来ませんが・・・。
 Application.EnableEvents = False これ以降のコードをでチェンジイベントを無効にする。

 Application.EnableEvents = True  これ以降でチェンジイベントを有効にする。

 ってことで、無い場合(最初のコード)では、A1に時刻が入力されたものもチェンジイベントとして発生します。

 時間が秒単位なので、関数の処理が重たい場合などはA1の時間が変わって更にイベント発生して、A1に時間が入る。
 そのときに前の時間と後の時間が一緒じゃないと更にチェンジイベントって感じでループします。

 それをしないために、Application.EnableEvents = False で一時チェンジイベントを無効にして、

 入力が完了したら、Trueで有効に戻してやるってことです。 (合ってるかな(^_^A;)

 それがコードの途中で止まったら、Trueに戻らないまま終わることがあるので、
 それ以降のチェンジイベントが動かなくなるわけです。

 だから強制的にTrueにするために、標準モジュールで Sub Test() を実行して、
 元に戻したのでR〜^^

 てことだから、全部のシートに入れてください。
 (川野鮎太郎)

 衝突かな(・・)?

 まずは、問題のシートに教えていただいたコードを入れてみました。
 サクサクになったヽ(*^0^)ノ わ〜い!
 やっぱり、ここで教えてもらうことの大半は魔法の呪文みたいなんですよね。

 また、衝突かな(・・)??

 説明とても分かりやすいです。
 ありがとうございます。
 ほかのシートにもいれてみまっすo(^-^ )o( ^-^)o ♪
 Soulmanさん、川野鮎太郎さん、またよろしくお願いします。
 疲れぶっとび(なっぴ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.