知識をお持ちの方がいらっしゃれば、お力添えいただけると嬉しいです。。。
以下のシート(元シート)を、貼り付け先シートのイメージにマクロで組み替えたいです。
※2sheetは同じファイルです。
<元シート>
・A~U列:品番や担当者名などの情報
・V~Y列:今回は不要なデータです
・Z~CG列:月ごとの数値データが5列ずつ×列で12セット
<貼り付け先シートで実現したいこと>→元シートの1行を、月別12行に組み替える
・A~U列:元シートの1行を12行コピペ
・V列:2019/4/1、2019/5/1、、、2020/3/1と月ごとに12行入力
・W~AA列:元データの、月ごとの数値データ5列ずつ×12行
色々知識を貸していただき、下記の記述にたどり着きました。
しかし、下記の問題が生じ、正常に動きません。
・A列~U列が、貼り付け先で13行複製されている(12行が理想)&13行目のW~AA列は空欄
・貼り付け先のV列が全て「1900/1/0」
下記記述の問題点がお分かりの方は、ご指摘&どう直せばよいか助言いただけると幸いです。。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Sub テスト()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim r1 As Long, r2 As Long
Dim c As Integer, cmax As Integer
Dim sdate As Date
Application.ScreenUpdating = False
Set sh1 = Worksheets("元シート")
Set sh2 = Worksheets("貼り付け先シート")
r2 = 1
With sh1
cmax = .Cells(1, Columns.Count).End(xlToLeft).Column
For r1 = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
sdate = .Cells(r1, 21)
For c = 25 To cmax Step 5
r2 = r2 + 1
'A列~U列は元シートの1行目を、12行同じ内容でコピペ
sh2.Range(sh2.Cells(r2, 1), sh2.Cells(r2, 20)).Value = .Range(.Cells(r1, 1), .Cells(r1, 20)).Value
'V列は、2019/4/1、2019/5/1、、、2020/3/1と月ごとに12行入力
sh2.Cells(r2, 21) = DateAdd("m", Int((c - 5) / 3), sdate)
'元シートのZ~CG列の、60(5×12)列を、貼り付け先シートの5(W~AA)列×12行でコピペ
sh2.Range(sh2.Cells(r2, 22), sh2.Cells(r2, 26)).Value = .Range(.Cells(r1, c), .Cells(r1, c + 5)).Value
Next c
Next r1
End With
Application.ScreenUpdating = True
End Sub
No.10ベストアンサー
- 回答日時:
私なら
rmax = sh1.Cells(Rows.Count, 1).End(xlDown).Row
For r1 = 2 To rmax * 12 Step 12
'sh2.Cells(r1, 22) = "2019/4/1" ★削除
For i = 0 To 11
sh2.Cells(r1 + i, 22) = DateAdd("m", i, Cells(r1, 22))
Next i
Next r1
としますかね。
ただ Cells(r1,22)がアクティブシートなのか否かでシート名を明確にするかどうかが決まりどころかも。
ありがとうございます。。。。。。
ご教示いただいた記述を理解してから自分の書いたものを見直してみたら、誤っていた内容が見えてきました。
また、無事やりたかった動きも実現することができました!本当に。ありがとうございます。
自分でもきちんと勉強してみます。
No.9
- 回答日時:
rmax = sh1.Cells(Rows.Count, 1).End(xlDown).Row
これで本当に良いのですか?
rmax * 12 存在しない行数になってませんか?
#7を確認されてください。
No.7
- 回答日時:
>For r3 = 2 To sh1.Cells(Rows.Count, 1).End(xlDown).Row Step 12 ★
エラーの原因は、これだけではわからないのですが、End(xlDown)なのでRows.CountからEnd(xlDown)は、ダメではないでしょうか(結果シート最終行)
この場合、実行がされると、他の部分は分かりませんが、それなりの時間がかかるかと思います
.Cells(1,"A").End(xlDown).Row みたいにしないと、、A1セルからCtrl+↓キーを押した時の.Row 行番号
もし、最終行から(Rows.Count)から上のセルを求めたいなら、.Cells(Rows.Count, 1).End(xlUp).Row になります。(そこには値が入っています)
更に、sh2.Cells(r2, 22) = DateAdd("m", i, Cells(r3, 22)) も
r2の値推移が不明ですが、For i = 1 To 11 のループ内にr2変数の変化が無ければ、同じ場所にDateAdd("m", i, Cells(r3, 22))が書き込まれ
結果、sh2.Cells(r2, 22) = DateAdd("m", 11, Cells(r3, 22)) を一度行ったのと同じになります。
あと、shを分けて考えられていると思いますので、最終的にまとめるとしても、検証時は、
CellsやRangeの前にシートを明示するようにした方が良いです。 DateAdd("m", 11, この部分 Cells(r3, 22))
'「2019/4/1」の下1~11行に「2019/5/1~2020/3/1」を書き込む
上のr3のループを除くとこんな感じ
For i = 1 To 11
sh2.Cells(r3+i, 22) = DateAdd("m", i, sh2.Cells(r3, 22)) sh2.Cells(r3, 22)の下に書き込まれて行く
Next i
先のご質問コードについては、考えに入れていません。
No.5
- 回答日時:
>・貼り付け先のV列が全て「1900/1/0」
>sh2.Cells(r2, 21) = DateAdd("m", Int((c - 5) / 3), sdate)
右辺を置いとくとしてsh2.Cells(r2, 21 は、U列では無いでしょうか?
列移動を変数でしないのならば、Cellsはこのように書く事も出来ます。
Cslle(row,"V")
正しい書き方かは、置いといて整理する為には、試す価値はあります。
先のResizeと合わせれば、意外と範囲設定も容易ですし、Offsetを使えば変数移動にも判りやすく対応します。(好き嫌いはありますが)
右辺に関してInt((25- 5) / 3)が求めたい数値なのか?わかりません。イミディエイトウィンドウやローカルウインドウ、
メッセージボックスでも良いので確認してみてはいかがでしょう。
No.4
- 回答日時:
こんばんは
申し訳ありませんが、回答ではありません。
似たようなご質問を繰り返していらっしゃいますが、質問のたびにセルの位置や対象となるセル数がかわっているようです。
変わったことでその前の回答が生きずに、修正して失敗なさっているように見受けられます。
質問の前に、まず、きちんと整理をなさっておいてから、セル範囲や位置が確定できるように質問をなさった方が、目的には早くたどり着けると思いますよ。
具体的なコードを求めるのであれば、コードはセルの範囲や位置に依存するものになりますので。
No.3
- 回答日時:
こんばんは、
多分ここは、、と思い書いてしまいそうですが、敢えてアドバイスにとどめます。
>・A列~U列が、貼り付け先で13行複製されている(12行が理想)&13行目のW~AA列は空欄
多分、範囲指定が迷子になっているのだと思います。
範囲などを整理して、.Resizeなどを使われた方が良いと思います。おそらく、それだけで判りやすくなり
行の移動などセル配置も整理でき理解しやすくなるのではないでしょうか。
ご存知かもしれませんが、Resize 参考サイト https://excelwork.info/excel/vbaresize/
No.1
- 回答日時:
・貼り付け先のV列が全て「1900/1/0」
これで気になるとしたら、
DateAdd("m", Int((c - 5) / 3), sdate)
ループで c が変化していく際に『本当に求めたい結果がこの計算で出てる?』と言う事でしょうかね。
デバッグでイミディエイトウィンドウなどの扱いを知ってれば、表示させて確認できるでしょ。
省略した内容の質問で得られた回答をそのまま使っているからおかしくなっているとかではなくて?
For c = 25 To cmax Step 5
であれば
DateAdd("m", Int((c - 25) / 5), sdate)
ではないかな?
これVBAよりも算数のレベル位と思うよ。
c がどのように変化していくのかを紙に書くなりシートに打ち込むなりすれば見えてくるかと。
最初からちゃんとしたデータ範囲を提示しておけば回答者も最初の回答で済んだのに。
と思いますよ。(と言っておいて違ったら初級レベルのボケジジィと思ってくださいな)
ありがとうございます。
まず記述の見直し&DateAddについて学ぶところからやってみようと思います。
こういった場では、確かに正確な情報をご提示することが、双方にとってベストですね。今後は出せる範囲で元データのことは正確に書いていこうと思います。ご親切にありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) マクロで最終行を取得したい 4 2023/05/28 12:14
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
VBAを使って検索したセルをコピ...
-
vba 2つの条件が一致したら...
-
【VBA】2つのシートの値を比較...
-
エクセルVBA シートモジュール...
-
VBAのFind関数で結合セルを検索...
-
B列の最終行までA列をオート...
-
VBAで、特定の文字より後を削除...
-
文字列の結合を空白行まで実行
-
データグリッドビューの一番最...
-
VBA 値と一致した行の一部の列...
-
vbaでシートより100より大きい...
-
VBAで10行おきにセルの下に罫線...
-
VBA UserFormからの転記で
-
Changeイベントでの複数セルの...
-
セルに値が入っていた時の処理
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
C# dataGridViewの値だけクリア
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
VBAのコードを教えてください
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
エクセルvbaについて
-
vba 2つの条件が一致したら...
-
Excelで、あるセルの値に応じて...
-
VBA UserFormからの転記で
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
エクセルVBAにて =A1=B1とすれ...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
VBマクロ 色の付いたセルを...
-
VBAで指定範囲内の空白セルを左...
おすすめ情報
ありがとうございます。。
V列の処理についてご指摘を基に再検討し下記を書いてみたのですが、
★のところでエラーが出て処理ができません。。
エラーの原因になっているところがもしお分かりでしたら、
改善方針をご教示いただけますと非常に助かります。
初心者なもので、基本的なことが間違っていたら申し訳ないです
For r3 = 2 To sh1.Cells(Rows.Count, 1).End(xlDown).Row Step 12 ★
'基準になる「2019/4/1」を書き込む
sh2.Cells(r3, 22) = "2019/4/1"
'「2019/4/1」の下1~11行に「2019/5/1~2020/3/1」を書き込む
For i = 1 To 11
sh2.Cells(r2, 22) = DateAdd("m", i, Cells(r3, 22))
Next i
Next r3
ご助言ありがとうございます!
指摘の通り、STEP箇所が誤っていたので再検討し、今のV列に関する記述は以下です
V列について単体でマクロを立てて実行してみたところ★で、「オーバーフロー」と出ます。
この原因についてもしお分かりでしたらご教示いただけると幸いです。。
'sh1の最終行の行数を取得
max = sh1.Cells(Rows.Count, 1).End(xlDown).Row ★
'sh2で2019/4/1を入れたいのは、2行目から12行おきに、sh2の最終行(sh1最終行×12)回
For r1 = 2 To rmax * 12 Step 12
sh2.Cells(r1, 22) = "2019/4/1"
For i = 1 To 11
sh2.Cells(r1 + i, 22) = DateAdd("m", i, Cells(r1, 22))
Next i
Next r1
恐れ入ります。。上記オーバーフローについては、rmaxをLongで定義したところ、解決しました。。
しかし、今度は「オブジェクト定義のエラー」と出て、シートを見てみると、延々と2019/4/1が12行おきに記入されています。
解決方法について、ご助言をいただけますと幸いです。
rmax = sh1.Cells(Rows.Count, 1).End(xlDown).Row
For r1 = 2 To rmax * 12 Step 12
sh2.Cells(r1, 22) = "2019/4/1" ★
For i = 1 To 11
sh2.Cells(r1 + i, 22) = DateAdd("m", i, Cells(r1, 22))
Next i
Next r1