- 締切済み
日付付シートの自動作成 とその反映
エクセル2003 07を併用使用してます 現在 日誌原簿を作成し別ブックにコピーを31日分行い それぞれに 日付変更 原簿の変更があれば 作業グループで 変更を行ってます 今回 対象店舗が数十にわたり 手作業では間に合いません Q1 日数分のマクロでの作成方法 (28日から31日まで Q2 原簿の修正を全てに反映させる方法 (リンクできるものでしょうか 以上 教えて下さい
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
多数のファイル・シートを毎月増殖させるよりは、データベース化した方が良いと思いますが、事情もあるのでしょう。 各操作をマクロ記録して、組み合わせれば、ご希望の機能を実現できます。ためしに作成してみましたが、コードの解説はご容赦ください。 要求仕様がはっきり分からないところがあるのですが、 1.年、月は対話で与える 2.各県(実際は各支店なのでしょうが)のリストはコード中に、半角カンマ区切りで文字列として与える 3.県名200712.xlsというブックを生成(年月は入力した値により変化) 4.県名200712.xlsに、原簿シートをその月の日数分複写し、県名01~県名31(当該月の最終日)といったシート名にする。各シートの指定セルに、該当する日付を入力する。 5.原簿シートの中で、変更する可能性があり、全部に反映したいセル範囲(コード中で指定)を、全ブックの全シートにリンク貼り付けする。 といったコードです。2000用なので、上位バージョン、特に2007で動くかどうかは不明です。 Sub test() Dim targetBook As Workbook Dim sheetDate As Long Dim prefName As String Dim dateCountPerMonth As Long Dim monthString As String Dim dateArray As Variant Dim prefArray As Variant Const prefList As String = "大阪,京都" '半角,区切り Dim i As Long Dim linkRange As Range prefArray = Split(prefList, ",") '変更する可能性のあるところだけ範囲を決めてリンク貼り付けする Set linkRange = ThisWorkbook.Sheets("原簿").Range("B1:C3") monthString = InputBox("対象とする年,月を , で区切って入力してください", "年月入力", "", 100, 100) monthString = StrConv(monthString, vbNarrow) dateArray = Split(monthString, ",") dateCountPerMonth = DaysInMonth(DateValue(dateArray(0) & "/" & dateArray(1) & "/1")) Application.ScreenUpdating = False For i = LBound(prefArray) To UBound(prefArray) prefName = prefArray(i) For sheetDate = 1 To dateCountPerMonth If sheetDate = 1 Then ThisWorkbook.Sheets("原簿").Copy Set targetBook = ActiveWorkbook targetBook.SaveAs ThisWorkbook.Path & "\" & prefName & _ Format(DateValue(dateArray(0) & "/" & dateArray(1) & "/1"), "yyyymm") & ".xls" linkRange.Copy ActiveSheet.Range("B1").Activate ActiveSheet.Paste Link:=True '1日のシートに入れた日付を複写するなら 'ActiveSheet.Range("A1").Value = DateValue(dateArray(0) & "/" & dateArray(1) & "/" & Trim(Val(sheetDate))) Else targetBook.Sheets(1).Copy after:=targetBook.Sheets(targetBook.Sheets.Count) End If ActiveSheet.Name = prefName & Format(sheetDate, "0#") 'シート毎に日を変えるなら ActiveSheet.Range("A1").Value = DateValue(dateArray(0) & "/" & dateArray(1) & "/" & Trim(Val(sheetDate))) Next sheetDate Application.DisplayAlerts = False targetBook.Save Application.DisplayAlerts = True targetBook.Close SaveChanges:=False Next i Application.ScreenUpdating = True End Sub 'Microsoftのサンプルコード Private Function DaysInMonth(MyDate) ' この関数は、引数に日付を指定し指定された月の総日数を返します。 Dim NextMonth, EndOfMonth NextMonth = DateAdd("m", 1, MyDate) EndOfMonth = NextMonth - DatePart("d", NextMonth) DaysInMonth = DatePart("d", EndOfMonth) End Function
- guure
- ベストアンサー率0% (0/4)
こんにちは。 どういう状況でコピーしているのかいまいち分かりかねるのですが・・・。 「=前のセル+1」で次の日付を自動的に反映できると思います。一番初めのデータは計算式ではなく、ちゃんとした日付を入力しておく必要があります。 以上で解決できるでしょうか?
補足
補足させてください 原紙となるシート1(ブックA)を作成し コピーしたものを 各県別に名前をつけます シート大阪01(ブック2) これを同じブック内でコピーし シート大阪01からシート大阪31(ブック2) 同様のものが ブック50(シート奈良 シート岡山 等々各50以上 まで作らなければなりません 今回の質問ですが Q1 シート大阪01をブック内原紙として そのシート内に 2007/12/01を入力し 当月を満足する日数の シート大阪31までのシート作成する方法 (現状では手作業で コピーしてます Q2 原簿であるシート1(ブックA)の修正が 全て反映させること のできる方法があれば嬉しいのですが 説明不足の感ありですが おしえてください