Excelでシート名と最終更新日を自動表示したい

このQ&Aのポイント
  • Excelを使用して、セルA1に入力した名前をシート名として表示し、セルH1に最終更新日を自動的に入力したいです。
  • セルB1に入力された値を使用して、ワークシートの名前を変更するためにWorksheet_Change関数を使用します。また、Workbook_BeforeSave関数内で、ワークシートのH1セルに現在の日付を入力することもできます。
  • 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 というコードを組み合わせて使用することができます。ただし、注意点として、カスタムコンテンツによって正しい動作が妨げられる可能性があるため、他のコードとの競合やセキュリティ上の問題がないかを確認することが重要です。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • kybo
  • ベストアンサー率53% (349/647)
回答No.4

Workbook_BeforeSaveは「ThisWorkbook」に記述してみて下さい。 の意味がおわかりになられていないようなので、以下の画像をよくご覧になって下さい。 「Workbook_BeforeSave」のコードは、プロジェクトエクスプローラのThisWorkbookをダブルクリックの上、記述します。 「Worksheet_Change」については、その場所でOKです。

mate_2010
質問者

お礼

再度自力で調べ、解決しました! 今後このページをご覧になる方へ念のため書き記します。 まず (1)セルA1に入れた名目をシート名にする シート名を右クリックして「コードの表示」から Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("A1") End Sub (2)セルH1には、最終更新日を自動で入れる シート名を右クリックして「コードの表示」から 開いたウィンドウの上部にある「挿入」→「標準モジュール」を選びます。 すると標準モジュールが追加されるので、 左側には、 プロジェクト - VBAProject -■VBAProject(Book1)  -□MicrosoftExcelObject  │├Sheet1(Sheet1)  │├Sheet2(Sheet2)  │├Sheet3(Sheet3)  │└ThisWorkbook  -□標準モジュール   └Module1 と「標準モジュール」部分が追加されているはずです。 そして、新しく開いたウィンドウの部分に Public Function LastSaveTime() As Variant Application.Volatile LastSaveTime = ThisWorkbook.BuiltinDocumentProperties("Last save time").Value End Function をコピペ。 最後に、更新日付を表示させたいセル(今回だとH1)に =LastSaveTime() をコピペ。 不思議な数字の配列が表示された場合は 「セルの書式設定」の表示から「日付」で 好みのものを選び(2011/7/23とか)ます。 すると、できました! 教えていただいた 「ThisWorkbook」の操作から解決はできませんでしたが 二度もご回答いただきましたので、 ベストアンサーはkybo さんにしたいと思います! どうも、ありがとうございました★

mate_2010
質問者

補足

