• ベストアンサー

エクセル:ワークシートを自動で生成&ワークシート名を自動で割り振り

こんにちは はじめまして エクセルのワークシートを自動で生成するやり方を教えていただけますでしょうか。 やりたいことは以下の通りです。 何件かお店がありまして、毎日の売り上げ報告がファックスで本部に送られてきます。 そのファックスを見ながら、本部ではエクセルに入力し合計と累計を出すようにしています。 今現在は雛形ワークシートを一つ作り、手動でワークシートを30,31日分をコピーし、ブックには「店舗A2006年3月度分.xls」というようなブック名で保存してあります。 うちの会社は10日締めなので、3月で言うと、20060311から20060410(←数字は西暦)までのワークシートを作ります。 ワークシートのイメージとしてはこんな感じです。↓ シート名:店舗A.xls ワークシート名:「雛形」 ---------------------------- 当日の日付 商品A 単価 ○個 小計 商品B 単価 ○個 小計     ・     ・           当日の合計 ---------------------------- そしてこれの「雛形」を、自動で一か月分ワークシートをコピーするようにしたいのです。(今は手動でやってます) VBAの本を読んで、For~Next分を使うと、指定した枚数コピーできることはわかったのですが、ご承知の通り30日の月もあれば31日の月もありまして、これを計算で自動に判断するようにできないでしょうか? 欲を言えば、さらにそのワークシート名も自動で「A店舗20060311」というように日付ごとのワークシート名を入れられるようになると助かります。 もっと欲を言えば、各ワークシートの特定のセルに当日の日付を入れてるのですが(セル番地はどこでもいいです)、そこの日付も、ワークシート名と連動して自動で入れられると助かります。 長文になってしまいましたが、どなたか教えていただけると助かります。 よろしくお願いいたします。

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

  • ベストアンサー
  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.3

申し訳ありません。会社で、サンプルを作成して、帰宅時間になったので、あまり確認せずに、提示してしまいました。 今は、自宅で、再度確認し、修正版を提示いたします。 Dim tmp_dat5 As Date Dim tmp_dat6 As Integer Dim cnt As Integer Dim max As Integer Dim nen As Integer Dim getu As Integer Dim sname As String Dim tmp_day As String Dim tmp_getu As String Dim shop As String nen = Sheets("Work").Range("A1").Value getu = Sheets("Work").Range("B1").Value If getu = 12 Then nen = nen + 1 getu = 1 Else getu = getu + 1 End If tmp_dat5 = DateValue(nen & "/" & getu & "/01") tmp_dat5 = tmp_dat5 - 1 tmp_dat6 = Day(tmp_dat5) shop = Sheets("Work").Range("A2").Value nen = Sheets("Work").Range("A1").Value getu = Sheets("Work").Range("B1").Value tmp_getu = Right("0" & getu, 2) For cnt = 11 To tmp_dat6 tmp_day = Right("0" & cnt, 2) sname = shop & nen & tmp_getu & tmp_day Sheets("雛形").Select Sheets("雛形").Copy Before:=Sheets("雛形") ActiveSheet.Name = sname Sheets(sname).Range("L1").Value = nen & "/" & tmp_getu & "/" & tmp_day Next cnt nen = Sheets("Work").Range("A1").Value getu = Sheets("Work").Range("B1").Value If getu = 12 Then nen = nen + 1 getu = 1 Else getu = getu + 1 End If tmp_getu = Right("0" & getu, 2) For cnt = 1 To 10 tmp_day = Right("0" & cnt, 2) sname = shop & nen & tmp_getu & tmp_day Sheets("雛形").Select Sheets("雛形").Copy Before:=Sheets("雛形") ActiveSheet.Name = sname Sheets(sname).Range("L1").Value = nen & "/" & tmp_getu & "/" & tmp_day Next cnt

mac20060406
質問者

お礼

お忙しい中、お手数おかけしました。 返事遅くなりまして大変申し訳ありません。今戻ってまいりました。 そしてこの修正版はとってもばっちりです! 完璧です。 本当にありがとうございました。 さっそく4月10日から使用させていただきます。 重ね重ねまことにありがとうございます。 なるべく自力で解決いたしますが、今後またおてを煩わせる事がございましたら、よろしくお願い申し上げます。

その他の回答 (4)

  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.5

