海外旅行から帰ってきたら、まず何を食べる?

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 データ   データ     データ 

何卒よろしくお願いします。

質問者からの補足コメント

  • 回答ありがとうございます。返信が送れ申し訳ございません。
    ですが、、すいません。私の説明が足りないようです。
    画像に有るように上段のように29列あけて並んでいる表を下段のように1列あけて
    並べるようにしたいのですが、わかりますでしょうか?
    お知恵を借りたくお願い申し上げます。

    「シートのデータを29列おきにジャンプして」の補足画像1
    No.5の回答に寄せられた補足コメントです。 補足日時:2017/10/18 17:41
  • 感謝しております。
    コピー元を送ります。
    このサイズの表が29列毎に離れたところに30個存在します。
    コピー先はこの表を1列毎に配置していくというものです。
    後ほどコピー先の画像を送ります。

    「シートのデータを29列おきにジャンプして」の補足画像2
      補足日時:2017/10/18 22:40
  • コピー先です。

    「シートのデータを29列おきにジャンプして」の補足画像3
      補足日時:2017/10/18 22:49

A 回答 (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
    • good
    • 0
この回答へのお礼

できました!!!
ありがとうございます(涙)
本当に感謝します。
なるほど、Rangeの指定方法を変えればよかったのですね!!
目からうろこです。
ありがとうございました。m(__)m
来週書類を提出できそうです!!

お礼日時:2017/10/19 00:10

>仰るとおりです。


>構文とか何か必要なのですか?
要件が判りましたので、再度、マクロを修正したものを提示します。
こちらで、動作確認も行いますので、提示は、明日になるかも知れません。
しばらくお待ちください。
    • good
    • 0

すみません、画像がよく見えないのですが、


そうすると、以下のように、ブロック単位でコピーするいうことでしょうか。
①が最初のコピーで、コピー元は常に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列)
    • good
    • 0
この回答へのお礼

お付き合いありがとうございます。
仰るとおりです。
構文とか何か必要なのですか?

お礼日時:2017/10/18 23:25

>並べるようにしたいのですが、わかりますでしょうか?


画像が小さすぎてわかりません。
上の画像と下の画像を2回に分けて提示していただけませんでしょうか。
    • good
    • 0

No4です。


コピー元からコピー先への転送は1セル単位でのコピーです。
最初の10個のセルを例にとると、添付図のように
コピー元の①~⑩がコピー先の①~⑩に転送されるようになっています。
他のセルはコピーされません。(添付図の黄色の部分はコピーされません。)
「シートのデータを29列おきにジャンプして」の回答画像5
この回答への補足あり
    • good
    • 0

そうすると、コピー元のセルは、


(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
----------------------------------------------
尚、添付の図は、コピー元、コピー先のセル位置を表にまとめたものです。
黄色の部分が、こちらで訂正した箇所です。
この図のように、コピー元、コピー先のセル位置を解釈したマクロになっています。
「シートのデータを29列おきにジャンプして」の回答画像4
    • good
    • 0

>コピー元のセル(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列)
    • good
    • 0
この回答へのお礼

お付き合い頂き本当に感謝します。
ちょっと違います。
コピー元→コピー先   
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列
といった具合になります。
これでお分かりでしょうか??

お礼日時:2017/10/17 23:32

>しかし、29列目にあるデータを取得できません。


>なにかご存知でしょうか?
そもそも、どうなさりたいのでしょうか。
「SubSheetへ29列おきにジャンプして貼り付けて行きたい」ということだけでは、よくわかりません。
コピー元セルの位置(行、列)とコピー先セルの位置(行、列)を明確に提示していただければアドバイスできます。
そうでないと、アドバイスのしようがありません。
    • good
    • 0
この回答へのお礼

早々の回答ありがとうございます。
仰るとおりです。
現在、コピー元のセルは、(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列)といった具合に繰返し
データを整えたいのです。
教えて頂きたく何卒よろしくお願い申し上げます。

お礼日時:2017/10/17 22:37

とりあえず、エラーをとるだけなら、


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へ転記したいのかがよくわかりませんので
これまでとします。
    • good
    • 0
この回答へのお礼

大変わかりやすい解説ありがとうございます。
仰るとおり現在、3重ループをする必要が無いことに気づきました。
しかし、29列目にあるデータを取得できません。
なにかご存知でしょうか?

お礼日時:2017/10/17 21:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!