12か月分の日付データを繰返し記入したい

このQ&Aのポイント
  • マクロを使用して、12か月分の日付データを繰り返し記入したい場合について質問があります。該当のマクロが正常に実行されないため、修正が必要です。
  • 実現したい処理は、指定された範囲のセルに12か月分の日付データを記入することです。具体的には、特定の列に指定された日付を入れ、その下に12か月ごとの日付を繰り返し入力します。
  • マクロの記述に誤りがあり、正常に処理されない理由がわかりません。具体的な修正方法や注意点について教えていただけると助かります。
回答を見る
  • ベストアンサー

12か月分の日付データを繰返し記入したい

下記動作を実現したくマクロを書いてみましたが、正常に処理できません。 修正が必要な箇所&修正方針について、知識のある方からご助言いただけますと幸いです。。 <実現したいこと> ・sh2のV列(2行目~)に対し、 2019/4/1 2019/5/1 … 2020/3/1 と12行書き込む処理を、(sh1の2~最終行)回行う ※最終的に、sh2のV列は、先頭行の下に、(sh1の2~最終行)×12行できる想定 <正常に動かなかった記述> Sub V列の処理() Dim sh1 As Worksheet, sh2 As Worksheet Dim r As Long, i As Long Application.ScreenUpdating = False Set sh1 = Worksheets("元シート") Set sh2 = Worksheets("集計用シート") '2から最終行まで12行おきの繰り返しです For r = 2 To sh1.Cells(Rows.Count, 1).End(xlDown).Row Step 12 'まず、V列の各1行目に4月の値を入れます sh2.Cells(r, 22) = "2019/4/1" 'したら、12か月分入れていきます For i = 1 To 11 sh2.Cells(r + i, 22) = DateAdd("m", i, Cells(r, 22)) Next i Next r Application.ScreenUpdating = True End Sub

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (7996/17095)
回答No.1

For r = 2 To sh1.Cells(Rows.Count, 1).End(xlDown).Row Step 12 を For r = 2 To sh1.Cells(Rows.Count, 1).End(xlUp).Row *12 Step 12 としてみたらどうでしょう。

samugetan-chan
質問者

お礼

ありがとうございます!こちらの方法でを参考にさせていただき、無事期待していた動作を実現できました。。

その他の回答 (1)

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

質問の意味と実現してほしい結果が、質問からでは伝わらない。 >、知識のある方からご助言い・・ というより、質問者は、コンピュター的に処理内容を文章で正確に書く訓練の方がずっと大切だと思う。問題そのものは多分VBAベテランでないと答えられないものではないと想像するから。 それと、結果例(値)とそれを出すセル(列、行)を例示・明示して質問すべきだ。 ーー 月初日だけ1年分(12日分、12行)シートに書くのは簡単。 R列R1からとして Sub test01() For i = 1 To 12 Cells(i, "R") = DateSerial(2020, i + 2, 1) Next i End Sub でできる。 >12か月分の日付 という意味があいまい。普通は356日分(365行)を想像するが。 ーー これを5年先までの分をセルに作りたいというのか? ーー それ以上の繰り返しの結果はあるのか。 それをどの列に出すのか。 ーー 手操作でもできる。VBAはマクロの記録をとればよい。 ーー 日付については、エクセルの考えは、特別(初心者には想像できない)な方法で扱っている。 その日付シリアル値のことをご存じ(勉強した)か。 上記の私のプログラムで、13月になる場面があるが、エクセルは、その13月を、12を引いて1月とし、年を1足してくれる(繰り上げ)など、VBAを経験しないとわからないと思う。