#1です。 こんな感じでいかがでしょう? BOOKがあるフォルダと同じ場所に店舗のBOOKを作成します、 Sub test() Dim TheMonth As Integer Dim TheYear As Integer Dim days As Integer Dim ws_name As String Dim i As Integer Dim strTenpo As String TheYear = InputBox("年を数字で入力してください。") TheMonth = InputBox("月を数字で入力してください。") strTenpo = InputBox("店舗を入力してください。") Application.ScreenUpdating = False ' その月の日数を求める days = DateSerial(TheYear, TheMonth + 1, 10) - DateSerial(TheYear, TheMonth, 11) ' 'シートコピー ' Dim j As Integer Dim wb As Workbook Set wb = Workbooks.Add ThisWorkbook.Worksheets("雛形").Copy before:=wb.Worksheets(1) j = 11 For i = 1 To days + 1 wb.Worksheets("雛形").Copy before:=wb.Sheets("雛形") 'シート名 With ActiveSheet .Name = strTenpo & Format(DateSerial(TheYear, TheMonth, j), "yyyymmdd") .Cells(1, 1) = Format(DateSerial(TheYear, TheMonth, j), "yyyy/mm/dd") End With j = j + 1 Next i ' '不要なシートを削除 ' Dim ws As Worksheet Application.DisplayAlerts = False For Each ws In wb.Worksheets If ws.Name = "雛形" Or _ InStr(ws.Name, "Sheet") > 0 Then ws.Delete End If Next Application.DisplayAlerts = True ' '作成したBook保存 ' wb.SaveAs ThisWorkbook.Path & "\" & strTenpo & Format(DateSerial(TheYear, TheMonth, 1), "yyyymm") wb.Close Application.ScreenUpdating = True End Sub

mac20060406
質問者

お礼

わざわざ再度作っていただきまして、全く恐縮でございます。 色々なやりかたがあるのですねぇ・・・ ばっちり動きました。 気持ち良いくらいにぼこぼこできました。 まことにありがとうございます。 自分には到底できそうにもないことですが、これを機にVBAの勉強を始めたいと思います。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

Sub test01() Application.ScreenUpdating = False m = 5 For i = 11 To Day(DateSerial(2006, m + 1, 1) - 1) If i = 11 Then bsn = "Sheet1" Else bsn = sn End If sn = "A店舗" & Format(DateSerial(2006, m, i), "yyyymmdd") Workbooks("Book1").Activate Sheets("雛形").Select Sheets("雛形").Copy Before:=Workbooks("Book2.xls").Sheets(bsn) ActiveSheet.Name = sn Next i '---- For i = 1 To 10 bsn = sn sn = "A店舗" & Format(DateSerial(2006, m + 1, i), "yyyymmdd") Workbooks("Book1").Activate Sheets("雛形").Select Sheets("雛形").Copy Before:=Workbooks("Book2.xls").Sheets(bsn) ActiveSheet.Name = sn Next i Application.ScreenUpdating = True End Sub 2006年、5月次、A店舗の例です。月はINPUTBOXでとるとか、A店舗以外も含めForNextで繰り返すかINPUTBOXでとることを考え修正してください。 Book1に雛形、Book2を開いておいて実行のこと。Book2に望みのシートができます。

mac20060406
質問者

お礼

ありがとうございます。 皆様のおかげで、無事解決することができました。 わたしも、何らかの形で貢献できるようにがんばります。 お忙しい中お手を煩わせまして、大変ありがとうございました。

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.2

