エクセルで楽々校務

学校現場で使えるエクセルファイルや小技の紹介をしています。掘り出し物があるかもしれません。あと、今までの実践での疑問点もつぶやきます。

VBA:連続範囲データを6行飛ばし3列飛ばしで転記するマクロ

お久しぶりです。

またぼちぼち更新していきます。

さて、ネットで探しても見当たらなかったマクロです。

連続データを配列に格納して、6行、3列飛ばしに転記するマクロです。

校務での使い道は、

時間割表を週案シートに展開転記する時などに使えると思います。

奇数、偶数シートで転記内容を変えられるようにしてみました。

一瞬で転記できます。

コードとサンプルシートを載せてみました。無駄なところがあるかもしれませんが、

一応動きますのでご勘弁を。

--------------------------------------------------------------------------------

 

Option Explicit

Sub ■配列展開6行飛ばし3列飛ばし()

Dim myarr, rng As Range
Dim r, c As Long
Dim ws1, sh As Worksheet

Application.ScreenUpdating = False                '画面描画停止
Application.Calculation = xlCalculationManual '手動計算

For Each sh In Worksheets

With sh
If IsNumeric(.Name) = True Then      'シート名が数値ならば

Set ws1 = Worksheets("時間割")

'★シート名が奇数の場合=======
If .Name Mod 2 = 1 Then
Set myarr = ws1.Range("B2:F7")     '★コピー元配列範囲★

'★シート名が偶数の場合=======
ElseIf .Name Mod 2 = 0 Then
Set myarr = ws1.Range("I2:M7")
End If
r = 2                                       '★コピー先の先頭行番号
c = 3                                       '★コピー先の先頭列番号
For Each rng In myarr
If c <= 15 Then                     '★コピー先 列の最大値までならば
.Cells(r, c) = rng                    'コピー先にrngを転記
c = c + 3                                '列方向に規則性でずらしていく
Else                                       '列最大値を超えたら
'---------------------------------------------------
r = r + 6                                 '★行方向に規則性を足して下がる
c = 3                                      '★先頭列に戻す★
'---------------------------------------------------
.Cells(r, c) = rng                     'コピー先にrngを転記
c = c + 3                                 '列方向に規則性でずらしていく
End If
Next
'====================================

End If
End With

Next

Application.Calculation = xlCalculationAutomatic   '自動計算にもどす

MsgBox "処理完了!"

End Sub


Sub 処理クリアー()

Dim myarr, rng As Range
Dim r, c As Long
Dim ws1, sh As Worksheet

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

For Each sh In Worksheets

With sh
If IsNumeric(.Name) = True Then
Set ws1 = Worksheets("時間割")
Set myarr = ws1.Range("B102:F107")               '★コピー元空白範囲★
r = 2
c = 3
For Each rng In myarr
If c <= 15 Then
.Cells(r, c) = rng
c = c + 3
Else
'------------------------
r = r + 6
c = 3
'------------------------
.Cells(r, c) = rng
c = c + 3
End If
Next
End If
End With

Next

Application.Calculation = xlCalculationAutomatic

MsgBox "全クリアーしました。"

End Sub

==============================================

 

では、またよろしくお願いします。