- ベストアンサー
Excelで日付自動入力+保存ボタン
こんにちは。 Excelでツールボタンを作り、それに次のような機能を付けたいと思います。 「設定しておいたセルに日付(設定によっては時間も)を入力し、その後にファイルを上書き保存する」 ボタンを2つ設置して、一つを「日付を入力するセルを指定したり、表示形式が設定できたりするウィンドウを開く」とし、もう一つを「設定したセルに現在の日付を入力して上書き保存する」とすれば実現出来そうと考えました。さらにこれをPersonal.xlsに実装する、と。 My Documentsフォルダ内に設定内容を保存することになるのかな、と思います。 これよりもスマートな方法、実装にいい方法があれば、ご教授願います。 例えば、「日付を入力するセルの設定の仕方は、数式バーのように実際のセルをクリックすることにより設定される」とかです。 よろしくお願いします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
試しに作ってみたので記載しようと思ったのですが、 >印刷した場合、どの紙が一番新しいかが分からなくなることがよくあるので という事でしたら、ヘッダーかフッタに更新日を登録するマクロを作った方がいいのでは?と思いました。 (更新日でなく印刷日でよければ、もっと簡単ですが) 日付の書式によっては(文字列ではなく日付型で) セルの幅が足りないと、[########]と表示されてしまうし、 うっかり前の設定で[A1]のまま実行したら、 [A1]には文字が入っていたのに 上書きして保存してしまったなどありそうなのですが・・・ (さらにそれを気づかない事も) もし、それでもと言う事でしたら補足してください。 (たいしたプログラムではないですが記載します)
その他の回答 (9)
- taisuke555
- ベストアンサー率55% (132/236)
頭が働いていなくて申し訳ありません。 結局、 ブックを開く→編集→保存→印刷・・・・今日の日付 ブックを開く→印刷・・・・今日の日付 (昨日から開きっぱなしの場合はこの限りではありません) になると思うのです。 これなら、更新日を見なくても、DATEでよくありませんか? (時刻まで入れると、若干の誤差は出てきますが)
お礼
たびたびありがとうございます。 >これなら、更新日を見なくても、DATEでよくありませんか? 確かにそうですね。(^_^ヾ 保存直後ですので。 >昨日作成したブックを手直しせず(保存せず)印刷をする場合 このときは、普通にメニューなどから印刷するのでいいのです。
- taisuke555
- ベストアンサー率55% (132/236)
私の書き方が悪く、うまく伝わらなかったみたいなので、 1.昨日保存したブックを開いた直後に今現在の日時に 更新日が変更になります。 2.上書き保存した後、更新日は上書き保存された日時に変更になります。 (上書き保存しないでブックを閉じた場合、昨日の日付に戻ります。) ですから、上書き保存→印刷 の手順で必ず行うなら問題はありません。(たぶん) 問題になるのは、昨日作成したブックを手直しせず(保存せず)印刷をする場合です。 そのような場合がなければ問題ありません。 分かりにくい回答ですみません。
- taisuke555
- ベストアンサー率55% (132/236)
#4です。 お礼の部分に書かれているコードで気になった点を2つ 1.ActiveSheet.PageSetup.RightHeader = Format(FileDateTime(ThisWorkbook.FullName), "yyyy年mm月dd日 更新") ThisWorkbookはPERSONAL.XLSですよね? これだとPERSONAL.XLSの更新日という事になりませんか? 2.こちらが重要ですが、 ブックを開くと、開いた日時に更新日が替わってしまいます。 (EXCEL2000ですので、それ以降ではうまくいくかもしれませんが) ブックを開いたままで更新日を取得するのは無理かもしれません。 (ブックを閉じると元の日付に戻るので、どこかに情報があるとは思うのですが) ですから、 Sub test() 'ヘッダーの更新 ActiveSheet.PageSetup.RightHeader = Format(Date, "yyyy年mm月dd日 更新") 'パスが無い場合は、新規保存とする If (ActiveWorkbook.Path = "") Then st = Application.Dialogs(xlDialogSaveAs).Show 'キャンセルボタンを押した場合、ヘッダを元に戻す If (st = False) Then ActiveSheet.PageSetup.RightHeader = "" End If Else 'パスがある場合は、上書き保存 ActiveWorkbook.Save End If End Sub ではどうでしょう?(ヘッダーは元に戻さないといけないのですか?) 普通にメニューから保存されると変更されませんが。 間違った解答をしていたらすみません。
お礼
たびたび、ありがとうございます。 > ThisWorkbookはPERSONAL.XLSですよね? > これだとPERSONAL.XLSの更新日という事になりませんか? あれ?そうなるんですか? 現在開いているブックから、Personal.xlsのマクロを呼び出すつもりでした。ん~、やはりThisWorkbookはPersonal.xlsになりそうですねぇ... 問題2について。 ヘッダを設定する前に保存した場合は、そのときの時間になりませんか? 会社のPCで作っていたので、今は確認できませんが... ヘッダを元に戻すのは、「更新日を入れないで印刷するときには、普通のやり方(Ctrl+Pなど)で印刷したい」からです。 もう少しテストしてみます。
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 f = ActiveCell.NumberFormat f = ActiveCell.NumberFormatLocal ですね。
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 「開いているファイルのパス付きファイル名+.ini」は不可能です。 やるとしたらフルパス内の : や \ 等をRead,Writeとも置換える処理が必要です。それにブックにはシートが複数あるし、、、 正直いって疑問だらけです。 ボタン1は 大雑把に捉えるとセルアドレスとセルフォーマットを決めているだけですよね?フォーマットは一度設定すればその後設定不要だし、入力するセルはボタン2実行時に選択しておけば良いだけです。UserForm、RefEdit、Iniまで使ってやるものでしょうか? ボタン2はボタン1が実行されていなければ実行出来ません。つまりボタン1、ボタン2の順序通りに実行しないと何にも出来ないマクロですよね? 他の人も使う事を前提にしているなら煩雑なだけに思えます。 例えば、 Sub Test2() Dim f As String If MsgBox("選択しているセルに日時を入力します。" & Chr(10) & _ "よろしいですか?", vbOKCancel + vbQuestion, "日付入力") <> vbOK Then Exit Sub f = ActiveCell.NumberFormat If MsgBox(f & "の書式で良いですか?", vbYesNo + vbQuestion, "書式確認") <> vbYes Then Application.Dialogs(xlDialogFormatNumber).Show End If ActiveCell = Now End Sub の感じでも十分実用に足ると思うのですが、、
お礼
確かに、おっしゃるとおりです。 自分でも何がしたかったのか分からなくなってきてしまいました。 そうですよね。書式は前もって入力したいセルに設定しておき、そのセルをクリックしてからボタンを押せばいいですよね。 セルに入力するか、ヘッダに記述するか、もう少し考えたいと思います。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17070)
#2です。お礼部分に関連して。 #2では、ツールバーボタンを2つ設けています。 (1)日付けを設定するセルを決めるのは、操作者がアクチブセルを決めること。 (2)日付けの設定はボタン1のクリック (3)日付け書式の決定は操作者 (4)ボタン2はブックの保存 となっていて、ボタン1とボタン2の効果発動の順序・ タイミングは操作者に任されます。 これでは不十分でしょうか。 問題を読んだ時、これに近い操作が個別にエクセルに備わっているのに、なぜここまで必要でしょうかと言う感じで、問題の主旨を良く理解出来てないのでしょうね。 済みません。 Application.Dialogs(xlDialogFormatNumber).Show の紹介みたいなものです。
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 少なくともExcel97ではマウスでセル選択出来ますが、RefEditを使いたいって事? ならUserFormでRefEdit等を使って作り込むしかないと思います。 でも日付を入れて上書きする処理だけなら、セルの選択、日付の入力、上書き保存をウィザードの様に進めて行くのって使い勝手が悪いように思いますが。。。
お礼
RefEditコントロールを使ってみました。 まさにこれです!! >でも日付を入れて上書きする処理だけなら、 そうです。そうしたいだけです。 なぜこのようなことをしたいかを記述していませんでしたね。 Excelで作ったファイルを保存したとき、その日時が入れられるといいなと思ったからです。印刷した場合、どの紙が一番新しいかが分からなくなることがよくあるので。 他のブックでも同じことが出来るようにPersonal.xlsに実装しておき、入力セルも設定できるようにしたかったのです。 回答を読み、少し考えてみました。 ボタン1でウィンドウを開き、RefEditコントロールで入力したいセルを決め、そのセルの書式は何らかの方法で(まだ考えていませんが)設定し、セルのアドレスを「開いているファイルのパス付きファイル名+.ini」などのファイルにテキスト保存する。 ボタン2で、そのファイルを読み込み、そのセルに日付(時間)を入力して上書き保存する。 ブック名が無題の場合や、設定を保存したファイルが見つからない場合の処理ももちろん実装します。 このようにしたいと思いますが、ご意見お願いします。
- imogasi
- ベストアンサー率27% (4737/17070)
VBEの標準モジュールに(名前はdatsetでなくても何でも良い) Sub datset() ActiveCell = Date Application.Dialogs(xlDialogFormatNumber).Show End Sub を貼りつける。ワークシートに戻って メニューの「ツール」をクリック 「ユ―ザー設定」をクリック 「コマンド」のタブをクリック 「マクロ」をクリック ユーザー設定ボタンをツールバーへドラッグする 「選択したボタンの編集」をクリック 「マクロの登録」をクリック 上記のモジュールの「datset」をクリック 「OK」 これで、ツールバーボタンをクリックすると、当日の 日付けが、アクチブセルに入り、瞬間的に続いて、書式設定のダイアログウインドウが開きますので、日付けの書式を指定してください。 もうひとつ上書き保存するは上記と同じ要領でツールバーボタンをもう1つ設け Sub datsav() ActiveWorkbook.Save End Sub を登録するのはどうでしょう。
お礼
回答ありがとうございます。 読んだ直後、「おっ」と思いました。 が、しかし、当日の日付を入れるのは保存の直前にしたいので、この方法ではちょっと違います。 ボタン1はあくまでも設定用のボタンで、実際の入力&保存はボタン2に担当してもらおうと思っています。
- papayuka
- ベストアンサー率45% (1388/3066)
こんな感じでしょうか? Sub Test() Dim r As Range On Error GoTo ERR: Set r = Application.InputBox("セルを選択", "入力", "A1", Type:=8) r.Value = Now ERR: End Sub
お礼
回答ありがとうございます。 確かにダイアログウィンドウでセルを選択できるのはすばらしく思います。ただ、イメージしていたのと少し違い、「グラフの作成ウィザード」のようにセルを選択できる状態に移行できるのができたらな、と思ったのです。質問文に言葉が足りなくてすみません。 セルを設定するボタンと、日付を入力するボタンを完全に分けたいと思っています。 何かいい方法がありましたらお願いいたします。
お礼
回答ありがとうございます。 ヘッダに記述しても同じようなことができることに気がつきました。 で、このようなコードを書いてみました。 Sub test() ActiveSheet.PageSetup.RightHeader = Format(FileDateTime(ThisWorkbook.FullName), "yyyy年mm月dd日 更新") ActiveSheet.PrintOut ActiveSheet.PageSetup.RightHeader = "" End Sub あとはこれに上書き保存のコードを書き足せばOKのような気がします。 ありがとうございました。