Dim tmp_dat5 As Date Dim tmp_dat6 As Integer Dim cnt As Integer Dim max As Integer Dim nen As Integer Dim getu As Integer Dim sname As String Dim tmp_day As String Dim tmp_getu As String Dim shop As String nen = Sheets("Work").Range("A1").Value getu = Sheets("Work").Range("B1").Value If getu = 12 Then nen = nen + 1 getu = 1 Else getu = getu + 1 End If tmp_dat5 = DateValue(nen & "/" & getu & "/01") tmp_dat5 = tmp_dat5 - 1 tmp_dat6 = Day(tmp_dat5) shop = Sheets("Work").Range("A2").Value nen = Sheets("Work").Range("A1").Value getu = Sheets("Work").Range("B1").Value tmp_getu = Right("0" & getu, 2) For cnt = 11 To tmp_dat6 tmp_day = Right("0" & cnt, 2) sname = shop & nen & tmp_getu & tmp_day Sheets("雛形").Select Sheets("雛形").Copy Before:=Sheets("雛形") ActiveSheet.Name = sname Sheets("雛形").Range("C5").Value = Sheets("Work").Range("A1").Value & "/" & Sheets("Work").Range("B1").Value & "/" & tmp_dat Next cnt nen = Sheets("Work").Range("A1").Value getu = Sheets("Work").Range("B1").Value If getu = 12 Then nen = nen + 1 getu = 1 Else getu = getu + 1 End If tmp_getu = Right("0" & getu, 2) For cnt = 1 To 10 tmp_day = Right("0" & cnt, 2) sname = shop & nen & tmp_getu & tmp_day Sheets("雛形").Select Sheets("雛形").Copy Before:=Sheets("雛形") ActiveSheet.Name = sname Sheets("雛形").Range("C5").Value = Sheets("Work").Range("A1").Value & "/" & Sheets("Work").Range("B1").Value & "/" & tmp_dat Next cnt これでいかがでしょうか? 「Work」シートのA1に年、B1に月、A2に店舗名を 入れてくださいね。

mac20060406
質問者

お礼

すばやいご回答まことにありがとうございます。 しかし短時間でこんなに複雑なVBAを書いていただきまして本当に敬服いたします。 早速試させていただきました。 めちゃめちゃちゃんと動いてます! 本当にありがとうございます。 それと、もしお時間ございましたらご質問させていただきたいのですが、ワークシートを生成した後「C5」セルに日付が入る仕様になっていると思うのですが、それをわたしのほうで「L1」セルに書き込むように、上記のVBAの32行目と末尾から3行目の「C5」を「L1」に書き換えて実行しました。 そのせいなのか、日付の表示が全てのワークシートで「2006/02」となってしまいます。 「Work」ワークシートのA1には2006、A2には店舗名、B1には2、と入れてあります。(B1を2にしたのは、28日までしかないので、確認がしやすかった為です) もし書き換えていけない部分を書き換えてしまったのでしたらご指摘いただけると幸いです。 (もしご迷惑でなければで結構です) お忙しい中、お手を煩わせて大変ありがとうございました。

  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.1

お疲れ様です。 えいや!で作ったのですが参考になりましたら幸いです。 雛形というシートを用意してご利用ください。 ファイルの保存については、また後ほどに、時間があればご協力させていただきます。 (別BOOKの作成が手間なのでorz) Sub test() Dim TheMonth As Integer Dim TheYear As Integer Dim days As Integer Dim tenpo As String Dim ws_name As String Dim Strdays As String Dim i As Integer TheYear = InputBox("年を数字で入力してください。") TheMonth = InputBox("月を数字で入力してください。") ' その月の日数を求める days = Day(DateSerial(TheYear, TheMonth + 1, 1) - 1) For i = 1 To days 'シートコピー Worksheets("雛形").Copy before:=Sheets("雛形") '日数補完 If i < 10 Then Strdays = i Else Strdays = "0" & i End If 'シート名決定 ActiveSheet.Name = TheYear & TheMonth & Strdays Next i End Sub

mac20060406
質問者

お礼

お忙しい中、わざわざご回答くださいまして誠にありがとうございます。 年と月をボックスに入力できるのは、とても思いつかないアイデアでした! 大変参考になりました。重ねて御礼申し上げます。

