Excel2007VBA 日付の加算について

このQ&Aのポイント
  • Excel2007VBAを使用して、コピー元のシートの特定セルに入力されている日付に対して加算を行い、その加算した日付をシート名とコピー先のシートの特定セルに入力する方法について質問です。
  • 具体的には、コード「Worksheets(i + 1).Name = mydate」の部分でエラーが出てしまいます。ご教示いただけると幸いです。
  • このコードは週単位の報告書を作成するためのもので、コピー元のA3セルには表示上は9/16となっていますが、セルの書式設定上は3/14となっており、ロケールは日本語です。
回答を見る
  • ベストアンサー

Excel2007VBA 日付の加算について

●質問の主旨 コピー元のシートの特定セル(A3セル)に入力されている日付に対して 加算を行い、その加算した日付をシート名とコピー先の シートの特定セルに入力するためにはどうすればよいでしょうか? 具体的には下記のコードをどのように書き換えればよいでしょうか? 「Worksheets(i + 1).Name = mydate」のところでエラーが出てしまいます。 ご存知の方、ご教示願います。 ●コード Sub 一週更新() Application.ScreenUpdating = False Dim i As Integer Dim mydate As Date '既存のシート数を取得 i = ThisWorkbook.Worksheets.Count '最終シートをコピーして後ろに挿入 Worksheets(i).Copy after:=Worksheets(i) 'mydateは最終シートのA3セルに入力されている日付の1週間後の日付とする mydate = DateAdd("ww", 1, Worksheets(i).Range("A3")) '追加したシートのシート名はmydate2の日付とする Worksheets(i + 1).Name = mydate '新しく作成したワークシートについて以下の処理を行う With ActiveSheet Range("A3") = mydate Range("A12").ClearContents Range("A19").ClearContents Range("A26").ClearContents Range("A32").ClearContents End With Application.ScreenUpdating = True End Sub ●補足 上記コードは週単位の報告書を作成するためのコードです。 コピー元のA3セルは表示上は9/16となっており、 「セルの書式設定上」は「日付」→「3/14」, ロケールは日本語です。 私はVBA初心者です。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

シートタブにスラッシュ(/)は許容されませんので、別に文字列に変更して下さい。 例えば、m月d日とすると、Worksheets(i + 1).Name = Format(mydate, "m月d日")で変更できますが如何でしょうか。

dradra33
質問者

お礼

mu2011様 先日に引き続きご回答ありがとうございます。 Worksheets(i + 1).Name = mydateを Worksheets(i + 1).Name = Format(mydate, "m月d日")に 換えたらシート名、コピー先のセルの日付が加算できました。 ありがとうございます。

その他の回答 (2)

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

何処の行でエラーになったかぐらい質問に書くこと。 そうすればおおよそのエラーの事態はわかるはず。 シートの名前付けでエラーが出ているのでは。 また標題の「日付の加算について」でエラーではなかろう。標題がおかしい。 Sub test02() mydate = DateAdd("ww", 1, Worksheets(1).Range("A1")) MsgBox mydate End Sub などでどういう結果になるか分かるだろう。 Sub test02() mydate = DateAdd("ww", 1, Worksheets(1).Range("A1")) MsgBox mydate Sheets(4).Name = mydate End Sub をやると相応食え悪しくエラーメッセージが出る。だから判ると思うが、判らなければそういう主旨の質問をすること。 ーー 名前の受け方が禁止事項のようで Sub test03() i = 4 mydate = DateAdd("ww", 1, Worksheets(1).Range("A1")) mydates = Replace(mydate, "/", "") MsgBox mydates Sheets(4).Name = mydates End Sub で旨くいくだろう。 ーー (余談)日付数字だけでも文字列となり、OKのようだが、普通はシート名の前部分に報告20110919のように内容暗示文句を入れるのでは。 ーー 直ぐ自分の作ったコードを貼り付けて他人に頼むのではなく、自分で色々変えたりしてやってみて、焦点を絞ること。 それが勉強になる。

dradra33
質問者

お礼

imogasi様 いつもご回答ありがとうございます。 コードの記述及びプログラム作成時のコツについても 教えていただきありがとうございます。 今後のVBA学習の参考とさせていただきます。

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

変数iってそのブックが持つワークシートの数を一番最初に入れてますよね。 それに1をたしたらブックが持っているワークシートの数以上になってしまってエラーになってるんじゃないんですか? ワークシートを追加するコードをその前に入れておけば良いのでは?

dradra33
質問者

お礼

suzukikun様 ご回答ありがとうございます。 suzukikun様のアドバイスは、 今後VBAの学習の参考とさせていただきます。

