表の編集 1行1レコード化
実際に受けた相談内容を、少し変更して紹介します。
残業時間を集計した既存の表があり、列方向に月日が推移する形式になって
いました。
この表を「1行1レコード(記録)にしたい」という要望があり、マクロで
成形してみました。↓最終形は、こんな感じです。
実際に作成したマクロがこちらです。
Sub Sample() Dim OrgData As Variant ' 元データ貼り付け用 Dim seq As Variant ' 加工済データ格納用 Dim i As Long ' 繰り返し作業用整数 Dim r As Long ' 配列の行番号 Dim c As Long ' 配列の列番号 Dim rMax As Long ' 最大行数 Dim cMax As Long ' 最大列数 ' 元データを一旦、配列に格納。 OrgData = Range("A1").CurrentRegion ' 行と列の最大値を取得。 rMax = UBound(OrgData, 1) - 1 cMax = UBound(OrgData, 2) - 1 ' 元データから、加工済データ格納用配列を再定義。 ReDim seq(1 To rMax * cMax + 1, 1 To 3) ' 一行目にラベル情報をセット。 seq(1, 1) = "日付" seq(1, 2) = "名前" seq(1, 3) = "残業(h)" ' 二行目以降に、元データを並び替えて格納する。 For i = 2 To UBound(seq) ' データを入力する行番号rと列番号cを取得。 r = ((i - 2) Mod rMax) + 2 c = WorksheetFunction.RoundUp((i - 1) / rMax, 0) + 1 ' 配列にデータ格納。 seq(i, 1) = OrgData(1, c) seq(i, 2) = OrgData(r, 1) seq(i, 3) = OrgData(r, c) Next ' 加工済みデータ貼り付け用シート追加。 Sheets.Add After:=Sheets(Sheets.Count) ' 配列を貼り付け。 Range("A1").Resize(UBound(seq), UBound(seq, 2)) = seq End Sub
一番のポイントは、AさんからEさんまで入力したのち、またAさんから
始まる「循環」の仕組みでしょうか。
r=(2-2)÷ 5 のあまり +2 = 0+2 = 2
r=(3-2)÷ 5 のあまり +2 = 1+2 = 3
r=(4-2)÷ 5 のあまり +2 = 2+2 = 4
r=(5-2)÷ 5 のあまり +2 = 3+2 = 5
r=(6-2)÷ 5 のあまり +2 = 4+2 = 6
r=(7-2)÷ 5 のあまり +2 = 0+2 = 2
r=(8-2)÷ 5 のあまり +2 = 1+2 = 3
のように、2~6を繰り返します。「余り」を利用した数の繰り返しは大変
有効ですので、ぜひ使ってみてください。
また同様に、2~6のグループが幾つ目か?も、割り算で求めています。
(2-1)÷ 5 = 0.2 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(3-1)÷ 5 = 0.4 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(4-1)÷ 5 = 0.6 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(5-1)÷ 5 = 0.8 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(6-1)÷ 5 = 1.0 ⇒ 1の位へ切り上げ ⇒ 1 ⇒ 1+1=2
(7-1)÷ 5 = 1.2 ⇒ 1の位へ切り上げ ⇒ 2 ⇒ 2+1=3
(8-1)÷ 5 = 1.4 ⇒ 1の位へ切り上げ ⇒ 2 ⇒ 2+1=3
のように、5進んで初めて1増えることになりす。この方法も大変有効です。上記と合わせて活用してみましょう。
参考まで。