関連するQ&A

  • ワークシートを自動でコピー&ワークシート名を自動変更

    こんにちは はじめまして エクセルのワークシートを自動でコピーするやり方を教えていただけますでしょうか。 やりたいことは以下の通りです。 週報のマスターがありまして、1ファイルで1週間分である5シート、マスターからコピーしています。 今現在は雛形ワークシートを一つ作り、手動でワークシートを5日分をコピーし、ファイル名は「名前2008年6月23日-2008年6月27日.xls」という名前で保存してあります。 週報なので、ワークシート1つに月日を入れており、シート内のA1にも年月日を入れております。 ワークシートのイメージとしてはこんな感じです。↓ シート名:週報マスター.xls ワークシート名:「雛形」 ---------------------------- 2008年**月**日 勤務時間: 作業内容: ・・ ・・ ・・ ---------------------------- そしてこれの「雛形」を、自動で1週間分(5ワークシート)、ワークシートをコピーするようにしたいのです。(今は手動でやってます) WebでVBAの記事を読んで、指定した枚数コピーできることはわかったのですが、A1セルに日付を入れ、日付ごとのワークシート名をつける、 その週をどう指定するのかが不明です。 長文になってしまいましたが、どなたか教えていただけると助かります。 よろしくお願いいたします。

  • EXCEL シート名の保護

    EXCEL シート名の保護 雛形となるワークシートを毎月コピーして使っているのですが、よくコピーを忘れて、気がついたら雛形シートに書き込んでしまっているミスが多発しています。 コピーした月毎のシートは、その後シート名をその月にし、マクロを実行するとその月の日付など細かな書式の変更が行われます。 マクロは、シート名がその月になっていないとエラーが出ます。にも関わらず雛形が書き換えられるということは、このミスを犯した人は、シートのコピーは忘れたけれどもシート名の書き換えは忘れなかったということです。(だったら、自分が書き換えようとしているシートの名前を見て気づけよ・・・) そこで、雛形シートのみ、シート名が書き換えられないようにすることは出来るでしょうか? とりあえず、   「ツール」→「保護」→「シートの保護」 を試みたのですが、保護項目を全てチェックしても、シート名の保護は出来ませんでした。 よろしくお願いします。

  • Excelのワークシートを自動生成2

    こんにちは、 昨日、ワークシートの自動生成方法を教えて頂いたものです。 皆様からの回答で逆にやりたいことがはっきりしたので再度質問させてください。 ExcelでSheet1のA列の1行目、2行目・・・入力最終行までの各行の文字を ワークシート名にした新しいブックを、自動生成したいです。 昨日は作成するワークシート数を指定しましたが 作成ワークシート数が変わることも想定したく思います。 ご教授のほど、何卒よろしくお願いします。ト

  • 変化するワークシート名にハイパーリンクで移動したい

    いつもお世話になります。 下に示す 左の月間シートのD6に月数を入れるとA4以下の日付が変わり、 右の日付シートのA1の日付も同時に変更されます。 それにともなって、ワークシートの名前が「**日」と月が変わるごとにシート名も 変わるようにしました。 しかし、左のシートのA列の「*月*日」の日付をクリックするとその日付に移動するように ハイパーリンクを設定していましたが、今の設定では、ワークシート名が変わるとリンクができなくなります。 もともと、毎月の締めの関係で、21日~月末~20日の順に左の月間ページのA列は並んでいる関係上、2月と3月の様にに日数が変わると途中で月末が来るので月初である1日以降の日付と日付シートが合わなくなるので、シート名を固定の連番(1~31)にし、左の月間シートの日付をクリックしてそのページに移動するようにしていました。しかし、ワークシート名が日付に合わせて、自動で何とか変えることが出来たので、日付とワークシート名が一致したのは良かったのですが、日付をクリックしてその日のシートに移動するという便利のいいことが出来なくなったという次第です。 ハイパーリンクを諦めるか、シート名を変えるのを諦めるのかどちらかしかないのでしょうか? 何か良い方法は無いものでしょうか? どうか、お知恵を拝借させて下さい。 よろしくお願いいたします。

  • Excelのワークシートを名前を指定してマクロで自動生成

    ExcelでSheet1のA1からA20のセルに入力されている文字を ワークシート名にした新しいワークシートを20枚、 マクロで自動生成したいです。 ご教授のほど、何卒よろしくお願いします。

  • シート名を自動でつけたいのですが、助けてください

    大変困っておりまして、どなたか教えていただけませんでしょうか。 エクセル2003の1ファイルの中に sheet1 原稿というシート、2シートがあります。 1.sheet1 A1のセルに店舗の名前が入力されています。  店舗数は 40店舗あります。 2.原稿というシートをコピーして名前を変更していますが、店舗数が多いので、  名前を自動的にシート名に表示したいのです。 似たような質問が出ていたのですが どうも上手く出来ません。 急を要しておりまして、どなたか簡単に出来る方法を教えてください。

  • Excelで指定したワークシートを開かせたい

    Excelで指定したワークシートを開かせたいのですが、方法がわかりません。お知恵をお貸しください。 Excelを開いたときにメッセージボックスで開きたい日付のワークシートを指定して開かせるようにしたのですが方法がわかりません。 Excelのファイルは次のようになっています。 ワークシートは、1~31まで31のシートがあります。 Excelファイルを開いたときにどのファイルを開くか訪ね、該当するシートを開きたい。 日付入力が、「07月02日」ならワークシート名の2を、「07月05日」ならワークシート名の5を開かせたいのですが、方法がわかりません。 申し訳ありませんが、お力をお貸しください。

  • Excelのマクロを使ってワークシート1にワークシート2のセルの値をコ

    Excelのマクロを使ってワークシート1にワークシート2のセルの値をコピーするマクロを作りたいと思っています。 例えば、ワークシート2のA1~A30のセルには1~30の値が順に入っているとします。 それをA1から3の倍数分、つまりA1,A3,A6,A9,・・・,A27,A30の値を ワークシート1のA1~A11のセルに自動で挿入してくれるマクロってどう作ればいいのでしょうか? わかりにくいかもしれませんが、よろしくお願いします。

  • エクセルで、ワークシート名をセルから参照する

    エクセルで、ワークシート名をセルに表示する方法は書いてありますが、セルの値をワークシート名とするにはどうしたらいいでしょうか。 つまり、 「ワークシート名 → セル」 ではなく、 「セルの値 → ワークシート名」 ということです。 現状、会社が変わると決算期が変わるため、決算期を変更する度にワークシート名を変えていますが、変わった都度ワークシート名を手で変更するのは手間が掛っています。 具体的には、例えば、 3月決算の会社のファイルは、4月シート、5月シート・・・ 12月決算の会社は、1月シート、2月シート・・・ のようにシート名を変えています。 そのため、セルに決算期を入力すると、自動で各ワークシート名も変更するようにしたいのですが、どうしたらいいでしょうか。 そういう関数はないようですし、マクロ・VBAの本等を見ても、よくわかりません。 宜しくお願い致します。

  • VBAでワークシートの操作を制御する。

    はじめまして。 最近、VBAの勉強を始めたばかりの初心者です。 どうかご教授くださいますようお願いします。 ■内容: 現在、職場の従業員出勤表を作成しています。 ひと月分の出勤表を、1シートに任意の名前を付け、1ファイルで管理しようと考えています。 そこでお教え頂きたい事は‥ シート「出勤表雛形」で出勤表を作成後、同シートに配置したフォームボタン(保存ボタン)に 以下4点の機能を持たせたいと思っております。 (1):シート「出勤表雛形」の"A1セルの値"(出勤表対象年) & "A3セルの値"(出勤表対象月)で ワークシート名を取得すると同時に、同ファイルに重複シート名が無いか確認する。 (2):重複シート名があれば、「対象の出勤表は既に作成済みです。」のメッセージを表示し、保存を中止する。 (3):重複ワークシート名が無ければ、シート(出勤表雛形)をシート最後尾にコピーし、 "A1セルの値" & "A3セルの値"でシート名を付けてフィル(出勤表.xls)を上書き保存する。 (4):(3)のシート上の保存ボタンで改め保存する場合は、ファイル(出勤表.xls)を上書き保存する。 ※後に訂正が生じた場合の為。 ※下記に現状で分かる範囲の構文を書きました。 (4)に関しては、自身でも調べてみましたが分かりませんでした。 また、不要、不足の部分が多々あり、大変見にくい構文かも知れませんがご参考までに見て頂ければと幸いです。 --------------------------------------------------------------- Sub ボタン保存_Click() '(1)新規に作成するシート名の重複確認 Dim ws As Worksheet, flag As Boolean  For Each ws In Worksheets If ws.Name = Range("A1").Value & Range("A3").Value Then flag = True Next ws If flag = True Then  '(2)重複シートありのメッセージ表示 MsgBox "対象の出勤表は既に作成済みです。", vbInformation  Else '(3)出勤表雛形ワークシートをコピーしてシート名の取得&保存  sheets("出勤表雛形").Copy After:=sheets(sheets.Count) sheets("出勤表雛形(2)").Select sheets("出勤表雛形(2)").Name = sheets("出勤表雛形(2)").Range("A1").Value & Range("A3").Value ThisWorkbook.Save endif end sub --------------------------------------------------------------- 以上。

専門家に質問してみよう