回答ありがとうございます。 ただ、どうしても解決しません。。。 教えていただいた画面から「ThisWorkbook」をダブルクリックして 新しく開いた画面に ■ ■ ■■ ■ ■■ ■ ■■ ■ ■■ ■ ■■ ■ ■ Private Sub ThisWorkbook(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 □ □ □□ □ □□ □ □□ □ □□ □ □□ □ □ と入れましたが…、 シート名は相変わらずかわるものの 最終更新日が入りません。。。 コードの中のシート名は、 変更後のシート名(コードで指定したもの)を入れなくてはならないのでしょうか? つまり、シート名をB1で「りんご」と入れた場合 ■ ■ ■■ ■ ■■ ■ ■■ ■ ■■ ■ ■■ ■ ■ Private Sub ThisWorkbook(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ThisWorkbook.Saved = False Then Worksheets("りんご").Range("H1").Value = Date End If End Sub ■ ■ ■■ ■ ■■ ■ ■■ ■ ■■ ■ ■■ ■ ■ と入れるのでしょうか? 試しにやってみたんですが、変わりませんでしたが。。。 〝ThisWorkbook”も、〝りんご″に変えた方がいいんでしょうか?

その他の回答 (3)

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

それぞれのマクロを正しく使用しなければ動きません。闇雲にコピーしましたでは,ダメです。 1のマクロは次のようにします http://excelvba.pc-users.net/fol3/3_6.html 2のマクロは次のようにします http://excelvba.pc-users.net/fol4/4_5.html 別の方法: シートのマクロは,シート名タブを右クリックしてコードの表示を選んで記述します。 これはご質問で見つけてきたやり方ですね。いわずもがなですが,シートのマクロを効かせたい「正しいシート」に登録しなければ動きません。 ブックのマクロは,ブックをエクセルウィンドウの中で最大化ではない状態にしてから,ブックウィンドウのタイトルの左端のブック名の左隣りのアイコンを右クリックしてコードの表示を選び,現れたシートに記述します。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

別サイトの過去の質問ですが 「エクセルの最終更新日自動入力について」 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1418194819

mate_2010
質問者

補足

回答ありがとうございます。 このサイトは、質問文のコードで試すまでに 既に読んでおりまして 今回もう一度 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Rng = Range("H1") On Error GoTo ErrHandler Application.EnableEvents = False Rng.Value = Date ErrHandler: Application.EnableEvents = True End Sub を入力してみましたが そもそも何もH1には出てきません。 (A1には既にシート名になるものを入れてあり、シート名はA1のものが入っています) すみません、ド素人なんです。 力技で、質問文の内容までこぎつけたレベルです。。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

Workbook_BeforeSaveは「ThisWorkbook」に記述してみて下さい。

mate_2010
質問者

補足

回答ありがとうございます。 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub ThisWorkbook(ByVal SaveAsUI As Boolean, Cancel As Boolean) If ThisWorkbook.Saved = False Then Worksheets("Sheet1").Range("H1").Value = Date End If End Sub にして、保存し 一旦閉じてから開いて 適当なセルに入力して保存しても何もでてきませんでした。。。

関連するQ&A

  • VBAでWorkbook_BeforeSaveイベントで質問

    Workbook_BeforeSaveイベントである条件に達していればExcelファイルを終了したくないのですがどうすればよいでしょうか? WindowsXP ProSP2、Excel2000 コード例) Option Explicit Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) dim flg as boolean if flg=true then exit sub end if End Sub

  • エクセルで1つのマクロを複数のシートに適用したい

    いつもお世話になっております。 以前ここで入力セルはファイル保存時に自動で保護かかるように、下記のコードを教わって便利に使い始めたのでですが、同じBookの複数のシート、あるいは一括で全てのシートで有効にしたいのですが。(この機能をデフォルトで選択機能にしていないのはおかしい位に思い始めています。) シート毎に範囲名を指定して、This Workbookにマクロを登録する必要があるのでしょうか? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim RowCnt As Long Dim ColCnt As Long Dim MyCell As Range With ThisWorkbook.Sheets(1) .Unprotect Password:=MyPassword For Each MyCell In Range("保護範囲") If MyCell.Value <> "" Then MyCell.Locked = True Else MyCell.Locked = False End If Next MyCell .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub

  • VBAでイベント処理に複数回入ってしまうのを防ぎたい

    こんにちは。 マクロのエクセルファイルを操作し、セーブ時にCSV形式でテクストファイルに書くことを実現しようと思っています。 VBAでイベント処理"BeforeSave"で以下のように書くと、初めに書かれた"test.txt"が同じ処理を行おうとしているようで、そこでも書き込みの処理を行おうとする→無限に書き込みが発生?→エラーの表示が出てきます。これはどういう風に対処すればよろしいのでしょうか? Workbook/BeforeSaveイベント処理: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim file_curr As String Dim msg As String file_curr = ThisWorkbook.Path & "\test.txt" If Dir(file_curr) = "" Then ActiveWorkbook.SaveAs _ Filename:=file_curr, _ FileFormat:=xlCSV, Local:=True msg = "saved" Else msg = "file exist, not saved" End If MsgBox msg End Sub

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

  • Private Sub Workbook_BeforeSaveについて

    エクセル2000です。 腑に落ちない現象が起きているので質問させてください。 Sheet1にテキストボックス(OLEオブジェクトのTextboxではありません)とボタンが貼ってあり、Visble=Falseで非表示にしています。それを保存する際には表示させたいので、BeforeSaveイベントで Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheet1.TextBoxes("テキスト").Visible = True Sheet1.Buttons("ボタン").Visible = True MsgBox "保存されちゃった!" End Sub と書いてみました。 手動で保存する場合には正しく、テクストボックスやボタンは正しく表示されます。もちろんMsgboxも出ます。 ところが、標準モジュールに書いた以下のコード、 Sub 保存() ActiveWorkbook.Save End Sub を走らせてみても、"保存されちゃった!"と、Msgboxは出ますが、肝心のテクストボックスやボタンが表示されません。 試行錯誤の結果、 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheet1.Shapes("テキスト").Visible = True Sheet1.Shapes("ボタン").Visible = True MsgBox "保存されちゃった!" End Sub と書くと、標準モジュールから、ActiveWorkbook.Saveでも表示されることがわかりました。 どうしてでしょうか?

  • EXCELマクロでのシート間のデータ同期方法

    質問させていただきます。 EXCELにて、"シート1"のA1~C3と"シート2"のD4~F6を 同期化したく考えております。 ・いわゆる一方のシートが「読み取り専用」になってしまうリンク貼り付けではなく、シート1、シート2相互が書き換え可能の同期化です。 ・A1とD4、B3とE6、のように互いに照合箇所のセル同士を同期反映させたいと考えております。 なお、他の質問を参照したところ、 シート1のA1とシート2のD4の単一セルを同期かする方法は確認できました。(以下参照) ***************************************************************** シート1のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Worksheets("シート2").Range("D4") = Target End If End Sub シート2のコードは Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$4" Then Worksheets("シート1").Range("A1") = Target End If End Sub *************************************************************** これを参考にVBAの シート1のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$2" Then Worksheets("シート2").Range("D5") = Target End If End Sub シート2のコードエディターに Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$5" Then Worksheets("シート2").Range("A2") = Target End If End Sub というように追記していったのですが、エラーとなってしまいます。 お詳しい方がおられましたらお願いいたします。

  • Excel2000の保存時のイベントプロシージャ

    エクセル2000で、あるセルが空白なら警告メッセージボックスを出して 保存できないようにする、というプログラムをVBAで作りました。 VBEで一行ずつ走らせるとちゃんとメッセージボックスが 出てくるのですが、実際にブックからD6を空白にしたまま保存しようと したらメッセージボックスが出てこずに保存できてしまいます。 どこかで、設定が必要なのでしょうか? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) With Worksheets("sheet1") If .Range("D6").Value = "" Then MsgBox "please enter D6 field.", vbCritical, "警告" Cancel = True End If End With End Sub

  • エクセルマクロですべてのファイル保存時コメントだす

    エクセルのアドインでファイル保存するときに”保存しますか?”の ダイアログをすべてのファイルに出したいのですが、 うまくいきません。どなたかお教えください。 PERSONAL_SAVE.XLS というファイルに以下のマクロを作成し C:\Documents and Settings\***\Application Data\Microsoft\Excel\XLSTART VBのClass1に 'Option Explicit Public WithEvents App As Application Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox ("保存しますか?") End Sub を作成し、 同じくVBのThisworkbookに Dim x As New Class1 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Set x.App = Application End Sub を作成します。 このときは、ほかのファイルに対しても 保存しますか? のメッセージがでます。 しかし、 このファイルをPERSONAL_SAVE.lxa として 保存し、ツール⇒アドイン で追加し、立ち上げても 同様な動きをしません。 どうしてでしょうか? インスタンス?の関係でしょうか?Private を Publicにしても同じでした。

  • エクセルで「名前を付けて保存」を自動的に名前を付けて保存したい

    エクセルで「名前を付けて保存」をする時に自動的に名前を付けて保存が出来るように出来ないでしょうか。 エクセルで見積書を作成後に「名前を付けて保存」→「受注番号入力」をしているので、これを「名前を付けて保存」をクリックした時にファイル名を自動的に受注番号が入れば少しでも時間短縮が出来るかと思い、相談させていただきます。 自分なりに参考書などを読み、下記のようになると思ったのですが、出来ません。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SavaAsUI Then Application.EnableEvents = False Application.Dialogs(xlDialogSaveAs).Show _ Arg1:=Me.Path & Application.PathSeparator & Sheet(1).Range("A1").Value Application.EnableEvents = True Cancel = True End If End Sub シート1に見積書があり、シート2、シート3はありません。 「A1」のセルに受注番号が入っています。 これのどこがダメなのか教えてもらえませんか。 もし、他に方法があるのであれば教えていただけませんか。 ご無理申します。

  • VBAのWorkbook_BeforeSaveイベントについての疑問

    エクセル2000です。 前にも似たような質問をしたのですが理解ができていません。 ThisWorkbookモジュールに以下の記述をし、終了時保存する場合にはSheet2を表に出すようにしました。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Value = Time() Sheets("Sheet2").Select MsgBox "保存します。" & ActiveSheet.Name Sheets("Sheet1").Range("B65536").End(xlUp).Offset(1).Value = Time() End Sub これで×を押して手動で終了すればそのとおりに働きます。ActiveSheet.Nameも当然Sheet2になります。 ところが、標準モジュールの下記の終了マクロ Sub 終了() ThisWorkbook.Close End Sub で終了しようとすると、A列セルにTime()は記録され、どういうわけかSheet2がSelectされず、MsgBox "保存します。" のメッセージが出て、B列セルにTime()が記録され、保存されます。 ActiveSheet.NameもSheet2ではありません。 つまり、Sheets("Sheet2").Select の部分だけが完全にスキップされてしまうのです。 どうしてでしょうか?

専門家に質問してみよう