『日付の自動入力』(164) Excel2010 1bookに31日分のsheetを作成し、業務日誌として使用しています。 日付を自動入力にしたいと思いTODAYを使い計算方法の設定も変えて みたのですが、業務が日付をまたぐため困っています。 1sheet毎に業務開始日の日付が自動入力されたままにしたいのですが 無理ですか? その日毎の日誌に業務開始日を自動入力させ、かつ他のsheetへ影響 させないということはできないのでしょうか? 1日毎にbook別にするしかありませんか? よろしくお願いします。 ---- シート名や日付の位置、入力したい日付の情報があるともっと回答しやすいと 思いますが、現在はどのセルにどのような式が入っているのでしょうか。 直接の解決ではありませんし、ご存知かもしれませんが、今日の日付は Ctl+'+'で入力できます。 (Mook) ---- * 1bookに31日分のsheetを作成し、業務日誌として使用しています。 と言う事は作成時に A1 あたりに 日付けを事前セットしておけば良いのでは。 マクロになりますが。。。まあ31枚ですから手動でも良いでしょうし。 (Cod) ---- (164)です。 (Mook)さん、(Cod)さん、コメントありがとうございます。 今までは列幅1で B9に平成 L9に年 V9に月 AF9に日 AP9に曜日 とあらかじめ漢字で入力してあり G9、Q9、AA9、AK9に年、月(1〜12)、日(1〜31)、曜日(日〜土)をリストから 選択入力するようになっていました。 sheet名は1・2・3・・・31です。(日にちです) 高齢の上司たちも使用することがあるし、私自身も色々と覚えていきたいので 自動入力にチャレンジし G9:=YODAY()、表示形式e Q9:=TODAY()、表示形式m AA9:=TODAY()、表示形式d AK9:-YODAY()、表示形式aaa とし、計算方法の設定を変更してみましたが、思うとおりにいかなったという しだいです。 やはり、1bookに31sheet日誌があり、その日付を自動入力にしようとする 使い方がそもそもよろしくないのでしょうか・・・ ---- =Today()は 今(13:40)にセットしますと 2013年3月14日ですが 今日の24時を過ぎると 2013年3月15日に変わります。コンピュータの持っているシステム日付け を転写しているようなものなので。 なので関数ではなく 日付けの数字を事前セットしておくべきですので 前回書きましたマクロか手動で 1シート毎に セットしておく必要があると思います。 マクロで良ければサンプル書いても良いのですが。 関数なら、しばし識者の方の回答を待ちましょう。 (Cod) ---- (164)です。 Codさん、ありがとうございます。 マクロというものがわからないので少し調べて簡単なものをやってみました。 が、ちょっとみただけではさっぱり???です。 今回は日付入力程度のことですのでCodさんが言われるように手動入力で全く 構わないのですが、色々覚えていきたいのでマクロのサンプル教えて下さい。 よろしくお願いします。 ---- 標準モジュールに貼り付けて ATest777を実行して下さい。 動きをみるための手抜きコードです。3月で31枚のシートのA1に日付けをセットしています。 Sub ATest777() Dim Wb2 As Workbook Set Wb2 = NewBook(31) 'ブックの追加(シートは31枚) ChangeSheetName Wb2 'シート名と日付けの書き込み End Sub ''------------------------------------------------------------ ブックの追加とシートの追加 Function NewBook(P2 As Long) Dim W1 As Long W1 = Application.SheetsInNewWorkbook 'Sheet Count Get Application.SheetsInNewWorkbook = P2 'Sheet Count ReStore Set NewBook = Workbooks.Add '★シート指定枚数(P1) で 新規ブックの作成 Application.SheetsInNewWorkbook = W1 'Sheet Count ReStore End Function ''------------------------------------------------------------ シート名の変更と日付けのセット Function ChangeSheetName(Wb1 As Workbook) Dim W1 As Long, i As Long For i = 1 To 31 With Wb1.Sheets(i) W1 = DateValue("2013/3/1") + i - 1 .Name = Format(W1, "MM_DD") .Range("A1").Value = Format(W1, "yyyy/mm/dd") End With Next End Function (Cod) ---- (164)です。 Codさん、ありがとうございます。 標準モジュールというのも初めて聞くものでしたので、調べてやってみました。 テスト手順としては @新規bookを開く A標準モジュールへサンプル貼り付け Bマクロ→ATest777実行 でよろしいでしょうか? やってみたところ、ATest777実行と同時にbook2が表示されbook2に31sheet(シート名入り)で 出ました。 因みに保存するときのファイルの種類は、マクロ有効テンプレート 保存でいいんでしょうか? ---- マクロを貼り付けたブックは マクロ有効ブック(XLSM)の形式です。 問題は Book2 の方なんですが確認点としては、 1.シート名は希望されているものですか。   もし違うなら ".Name = Format(W1, "MM_DD")" の部分が Text関数同様の書式を書けば   変わります。分からなければ聞いてください。 2.と各シートのA1 に 日付けをセットしてますが、場所は別としてこの内容で良いのでしょうか。 3.で、場所はコードをコピーしてA1 を G9に書式は"e"にのように   変更すれば基本形としては出来あがりです。 4.あとは3月を固定で動かしてますので、   どうするかはこれから考える必要がありますが。    ".Range("A1").Value = Format(W1, "yyyy/mm/dd")" を   G9:=YODAY()、表示形式e   Q9:=TODAY()、表示形式m   AA9:=TODAY()、表示形式d   AK9:-YODAY()、表示形式aaa (Cod) ---- (164)です。 Codさん、ありがとうございます。 >1.シート名は希望されているものですか。 シート名は今まで1日・2日・3日としていただけなのでCodさんの サンプルで問題ありません。 >もし違うなら ".Name = Format(W1, "MM_DD")" の部分が Text関数同様の書式を書けば   変わります。 わかりました。 >2.と各シートのA1 に 日付けをセットしてますが、場所は別としてこの内容で良いのでしょうか。 大丈夫です。 >3.で、場所はコードをコピーしてA1 を G9に書式は"e"にのように   変更すれば基本形としては出来あがりです。 わかりました。 >4.あとは3月を固定で動かしてますので、 3月を固定で動かしているとはどのような意味なのでしょうか? マクロの内容が2013年3月にしか対応していないということなのでしょうか? もしそういうことであれば、例えば4月分を作成するときに W1 = DateValue("2013/3/1") + i - 1 を"2013/4/1"に変えればいいのですか? 早速色々自分で変えてやってみようと思い、まず、 ".Name = Format(W1, "MM_DD")" を変えてみようと 思いサンプルマクロを入れたbookを開きマクロの表示というところを見たのですが、何もありません。 一度保存したbookのマクロは編集できないのですか? マクロを変更する場合は、編集したものを再度標準モジュールに貼り付けて行わなければならないので しょうか? 全くのド素人ですので検討違いの質問になっていたら申し訳ありません。 ---- 3月固定の部分は *何月分を作成しますか。のメッセージを出して、その回答で動くように考えてみます。 とマクロが消えた事ですが。 *少しややこしいですが、まずマクロを新規ブックにコピーして貼り付け。 *で、ATest777 を 実行 *結果 Book2 が 作成されています。なので Book2 は 通常の XLSX または XLS で保存。 マクロのある方が XLSM で保存なので、Book2の方を XLSMで保存してませんか。 (Cod) ---- (164)です。 Codさんお手数おかけしてます。 私が行った一連の手順を書きます。 @新規Bookを開く AALT+F11キー B右クリック→挿入→標準モジュール Cマクロ貼り付け Dマクロ表示→ATest777実行 EBook2をExcelマクロ有効ブックで保存 (A1に日付が入りシート名が03_01・・・となっているので) FBook1は削除 (シートに何も表示されていないので関係ないと思っていました) 私が根本的に間違いを犯していたようですね。 何もわからないもので申し訳ありません。 やり直し Book1をExcelマクロ有効ブックで保存 Book2をExcelブックで保存 し、Book1、Book2共に開きマクロ表示→編集にすると 表示されていないブックのマクロは編集できません。[ウインドウ再表示]コマンドを選択して、ウインドウを表示してください。 と表示されます。 ALT+F11キー→Module1をダブルクリックすると 貼りつけたマクロが表示されたので 1.シート名は希望されているものですか。   もし違うなら ".Name = Format(W1, "MM_DD")" の部分が Text関数同様の書式を書けば   変わります。分からなければ聞いてください。 をやってみたところできました。 W1 = DateValue("2013/3/1") + i - 1 を"2013/4/1"に変えてみたところ 実行時エラー1004 シートの名前をほかのシート、Visual Basicで参照されるオブジェクトライブラリまたはワークシートと同じ名前に変更することはできません。 と表示されますが、日付は4月に変わるんですね。 ---- マクロ・ブックの保存とシート名の変更はOKのようです。で、 4月へのプログラム変更は必要ありません。 前回の回答で書きました下記内容に絡みますのでしばしお待ちください。 *何月分を作成しますか。のメッセージを出して、その回答で動くように考えてみます。 ---- GetMonthを追加。。。YYYY/MMで入力して下さい。キャンセル等はそこで終了します。 分かる範囲で各セルにセットしてます。とシート名は 1日,2日。。。に修正しました。(Cod) Sub ATest777() Dim Wb2 As Workbook, YMD As Date YMD = GetMonth Set Wb2 = NewBook(YMD) 'ブックの追加(シートは31枚) ChangeSheetName YMD 'シート名と日付けの書き込み End Sub ''------------------------------------------------------------ 処理月の指定 Function GetMonth() As Date Dim Rc As Variant Rc = InputBox("処理年月を入力して下さい。", , Format(Date, "YYYY/MM")) If Rc <> "" Then GetMonth = Format(CDate(Rc), "yyyy/mm/dd") Else MsgBox "キャンセルされたようです。処理を停止します。" End End If End Function ''------------------------------------------------------------ ブックの追加とシートの追加 Function NewBook(P1 As Date) Dim W1 As Long, W2 As Long W1 = Application.SheetsInNewWorkbook 'Sheet Count Get W2 = Day(DateSerial(Year(P1), Month(P1) + 1, 0)) '最終日の算出 Application.SheetsInNewWorkbook = W2 'Sheet Count ReStore Set NewBook = Workbooks.Add '★シート指定枚数(P1) で 新規ブックの作成 Application.SheetsInNewWorkbook = W1 'Sheet Count ReStore End Function ''------------------------------------------------------------ シート名の変更と日付けのセット Function ChangeSheetName(P1) Dim W1 As Long, W2 As Long, i As Long W2 = Day(DateSerial(Year(P1), Month(P1) + 1, 0)) '最終日の算出 For i = 1 To W2 With ActiveWorkbook.Sheets(i) W1 = P1 + i - 1 .Name = Format(W1, "D日") .Range("B9").Value = "平成" .Range("L9").Value = "年" .Range("V9").Value = "月" .Range("AF9").Value = "日" .Range("AP9").Value = "曜日" .Range("G9").Value = Format(W1, "e") .Range("Q9").Value = Format(W1, "m") .Range("AA9").Value = Format(W1, "d") .Range("Ak9").Value = Format(W1, "aaa") End With Next End Function ---- (164)です。 Codさん、本当にありがとうございます。 今更の質問になってしまいますが、もしかしてこの「マクロ」というものは 今現在すでに使用している様式(Book)そのものには反映させられないもの なのですか? 実際に使用している業務日誌を開き、修正していただいたマクロを実行すると 新たなBookに年月日、曜日だけが入っていますが、使用している業務日誌自体は 変化しませんよね。 今使用している様式(Book)の日付欄がマクロにより入力になると思っていた のですが、マクロ実行したときにできる新たなBookを使い様式を作り直すもの なのでしょうか? せっかく教えていただいたので、2時間ほど格闘しているのですがわかりません。 きっと根本的な勘違いをしているものと思いますので、教えて下さい。 申し訳ありません。 ---- 最初の説明が抜けていました。失礼しました。  このマクロは新たにブックを追加して日数分の シートを作成。  同時に 各シートに日付けと(今は未処理ですが書式を)自動でセットするものです。  『少し変更すれば』既存のブックを対象に『変更』の形で日付けセットするようなことは可能です。    Q1.新規は不要ですか?  Q2.既存のブックを対象とするなら『使用している業務日誌』の   どのセル部分を変更すればよいでしょうか。下記の4行ですか。       .Range("G9").Value = Format(W1, "e") .Range("Q9").Value = Format(W1, "m") .Range("AA9").Value = Format(W1, "d") .Range("Ak9").Value = Format(W1, "aaa") (Cod) ---- (164)です。 私にあまりにも知識がないもので余計なお手数をおかけして申し訳ありません。 Codさんがおっしゃっていることを私が理解できていないことがあると思いますので 現状の使用状況で回答させていただきます。 >Q1.新規は不要ですか? 現状は元本Bookを基に毎月ファイル名だけを3月、4月・・・と変更して使用しています。 ですので、元本BookにCodさん作成のマクロが入っていれば、毎月始めに元本Bookを開けば >YYYY/MMで入力して下さい。キャンセル等はそこで終了します。 がでるのであれば新規Bookは不要ということになると思います。 >Q2.既存のブックを対象とするなら『使用している業務日誌』の   どのセル部分を変更すればよいでしょうか。下記の4行ですか。 既存Bookでの日付部分を記載します。 A9:空セル B9:平成(B9〜F9結合) G9:空セルで手入力で25を入力していました(G9〜K9結合) L9:年(L9〜P9結合) Q9:空セルでリストから1〜12を選択していました(Q9〜U9結合) V9:月(V9〜Z9結合) AA9:空セルでリストから1〜31を選択していました(AA9〜AE9結合) AF9:日(AF9〜AJ9結合) AK9:空セルでリストから日〜土を選択していました(AK9〜AO31結合) AP9:曜日(AP9〜AT31結合) AU9:( AV9:空セルでリストから平日・休日を選択していました(AV9〜AZ9結合) BA9:) BB9:空セル BC9:空セル となっていますので、既存Book列のAP9までが変更になるといいということでしょうか。 簡潔・適切に回答できなくて申し訳ありません。 ---- 以下、元本Bookをコピーして3月なり4月分を作成されていることを基準にします。  Q1.日付けは31もあれば28もありますので余った日のシートはどうされてますか。   *手動で削除、または非表示ですか。   Q2.たとえば B9 は "平成" と既に入力されているはずですから プログラムで    わざわざ 上書きする必要はありませんが、C9 は年度ですから、作成するブックの    年月から 年を取得して 平成に置き換えてから上書き でよろしいですか。  Q3. Q9,AA9,AK9,AV9 は 入力規則 を使った入力をされているのでしょうか。    日々ログを書かれる方がセット? または 最初に一括して 164 さんが作成?    注)この方法なら 深夜に日が変更されることもないと思いますが?    で、この部分を自動的に置き換えたいという事ですよねえ。 (Cod)   ---- (164)です。 Codさん、レスポンス遅くなり申し訳ありません。 >Q1.日付けは31もあれば28もありますので余った日のシートはどうされてますか。   *手動で削除、または非表示ですか。 元本Bookは月最大日数の31sheetで作成しており、30日でも28日でも削除等は行っていませんでした。 >Q2.たとえば B9 は "平成" と既に入力されているはずですから プログラムで    わざわざ 上書きする必要はありませんが、C9 は年度ですから、作成するブックの    年月から 年を取得して 平成に置き換えてから上書き でよろしいですか。 はい。問題ありません。 >Q3. Q9,AA9,AK9,AV9 は 入力規則 を使った入力をされているのでしょうか。 そのとおりです。 >日々ログを書かれる方がセット? または 最初に一括して 164 さんが作成?  注)この方法なら 深夜に日が変更されることもないと思いますが? 交代制の勤務ですので当日の担当者がリストからその日の日付を選択入力していました。 Codさんのおっしゃるとおり従前の方法は日付変更されることもありませんし、特に手間がかかる 作業でもありません。 「こういうことはできないのかな?」という疑問から始まったものです。 >で、この部分を自動的に置き換えたいという事ですよねえ。 そのとおりです。 ---- 1.元本Book.xlsにマクロをセットします。。。内容は再検討で以下のような仕様。 2.新規に作成する 年月を 既提示内容で入力することで   2−1.元本Book.xls を 新規ブックとしてコピー。       ブック名は 例えば 業務日誌_201304.xlsで作成   2−3.シートは例えば4月なら30 枚分に日付けをプログラムでセット       *.Range("G9").Value = Format(W1, "e") *.Range("Q9").Value = Format(W1, "m") *.Range("AA9").Value = Format(W1, "d") .*Range("Ak9").Value = Format(W1, "aaa")   2−4.31日目は非表示。 (Cod) ---- (164)です。 Codさん、お手数をおかけしています。 よろしくお願いします。 ---- 元本Book.xls の標準モジュールに貼り付けです。。。先頭の2行(Dim)忘れずに。 新規ブックは このブックと同じフォルダーに作成されます。 Dim YMD As Date '作成する年月 Dim Bnm As String '作成するブック名 Sub ATest999() Call GetMonth '作成する年月の取得 Call CopyBook '新規ブックの作成(元本Bookのコピー) Update1 YMD 'シート名と日付けの書き込み MsgBox Bnm & "新規作成しました。内容確認してください。" End Sub ''------------------------------------------------------------ 処理月の指定 Function GetMonth() As Date Dim Rc As Variant Rc = InputBox("処理年月を入力して下さい。", , Format(Date, "YYYY/MM")) If Rc <> "" Then YMD = Format(CDate(Rc), "yyyy/mm/dd") Else MsgBox "キャンセルされたようです。処理を停止します。" End End If End Function ''------------------------------------------------------------ ブックをコピー Function CopyBook() Dim S1 As String Bnm = "業務日誌_" & Format(YMD, "yyyymm") & ".xls" ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\" & Bnm Workbooks.Open ThisWorkbook.Path & "\" & Bnm End Function ''------------------------------------------------------------ シート名の変更と日付けのセット Function Update1(P1) Dim W1 As Long, W2 As Long, i As Long, Wb2 As Workbook Set Wb2 = Workbooks(Bnm) W2 = Day(DateSerial(Year(YMD), Month(YMD) + 1, 0)) '最終日の算出 ''---------------------------------------------/*シートの表示・非表示のみ For i = 1 To 31 Wb2.Sheets(i).Visible = IIf(i <= W2, True, False) Next ''---------------------------------------------/*各シートの項目修正 For i = 1 To W2 With Wb2.Sheets(i) W1 = P1 + i - 1 ' .Name = Format(W1, "D日") ' .Range("B9").Value = "平成" ' .Range("L9").Value = "年" ' .Range("V9").Value = "月" ' .Range("AF9").Value = "日" ' .Range("AP9").Value = "曜日" .Range("G9").Value = Format(W1, "e") .Range("Q9").Value = Format(W1, "m") .Range("AA9").Value = Format(W1, "d") .Range("Ak9").Value = Format(W1, "aaa") End With Next End Function (Cod) ---- (164)です。 Codさん、ありがとうございます。 早速数か月分作成してみました。 大変便利です。 ありがとうございました。