VBAについて質問です。
下記のように、Summary シートにある一部のデータを SubSheetへ29列おきにジャンプして
貼り付けて行きたいと考えたコードですが、いつも決まったところで実行時エラーが出てしまいます。
何が悪いのかわかりません。どなたか助けて頂きたく。。。。
Sub transfer()
Dim R As Variant
Dim C As Variant
For R = 1 To Cells(Rows.Count, 1).End(xlUp).Row
For C = 1 To Cells(1, Columns.Count).End(xlToLeft).Column Step 29
For W = 1 To Cells(1, Columns.Count).End(xlToLeft).Column Step 1
Sheets("SubSheet").Range(Cells(R + 2, W), Cells(R + 2, W + 10)).Value = Sheets("Summary").Range(Cells(R + 2, C + 11), Cells(R + 2, C + 21)).Value ← ココでエラー
Next
Next
Next
Worksheets("SubSheet").Activate
Range("A1").Select
Application.ScreenUpdating = True
End Sub
イメージ
”Summary” シート 29列 29列
A・・・ L M N V ・・・・・AM AN ~ AW ・・・・・BN ~ BX
1 データ有り データ有り データ有り
2 データ有り データ有り データ有り
・ ・ ・ ・
・ ・ ・ ・
1000 データ有り データ有り データ有り
↓ 別のシートへ移動
”Sub Sheet”
A B C D ・F G H I ・K L M N ・
1 データ データ データ
2 データ データ データ
3 データ データ データ
・ ・ ・ ・
・ ・ ・ ・
1000 データ データ データ
何卒よろしくお願いします。
No.9ベストアンサー
- 回答日時:
前回のは破棄してください。
これでどうでしょうか。--------------------------------------------------
Option Explicit
Sub transfer()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim row1 As Long
Dim row2 As Long
Dim i As Long
Dim j As Long
Dim col1 As Long
Dim col2 As Long
Set sh1 = Worksheets("Summary")
Set sh2 = Worksheets("SubSheet")
Application.ScreenUpdating = False
For i = 0 To 25
For j = 0 To 1469
row1 = j + 30
col1 = i * 30 + 8
row2 = j + 3
col2 = i * 11 + 1
sh2.Range(sh2.Cells(row2, col2), sh2.Cells(row2, col2 + 9)).Value = sh1.Range(sh1.Cells(row1, col1), sh1.Cells(row1, col1 + 9)).Value
Next
Next
Application.ScreenUpdating = True
sh2.Select
Range("A1").Select
MsgBox ("完了")
End Sub
できました!!!
ありがとうございます(涙)
本当に感謝します。
なるほど、Rangeの指定方法を変えればよかったのですね!!
目からうろこです。
ありがとうございました。m(__)m
来週書類を提出できそうです!!
No.8
- 回答日時:
>仰るとおりです。
>構文とか何か必要なのですか?
要件が判りましたので、再度、マクロを修正したものを提示します。
こちらで、動作確認も行いますので、提示は、明日になるかも知れません。
しばらくお待ちください。
No.7
- 回答日時:
すみません、画像がよく見えないのですが、
そうすると、以下のように、ブロック単位でコピーするいうことでしょうか。
①が最初のコピーで、コピー元は常に8列~17列、コピー先は常に1列~10列になります。
②のときに、コピー元が29列空きます。コピー先が1列空きます。
③は最後のコピーです。
コピー元 コピー先
①
(30行, 8列~17列)→(3行,1列~10列)
(31行, 8列~17列)→(4行,1列~10列)
・・途中省略・・・
(1499行, 8列~17列)→(1472行,1列~10列)
②
(30行, 38列~47列)→(3行,12列~21列)
(31行, 38列~47列)→(4行,12列~21列)
・・途中省略・・・
(1499行, 38列~47列)→(1472行,12列~21列)
・・・
・・・
③
(30行, 758列~767列)→(3行,276列~285列)
(31行, 758列~767列)→(4行,276列~285列)
・・途中省略・・・
(1499行, 758列~767列)→(1472行,276列~285列)
No.5
- 回答日時:
No4です。
コピー元からコピー先への転送は1セル単位でのコピーです。
最初の10個のセルを例にとると、添付図のように
コピー元の①~⑩がコピー先の①~⑩に転送されるようになっています。
他のセルはコピーされません。(添付図の黄色の部分はコピーされません。)
No.4
- 回答日時:
そうすると、コピー元のセルは、
(30行, 8列)~(1500行,18列)
(30行,38列)~(1500行,48列)
(30行,67列)~(1500行,77列)
ではなく
(30行, 8列)~(1499行,17列)
(30行,38列)~(1499行,47列)
(30行,68列)~(1499行,77列)
ですね。
同様に、コピー先のセルは
(3行,1列)~(1473行,10列)
(3行,12列)~(1473行,22列)
(3行,24列)~(1473行,34列)
でなく
(3行,1列)~(1472行,10列)
(3行,12列)~(1472行,21列)
(3行,23列)~(1472行,34列)
ですね。
又、コピー元最終列は777列ではなく767列ですね。
以下、その前提でのマクロです。
以下のようになります。
----------------------------------------------
Sub transfer()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim row1 As Long
Dim row2 As Long
Dim i As Long
Dim j As Long
Dim col1 As Long
Dim col2 As Long
Set sh1 = Worksheets("Summary")
Set sh2 = Worksheets("SubSheet")
Application.ScreenUpdating = False
For i = 0 To 25
For j = 0 To 1469
row1 = j + 30
col1 = i * 30 + 8 + (j Mod 10)
row2 = j + 3
col2 = i * 11 + 1 + (j Mod 10)
sh2.Cells(row2, col2).Value = sh1.Cells(row1, col1).Value
Next
Next
Application.ScreenUpdating = True
sh2.Select
Range("A1").Select
MsgBox ("完了")
End Sub
----------------------------------------------
尚、添付の図は、コピー元、コピー先のセル位置を表にまとめたものです。
黄色の部分が、こちらで訂正した箇所です。
この図のように、コピー元、コピー先のセル位置を解釈したマクロになっています。
No.3
- 回答日時:
>コピー元のセル(30行, 8列)~(1500行,18列)
>コピー先のセル(3行,1列)~(1473行,10列)
この意味ですが、以下のように転送するということですか。
コピー元→コピー先
30行8列→3行1列
31行9列→4行2列
32行10列→5行3列
33行11列→6行4列
34行12列→7行5列
35行13列→8行6列
36行14列→9行7列
37行15列→10行8列
38行16列→11行9列
39行17列→12行10列
40行18列→13行1列・・・②
41行8列→14行2列・・・①
42行9列→15行3列
・・途中省略・・・
1500行18列→1473行10列
そうだとすると
コピー元のセルは18列の次は8列に戻るのですか。①のケース(41行8列)
コピー先のセルは10列の次は1列に戻るのですか。②のケース(13行1列)
お付き合い頂き本当に感謝します。
ちょっと違います。
コピー元→コピー先
30行8列→3行1列
31行9列→4行2列
32行10列→5行3列
33行11列→6行4列
34行12列→7行5列
35行13列→8行6列
36行14列→9行7列
37行15列→10行8列
38行16列→11行9列
39行17列→12行10列
40行8列→13行1列
41行9列→14行2列
・・途中省略・・・
1500行17列→1473行10列
30行38列→3行12列
31行39列→4行13列
32行40列→5行14列
33行41列→6行15列
34行42列→7行16列
35行43列→8行17列
36行44列→9行18列
37行45列→10行19列
38行46列→11行20列
39行47列→12行21列
40行38列→13行12列
41行39列→14行13列
といった具合になります。
これでお分かりでしょうか??
No.2
- 回答日時:
>しかし、29列目にあるデータを取得できません。
>なにかご存知でしょうか?
そもそも、どうなさりたいのでしょうか。
「SubSheetへ29列おきにジャンプして貼り付けて行きたい」ということだけでは、よくわかりません。
コピー元セルの位置(行、列)とコピー先セルの位置(行、列)を明確に提示していただければアドバイスできます。
そうでないと、アドバイスのしようがありません。
早々の回答ありがとうございます。
仰るとおりです。
現在、コピー元のセルは、(30行, 8列)~(1500行,18列)29列あけて(30行,38列)~(1500行,48列)29列あけて
(30行,67列)~(1500行,77列)29行あけて。。。といった具合に777列までにおよびます。
これを
コピー先のセル
(3行,1列)~(1473行,10列)1行あけて(3行,12列)~(1473行,22列)1行あけて(3行,24列)~(1473行,34列)といった具合に繰返し
データを整えたいのです。
教えて頂きたく何卒よろしくお願い申し上げます。
No.1
- 回答日時:
とりあえず、エラーをとるだけなら、
Sheets("SubSheet").Range(Sheets("SubSheet").Cells(R + 2, W), Sheets("SubSheet").Cells(R + 2, W + 10)).Value = Sheets("Summary").Range(Sheets("Summary").Cells(R + 2, C + 11), Sheets("Summary").Cells(R + 2, C + 21)).Value
のようにしてください。
他に問題点は、
For R = 1 To Cells(Rows.Count, 1).End(xlUp).Rowですが
Summaryの最終行まで実行させたいと思われます。
この場合、Summaryシートを表示した状態でマクロが実行されれば、問題ないですが、
他のシートを表示した状態でおこなうと、他のシートの最終行が採用されてしまします。
その為、For R = 1 To Cells(Rows.Count, 1).End(xlUp).Rowの前の行に
Sheets("Summary").Activate
をいれておいた方が良いでしょう。
次が一番の問題ですが、本当に3重ループする必要があるのでしょうか。
これでうまく行くなら特に問題ありません。
この箇所を修正しようと思いましたが、そもそも、どのようにsummaryからSubsheetへ転記したいのかがよくわかりませんので
これまでとします。
大変わかりやすい解説ありがとうございます。
仰るとおり現在、3重ループをする必要が無いことに気づきました。
しかし、29列目にあるデータを取得できません。
なにかご存知でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++言語で、構造体のコピーは可...
-
ROBOCOPYをスペース付きのフォ...
-
.BATでクリップボードに複数の...
-
VBA 最終行・最終列コピー範囲...
-
Eclipseのコード入力時の、行コ...
-
Activesheet.Pasteで困っています
-
一行おきに貼り付ける 可能でし...
-
バッチで当日日付で作成される...
-
ACCESS VBAでExcelを開き行をコ...
-
シートに張り付けたボタンがシ...
-
EPROM Writer の使い方がわから...
-
差分コピー
-
[Unity]シーンファイルの中が消...
-
iCloud for Windowsをアンイン...
-
HPビルダー未使用ファイルの...
-
svnでファイル移動すると履歴が...
-
vbsからのExcelマクロ呼び出し...
-
アクセスが開かなくなってしま...
-
アーカイブユーティリティーの...
-
パスワード付きmp3ファイルにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
C++言語で、構造体のコピーは可...
-
一行おきに貼り付ける 可能でし...
-
Activesheet.Pasteで困っています
-
DataTableに入っているデータを...
-
Ctrl + Cなど複数の入力キー...
-
マウントしたディスクにcpで、...
-
Listviewに表示された文字のコ...
-
Eclipseのコード入力時の、行コ...
-
エクセルVBA 実行時エラー'...
-
arduino unoからデータを読み出...
-
文字列の切り出し
-
ROBOCOPYをスペース付きのフォ...
-
シートに張り付けたボタンがシ...
-
ブラウザからコピペすると文字...
-
【UWSC】WEBページ内コピーした...
-
バッチで当日日付で作成される...
-
他プロジェクトのFormを自プロ...
-
jakarta poiを使用し、EXCELの...
-
.BATでクリップボードに複数の...
おすすめ情報
回答ありがとうございます。返信が送れ申し訳ございません。
ですが、、すいません。私の説明が足りないようです。
画像に有るように上段のように29列あけて並んでいる表を下段のように1列あけて
並べるようにしたいのですが、わかりますでしょうか?
お知恵を借りたくお願い申し上げます。
感謝しております。
コピー元を送ります。
このサイズの表が29列毎に離れたところに30個存在します。
コピー先はこの表を1列毎に配置していくというものです。
後ほどコピー先の画像を送ります。
コピー先です。