関連するQ&A

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • 対象のシートが3行目からになった修正について

    対象のシートが3行目からになってしまったのですが、修正したいのですが、どこを修正したらよいかが分からず、困っています。お教え頂けませんか。よろしくお願いします。初心者で申し訳ありません。 Sub 統合() Dim J As Long Dim r As Long Dim s As Long Dim Sh As Worksheet Dim MaxRow As Long Dim MaxCol As Long Dim MyArray As Variant Dim JoinSh As Worksheet Set JoinSh = Worksheets("統合") '統合シートを変数に格納 JoinSh.Cells.Delete 'すでに統合シートが存在する場合は一旦セルを削除 s = 1 '最大行を超えた場合次の統合シートを作成するための番号 For i = s + 1 To Worksheets.Count 'シートを統合シートの次~末尾までループ With Worksheets(i) '各月シート If J = 1 Then r = 1 '最初だけ項目も取得 Else r = 1 '最初以外は2行目から取得 End If MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '9列目で最終行を取得 MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column '1行目で最終列を取得 MyArray = Range(.Cells(r, 10), .Cells(MaxRow, MaxCol)) 'A1~データ末尾まで配列に格納 End With With JoinSh '統合シート MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 If MaxRow + UBound(MyArray) > Rows.Count Then '最大行を超える場合の処理 s = s + 1 '統合シートの番号を加算 Worksheets.Add Before:=Worksheets(s) '新規に統合シートを追加 ActiveSheet.Name = "統合" & s '名前が同じにならないように番号を追加 Set JoinSh = ActiveSheet '統合シートを変数に格納 MaxRow = JoinSh.Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 End If If .Cells(1, 1) = "" Then '最初だけ1行目から貼り付け Range(.Cells(1, 1), .Cells(UBound(MyArray), MaxCol)) = MyArray Else '最初以外は最終行の次に貼り付け Range(.Cells(MaxRow + 1, 1), .Cells(MaxRow + UBound(MyArray), MaxCol)) = MyArray End If End With Next i End Sub

  • VBA シート間の単一セルから結合セルへのコピー

    マクロについてご教授をお願いします。 ◆実現したい事 2枚のシート(XとY)が存在します。 コピー元:Xシート          コピー先:Yシート    B列                    B列 1行 商品1   コピペ→     1~3行結合 商品1  2行 商品2   コピペ→     4~5行結合 商品2 3行 商品3   コピペ→     6~8行結合 商品3   ・                    ・   ・                    ・   ・                    ・  最終行                  最終行 XシートのB列に1行ずつ、商品名が羅列されています。 YシートのB列には、3行結合(B1:B3)、(B4:B6)、(B7:B9)・・・空白セルがあります。 Xシートの商品名をYシートの結合セルにマクロを使って処理したいです。 ◆試した事 (1)結合を解除し、XからYへ範囲コピーしたが、YのB列に再び、商品毎に2行追加し、結合  2行追加する方法がわからず断念 (2).valueでXシートB1 = YシートB1を試みるができない ◆ここで詰まってます>< Dim X As Worksheet Dim Y As Worksheet Dim 最終行1 As Long Dim 最終行2 As Long Dim cp1 As Long・・・・Yシート行変数 Dim cp2 As Long・・・・Xシート行変数 Set X = Worksheets(1) Set Y = Worksheets(2) 最終行1 = Cells(Rows.Count, 2).End(xlDown).row 最終行2 = Cells(Rows.Count, 2).End(xlDown).row For cp1 = 1 To 最終行1 For cp2 = 1 To 最終行2 Step 3 sh1.Cells(cp1, 2).Copy Destination:= sh2.Cells(cp2, 2) Next Next みたいな感じにできればと、Copyを.valueなどにしてみたりと試してみましたが、 なかなかうまくいかず、3日くらい悩んでいます。 シンプルにやりたいのですが、なにか良い方法などあれば、 ご教授のほどお願い致します><

  • データの平均を1分値にまとめる方法・マクロ

    Windows7 Excel2007を使用しています。 ほぼ 1秒毎のデータの平均を1分値にしてまとめたいです。 しかし量が膨大すぎて、よいやり方をご存知であれば、教えて下さい。 データ形式は下記のようになっています。(列はIVまでありますので、端折ってます。) (時間 2011/9/2 9:19 は一つのセルです。) [LOGGING]     1 2 3 4 5 6 7 8 0 DATETIME     No ア イ ウ エ オ カ キ ク TIME  No ア イ ウ エ オ カ キ ク 2011/9/2 9:19 1 0 1 0 0 0 0 0 0 2011/9/2 9:19 2 0 1 0 0 0 0 0 0 2011/9/2 9:19 3 0 1 0 0 0 0 0 0 2011/9/2 9:19 4 0 1 0 0 0 0 0 0 2011/9/2 9:19 5 0 1 0 0 0 0 0 0 2011/9/2 9:19 6 0 1 0 0 0 0 0 0 2011/9/2 9:19 7 0 1 0 0 0 0 0 0 2011/9/2 9:19 8 0 1 0 0 0 0 0 0 2011/9/2 9:19 9 0 1 0 0 0 0 0 0 2011/9/2 9:19 10 0 1 0 0 0 0 0 0 2011/9/2 9:19 11 0 1 0 0 0 0 0 0 2011/9/2 9:19 12 0 1 0 0 0 0 0 0 2011/9/2 9:19 13 0 1 0 0 0 0 0 0 2011/9/2 9:19 14 0 1 0 0 0 0 0 0 2011/9/2 9:19 15 0 1 0 0 0 0 0 0 上の3行は無視します。 列EXの値に1/10を掛けて、それを1分毎に平均化したいです。 列FBの値に1/1000を掛けて、それを1分毎に平均化したいです。 WorkSheet1 にデータがあった場合、WorkSheet2に上記の平均化した値を表示したいです。 ネットを検索していると、下記に似たような質問と回答のサンプルコードがありました。 これを改良して作ることはできないでしょうか? データが膨大なので、是非マクロを使ってやってみたいと思っています。 www.excel.studio-kazu.jp/kw/20090528191508.html Sub SetAverage() Dim ws1 As Worksheet Set ws1 = Worksheets(1) Dim ws2 As Worksheet Set ws2 = Worksheets(2) Dim averageFormulaC As String Dim averageFormulaD As String averageFormulaC = "=AVERAGE(" & ws1.Name & "!C@S@:C@E@)" averageFormulaD = "=AVERAGE(" & ws1.Name & "!D@S@:D@E@)" Dim i As Long Dim lastRow As Long lastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row ws2.Columns("A:D").Clear ws2.Range("B1").Resize(lastRow, 1).NumberFormatLocal = "hh:mm;@" Dim startRow As Long startRow = 1 Dim currentMin As Long currentMin = Int(ws1.Range("B1").Value * 1440.001) Dim r As Long r = 1 For i = 1 To lastRow If currentMin <> Int(ws1.Cells(i + 1, "B").Value * 1440.001) Then ws2.Range("A" & r).Value = ws1.Cells(i, "A").Value ws2.Range("B" & r).Value = CDbl(currentMin) / 1440# ws2.Range("C" & r).Formula = Replace(Replace(averageFormulaC, "@S@", startRow), "@E@", i) ws2.Range("D" & r).Formula = Replace(Replace(averageFormulaD, "@S@", startRow), "@E@", i) r = r + 1 currentMin = CLng(ws1.Cells(i, "B").Value * 1440.001) startRow = i + 1 End If Next End Sub

  • EXCEL VBA: 次の処理のマクロボタン作成

    ConvertシートのA列にあるフルパス付きファイル名を B列から右方向に最大L列までパス区切り文字(\)で分割済みです。 (但し、1行目は見出し行) 列方向(横方向)の分割部分を、横_縦シートの5行目から行方向(下方向)にそのままの順番で配置換え テスト目的で以下のコードを考えて、1行分(i=2)は配置換え出来るのを確認しています。 ここから横_縦シートのどこかにマクロボタンを配置して クリックすると以下を処理したいです。 1)range(”A5”)以下の書き出し分を削除 > 次の書き出しに備える 2)i=3 として 次の書き出しを行う イメージとしては、1行分は配置換えして確認して、ボタンクリックで次を表示して確認を繰り返す ボタンに登録するコードを教えてください。 可能なら、前を表示や処理停止のボタンも作成したいと思っていますのでご指導下さい。 Sub フルパス分割() Dim tmp As Variant Dim Ln As Long, i As Long, ii As Long Dim ws1 As Worksheet, ws3 As Worksheet Set ws1 = Worksheets("Everything") Set ws3 = Worksheets("Convert") Ln = ws1.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Ln ws3.Cells(i, 1) = ws1.Cells(i, 1) tmp = Split(ws3.Cells(i, 1), "\") For ii = LBound(tmp) To UBound(tmp) ws3.Cells(i, ii + 2) = tmp(ii) Next Next End Sub Sub 並べ替え() Dim Ln As Long, i As Long Dim Worksheet, ws3 As Worksheet, ws4 As Worksheet Dim tmp As Variant Set ws3 = Worksheets("Convert") Set ws4 = Worksheets("横_縦") Ln = ws3.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Ln tmp = Split(ws3.Cells(i, 1), "\") ws3.Range(Cells(i, 2), Cells(i, UBound(tmp) + 2)).Copy ws4.Cells(i + 3, 1).PasteSpecial Transpose:=True Stop Next End Sub

  • 他のシートの任意の列に1行おきに表示する

    よろしくお願いします。 下の構文ですと Worksheets("入力")の3列目5行目以降のデーターが Sheet2の同じ列(3列目)5行目以降に1行おきに表示されます。 これを Worksheets("入力")の3列目5行目以降のデーターを Sheet2の7列目5行目以降に1行おきに表示したいのですが どのように書き直せばよいでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i As Long, j As Long j = 5 With Worksheets("入力") For i = 5 To .Cells(Rows.Count, 3).End(xlUp).Row .Rows(i).Copy Worksheets("Sheet2").Cells(j, 1) j = j + 2 Next i End With End Sub

  • 【VBA】Ifで他シートから検索しコピーする

    Excel vbaについて教えてください。 自分で作成したコードが、うまく動かず悩んでいます。 ●作りたいもの Sheet3のA列にある数字を検索値とし、 Sheet1のA列を検索し、合致する行のB列~最終列までコピーし、 Sheet3のB列から貼付する。 ※Sheet1にある列数(項目数)は不定です ●作成したマクロ Sub test() Dim sh1 As WorkSheet Dim sh2 As WorkSheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") d = sh2.Range("A1").End(xlDown).Row 'Sheet3検索値のA列のデータの最終行 g = sh1.Range("B1").End(xlToRight).Column 'Sheet1の最終列 k = 2 For i = 2 To d    'Sheet3最終行まで If sh1.Cells( i & "A") = sh2.Cells( 1,"A") Then '条件)Sheet1とSheet3のA列が合致 For j = 2 To g                      'Sheet1の最終列まで sh2.Cells( k , j ) = sh1.Cells( i , j ) 'Sheet1のB行から最終列をコピーしSheet3へ貼付 Next j End If Next End Sub いろいろ直していたのですが、Set sh2 = Worksheets("Sheet3")で「インデックスが有効範囲にありません」(同じブック内に同名シートがあるのに?)とエラーが出たり、 また、B行から最終列までコピーする際の範囲指定についてもよくわからず、 もっと他に良い方法が無いものかとお手上げ状態です。 どうぞ宜しくお願いいたします。

  • VBA 新データ行のみ元のデータシートにコピーする

    OSは、XP Excelは、2003 を使用しています。 シート1には元のデータ、シート2には追加データと元データが混じってあります。 元データシートに、追加データシートから追加データ行のみをコピペしたく、 マクロを組んでいます。 下記、 C列の売上番号を見比べて、C列のみ追記するまでは出来たのですが、 1行にデータはA列~X列まであるので、そのデータも一緒にコピペするには どの様にすれば良いのか教えて下さい。 よろしくお願いします。 ****************** Sub 追加データ追記マクロ() Dim motows As Worksheet '元データシート名を格納 Dim tsuikaws As Worksheet '追加データシート名を格納 Dim tsuikamax As Long '追加データの最終行 Dim motomax As Long '元データの最終行 Dim tsuikaNum As Range '追加売上番号 Dim motoNum As Variant '元売上番号 Dim i As Long     '書き込み行 Set motows = Worksheets(1).Name '元シート名を格納 Set tsuikaws = Worksheets(2).Name    '追加シート名を格納 tsuikamax = tsuikaws.Cells(Rows.Count, 1).End(xlUp).Row  '追加データの最終行を格納 motomax = motows.Cells(Rows.Count, 1).End(xlUp).Row '元データの最終行を格納 i = motomax + 1       '書き込み行は元データ最終行+1 For Each tsuikaNum In tsuikaws.Range("C1:C" & tsuikamax)        '追加データ売上番号格納 Set motoNum = motows.Range("C:C").Find(tsuikaNum, lookat:=xlWhole) '元データ売上番号格納 If motoNum Is Nothing Then '元データになかったら With motows .Cells(i, 3) = tsuikaNum i = i + 1 End With End If Next tsuikaNum End Sub

  • エクセルVBA(LOOKUP関数)Win2000、Office2000

    いつも関数(LOOKUP)を使って集計をしているのですが、これがVBAで一発処理できれば効率がよくなると思い、頑張ってコードを書き書きしてます。 が、どうもうまくいかきません。下に今書いているコードを書きます。やりたい内容がおわかりいただければいいのですが・・・よろしくお願いします。 Subtest() Dim ds,ss As Worksheet'(シート名) Dim Dlrow As Long'(DataSheetの最終行) Dim Slrow As Long'(DataSheetの最終行) Dim i,r,dAs Long’(行、列カウンタ) Set ds=Worksheets("DataSheet") Set ss=Worksheets("syukei") For DL row =1 To ds.Range("B65536").End(xlUp).Row 'DataSheetの行数判定 Next ForSLrow=1 To ss.Range("B65536").End(xlUp).Row '集計シートの行数判定 Next '現在セルにある関数→集計シートA3=LOOKUP(B3,DataSheet!3:H6308,DataSheet!C3:C6308) '対応する列 '検索値は全て、集計シートのB列 '検査範囲は全て、データシートのH列 ↓////※ここらへんから苦戦してます//// '集計シートのA列=データシートのC列 WithWorksheets("syukei") Fori=3ToSLrow '.Cells(i,1)="=Lookup(Cells(i,2),Worksheets(DS).cells3,8):cells(DLrow,8),worksheets(DS).cells(3.3):cells(DLrow:3)" Nexti EndWith '以降, 集計C列=データのI列のように対応する列毎に、上のコードで処理していこうと思っています。(もしかしてダサイやり方ですか?) 'J列以降は、以降集計J~AS列とデータR~BA列の+1列 'Forr=10to45→r=J~AS(10to45) 'Ford=18to53→d=R~BA(18to53) 'Fori=3toSLrow 'Cell(r,i)=Lookup・・・・・ 'nextr 'nextd 'nexti EndSub と、こんな感じで、頑張ってます。よろしくお願いいたします。

  • データ抜き出しマクロについて

    以下のプログラムは10行ごとにデータを抜き出すプログラムです。 これに追加して例えば5結果の変動があったとき、10%結果の変動が あった時にデータを抜き出すようにするにはどうすればいいですか? Sub nukitori() Dim X As Worksheet Dim i As Long Dim ii As Long Dim col As Integer Dim Nukitori_Step As Long Nukitori_Step = 10 i = 2 ii = 2 '●●●見出し行が1行目なので2で始める Set X = ActiveSheet '●シートShordataがあったら削除 On Error Resume Next Application.DisplayAlerts = False Worksheets("shortdata").Delete Application.DisplayAlerts = True On Error GoTo 0 Worksheets.Add.Name = "shortdata" '●先ず、見出しをコピー Worksheets("shortdata").Rows(1).Value = X.Rows(1).Value While X.Cells(i, 1) <> "" And i < 65535 For col = 1 To 255 Worksheets("shortdata").Cells(ii, col).Value = X.Cells(i, col).Value Next If i = 2 Then i = 1 i = i + Nukitori_Step ii = ii + 1 Wend End Sub

専門家に質問してみよう