Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2013)
112行でワンセットのデータを回数分ワンアップさせたい
投稿日時: 20/07/28 15:11:06
投稿者: vaioyuki

知恵をお貸しください。
 
現在規則性のない数字がB列に52行×2、合計112行がワンセットになっています。
こちらをサマリシートに入力されているデータ分、繰り返したいと思っています。
 
B列を回数分繰り返すことはできたのですが、
F列がOFFSET関数用の数字が入っています。
最初の112行は「0」が入力されていて、113行目からは「1」、225行目からは「2」のようにカウントアップしていきたいのですが頭が働きません。
 
変数を持たせてこれを+1ずつカウントアップしていく。。。?とは思っているのですが、
何に変数を持たせていいのかがわかりません。
 
よろしくお願いします。
 

Sub 実行()
Set summSh = Worksheets("サマリ")
Set flowSh = Worksheets("フロー")

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

countD = WorksheetFunction.CountA(summSh.Columns(1)) - 1

With flowSh
    For i = 1 To countD
        r_cnt = .Range("B1").CurrentRegion.Rows.Count
        .Range("B2:B113").Copy .Cells(r_cnt + 1, 2)
    Next i
End With

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

MsgBox "処理完了"

End Sub

回答
投稿日時: 20/07/28 16:17:17
投稿者: Suzu

引用:
B列を回数分繰り返すことはできた

 
フローB2:B113 の 内容 を 同じフローのB列 の 最終行の次の行へ 貼り付ける
上記の内容を、サマリ の A列 の データの数 だけ 繰り返す
 
という事ですね。
 
 
引用:
F列がOFFSET関数用の数字が入っています。
最初の112行は「0」が入力されていて、113行目からは「1」、225行目からは「2」のようにカウントアップしていきたいのですが頭が働きません。

 
説明の内容では、F列とコードの関係性が読み取れませんが
 
 1回目のコピーの際には、0
 2回目のコピーの際には、1
 3回目のコピーの際には、2
 
になれば良く、n回目 のコピー は、変数 i でカウントしているのでは?
 つまり、 「 i - 2 」が欲しい数字なのでは?

投稿日時: 20/07/28 17:22:53
投稿者: vaioyuki

ありがとうございます。
 
現在のシートではA列に
 
=IF(OR(OFFSET(サマリ!$A$2,F2,0)="",ISNA(D2)),"",B2&","&OFFSET(サマリ!$A$2,F2,0)&OFFSET(サマリ!$B$2,F2,0)&",N,"&D2)
 
が入力されています。
 
 
Suzuさんのを読んで(なるほど!!☆)と思ったのですが、
どう活用していいのかがわかりません。。。
 
112回は同じ数字?
113回目からはカウントアップ?
「i-2」を112回繰り返す?
次のステップは?
 
でパニックになっています。

回答
投稿日時: 20/07/28 18:47:38
投稿者: mattuwan44

Sub test()
    Dim Rng As Range
    Dim i As Long, j As Long
    Const cmyRows As Long = 112
    
    With Worksheets("サマリ")
        Set Rng = .Range("A1").CurrentRegion
    End With
    
    j = 0
    For i = 2 To Rng.Rows.Count Step cmyRows
        Worksheets("フロー").Cells(i, "B").Resize(cmyRows).Value = j
        j = j + 1
    Next
End Sub

 
よくわからないけど、
こんな感じにしたいんですかね?
 
何行おきにというときはStepを使うといいかと、
で、カウントアップしていきたいなら、単純なコピペでは出来ないので(エクセル的にはできますが)、
「値」をカウントアップしていって入力してやるといいかと思います。
また、基準のセルから何行分(何列分も含む)と範囲を拡張して指定するときは、
Resizeプロパティを使うとわかりやすいかと思います。

回答
投稿日時: 20/07/29 09:33:37
投稿者: Suzu

すいません。 i-2 ではなく、i-1 でした。
 
  (略)
   .Range("B2").Resize(cmyRows).Copy .Cells(r_cnt + 1, 2)
   .Cells(r_cnt + 1, 2).Resize(cmyRows).Offset(0, 4) = i - 1
  (略)
 
こんなイメージです。
 
 
 
直接は関係ないですが
 

引用:
現在のシートではA列に
 
=IF(OR(OFFSET(サマリ!$A$2,F2,0)="",ISNA(D2)),"",B2&","&OFFSET(サマリ!$A$2,F2,0)&OFFSET(サマリ!$B$2,F2,0)&",N,"&D2)
 
が入力されています。

 
フロー の A列の数式でしょうけど
VBAを使用して データの コピー&ペーストを しているのであれば
数式内容をすっきりできますよね?
 
サマリ!$A$2 これが固定なのでしょうから

投稿日時: 20/07/29 09:58:24
投稿者: vaioyuki

ありがとうございます。
 
stepで112を使うんだろうなぁ。。。とは思いながらも、
112回ごとにワンアップしていく動作が思い浮かびませんでした。汗
 

Sub 実行()
Set summSh = Worksheets("サマリ")
Set flowSh = Worksheets("フロー")

Const setRows As Long = 112

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

countD = WorksheetFunction.CountA(summSh.Columns(1)) - 1

With flowSh
    For i = 1 To countD
        r_cnt = .Range("B1").CurrentRegion.Rows.Count
        .Range("B2:B113").Copy .Cells(r_cnt + 1, 2)
    Next i
    
    r_cnt = .Range("B1").CurrentRegion.Rows.Count

    j = 0
    For i = 2 To r_cnt Step setRows
        .Cells(i, 6).Resize(setRows).Value = j
        j = j + 1
    Next
End With

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

MsgBox "処理完了"

End Sub

 
こちらで思ったように作動しました。
助かりました。
ありがとうございました。

投稿日時: 20/07/29 09:58:56
投稿者: vaioyuki

閉め忘れました。(^^;)