関連するQ&A

  • EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのです

    EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのですが、どのように行えばいいのでしょうか? Sheet1のA1からA300まで、関数によって計算されたデータが格納されています。 そのA1からA300の値(関数の計算結果のみ)を、コマンドボタンをクリックした時にSheet2のA1からA300にコピーしています。 コマンドボタンをクリックする度に、Sheet1のA1からA300までの値を、Sheet2に列を変えてコピーし、値を蓄積する方法を取っています。 以下のマクロを記述して走らせてみましたが、動作が遅いのが気になります。 コピーして貼り付けている動作が遅くなっているのでしょうか? もう少し早くなる方法はありますでしょうか? よろしくお願いします。 Sub CommandButton1_Click1() Dim I Dim N Worksheets("sheet1").Range("F1").Value = Range("F1").Value + 1 N = Worksheets("sheet1").Range("F1").Value For I = 1 To 300  Application.ScreenUpdating = False   Worksheets("sheet1").Cells(I, 1).Copy   Worksheets("sheet2").Cells(I, N).PasteSpecial Paste:=xlValues  Application.ScreenUpdating = True Next End Sub

  • Excel VBAでの質問

    以前、質問に回答頂きそれを実行してうまくいったのですが、 特定のsheetだけsheetのつくりが違うため、 このsheetは毎回なにも処理をしないという処理を加えたいのですが、 (例えばsheet5とsheet8は処理をしない) 下記のコードにどのように付け加えればよいでしょうか? わかるかた宜しくお願い致します。 Dim i As Long For i = 1 To Worksheets.Count  If Worksheets(i).Range("A1").Value = 10 Then Worksheets(i).Range("K1") = Worksheets(i).Range("A1")  Worksheets(i).Range("A1:D80").ClearContents Next End Sub

  • エクセルVBAでの日付表示

    エクセル2002使用です。 すみませんが、よろしくお願いします。 変数で取得した値で、「H16.9.14」のようにセルに入れたいのですがうまくいきません。 sub 和暦() Dim myyear,mymonth,mydate myyear = 16 mymonth = 9 mydate = 14 range("A1").Value ="H" & myyear&"."&mymonth&"."&mydate End sub range("A1")の右辺をいろいろと調べて試したのですがうまくいきません。また、H16.9.14と入力できた場合も文字列ではなく日付表示書式として扱いたいです。 よろしくお願い致します。

  • コピペマクロを高速化したい(Excel)

    見よう見まねで以下のようなコードを書いてみたのですが、 これだと表示にやや時間がかかるので改善したいです。 ------ Sub コピペ() Dim i As Long i = Range("A1") Range("C12").Value = Worksheets("sheet2").Cells(i, 2).Value Range("D12").Value = Worksheets("sheet2").Cells(i, 3).Value Range("E12").Value = Worksheets("sheet2").Cells(i, 4).Value Range("F12").Value = Worksheets("sheet2").Cells(i, 5).Value Range("G12").Value = Worksheets("sheet2").Cells(i, 7).Value ------ こんな感じでコピペしたい値があと15個くらいあります。 コピー元とコピー先のセル配置には法則性があまりありません。 よろしくお願いします。

  • Execl2007のVBAの質問です

    度々申し訳ありませんが、何卒またお教えください。 下記の様なコードを書いたのですが、 オートフィルタの解除ができません。 何故なんでしょうか? ちなみに、ある任意の日付の行だけを抽出して 別のシートにコピー・プリントアウト を自動化するマクロを作りたいと思っています。 他にもコードに問題などありましたら 指摘いただけると幸いです。 よろしくお願いします。 ---------------------------------------------------------------- Sub macro2() 'macro test 2 Dim yyyymmdd As Date yyyymmdd = InputBox("印刷したい日付を入力して下さい。", "印刷日入力") With Worksheets("結果") .ListObjects("リスト1").Range.AutoFilter Field:=1, Criteria1:=yyyymmdd .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("貼り付け用紙").Range("A1") End With 'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" Worksheets("結果").AutoFilterMode = False Application.CutCopyMode = False Worksheets("貼り付け用紙").Range("A1:AM100").ClearContents End Sub

  • 日付の表示について

    im myDate As Date myDate = TextBox1.Text Sheet1.Range("B1").Value = myDate Sheet1.Range("B1").NumberFormatLocal = "m" *********************************************** 上のようにTextBoxで入力された日付で、 1日≦myDate>25日の場合は(例:12/10)⇒ セルB1には「12月」と表示 25日≦myDate≧31日の場合は(例:12/25)⇒ セルB1には「1月」と表示 させたいのですが、どのようにしたらよいのでしょうか。

  • Excel2007 VBA 最終行の特定セルの取得

    ●質問の主旨 A列の入力を欠いた最終行の特定セルの取得及び転記について ご教示ください。 ●質問の詳細 下記の要領で現金出納帳を作成しています。 1. 項目は以下の通りです。  A     B     C      D   E        F 日付 摘要1 摘要2 収入金額  支出金額 残高金額 2. 下の行に向かって1.の具体的内容を入力していきます。 3. 同じ日に複数の項目がある場合、その日の先頭項目のみA列に 日付を入力し、2番目の項目には、日付を入力しない。 4. 当月の一番最後に入力されている項目のF列の残高金額をもって、 次月の残高(繰越残高)とする 5. 当月の残高(繰越残高)は、雛型シートを用意し、 そのシートのF3セルに入力する。 ※ 一日に必ず複数の項目を入力するため、最終行には 日付の入力を欠いていることがほとんどです。私案のコードでは 「最終日」の1番目の残高は拾えても、「最終日」の最終行を 拾うことができません。コードをどのように書き換えたらよろしい でしょうか? ●私案のコード Sub 繰越_Click() Dim i As Integer '既存のシート数を取得 i = ThisWorkbook.Worksheets.Count '最終シートをコピーして後ろに挿入 Worksheets(i).Copy after:=Worksheets(i) '月リストからシート名を取得してシート名変更 Worksheets(i + 1).Name = Sheets("月リスト").Cells(i + 1, 1).Value '新しく作成したワークシートについて以下の処理を行う With ActiveWorksheets '当月の残高を次月に繰り越す (残高が記入されている最終行,F列の値を次月シートのF3セルに代入する) Range("F3") = Worksheets(i).Range("A1045876").End(xlUp).Offset(0, 5).Value End With End Sub 使用機種はWindouws Vista Excel2007です。当方はVBA初心者です。   

  • Excel2003のVBAで教えてください

    以下のようなコードのプログラムを書いています。 使用しているシートは、"data"と"入力"という2つのシートです。 "入力"シート上で入力したデータを"data"シート上に追加していく予定です。 しかし、どうしても、"入力"シート上にペーストされてしまい"data"シート上にペーストすることができません。 Range("A" & z + 1).PasteSpecial Paste:=xlPasteValues が問題だとおもうのですが、これを Range("data!A" & z + 1).PasteSpecial Paste:=xlPasteValues と変更すると、実行時エラー1004になってしまいます。 アドバイスお願いします Private Sub CommandButton1_Click() Dim n As Integer Dim z As Long n = WorksheetFunction.CountA(Range("b9:b23")) Range("b51:f" & 51 + n - 1).Copy Set data = Worksheets("data").Range("A1") z = data.Rows.Count Sheets("data").Select Range("A" & z + 1).PasteSpecial Paste:=xlPasteValues MsgBox "登録しました" End Sub

  • Excel VBA 日付の認識など

    こんにちは。 VBA初心者のものですが質問させていただきます。 ※エクセル2003です 「sheet1のD4:FA4のうち、09年8月以外の日付のセルすべてを選択する」 の構文を下記のように作ってみたのですがうまくいきません・・・ (1)「09年8月」の認識 (2)「~以外のセル全て選択」 の2点がネックで困っています。 ちなみに日付のセルには「2009/8/5」のように入力されており、 表示は「09/8/5」です。 すみませんがご教示お願いいたします。 Sub Macro1() Dim 日付 As Range For Each 日付 In Worksheets("sheet1").Range("D4:FA4") If 日付.Value like"*09/8/*"= false Then 日付.select End If Next End Sub

  • 2つのvbaを統合したい

    はじめまして、vba初心者のものです。 よろしくお願いします。 以前こちらに質問させて頂いたことがあります。 その以前質問して回答して頂いた2つのソースを一つに統合したいです。 1、参照元ブックと貼り付けブックの2つが存在します。 2、参照元ブックの名前の指定する必要はあると思いますが、 貼り付け先ブックは新規作成にしたいです。 3、「▼質問タイトル:vba ブック間でシート名のコピーをするには」の動作は、 貼り付け先ブックの各シートに反映されるようにしたいです。 何卒よろしくお願いします。 「▼質問タイトル:vba ブック間でシート名のコピーをするには」 http://okwave.jp/qa/q8727280.html sub macro1()  dim wb1 as workbook  dim w2 as worksheet  dim i as long ’2つのブックは既に開いている事  set wb1 = workbooks("オリジナルブック.xlsm") ’拡張子まで正しく指定する事  set w2 = workbooks("貼り付け先ブック.xlsx").worksheets(1) ’同上 ’準備  w2.range("A:A").clearcontents  w2.range("A:A").numberformat = "@"  w2.range("A1") = "シート名一覧" ’転記  for i = 1 to wb1.worksheets.count  if wb1.worksheets(i).name = "Sheet1" then exit for  w2.range("A65536").end(xlup).offset(1) = wb1.worksheets(i).name  next end sub 「▼質問タイトル:セルの項目をシート名にしたい」 http://okwave.jp/qa/q8727637.html sub macro1()  dim h as range  dim s as long, i as long  s = worksheets.count + 1 ’シートを作る  for each h in range("C3:B" & range("C65536").end(xlup).row)  worksheets.add after:=worksheets(worksheets.count)  activesheet.name = h.value  next ’別のブックにする  for i = worksheets.count to s step -1  worksheets(i).select false  next i  activewindow.selectedsheets.move end sub

専門家に質問してみよう