質問するログイン新規登録

回答編集履歴

2

追記

2020/11/05 09:42

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -19,4 +19,55 @@
19
19
  「不要な行を削除したい。」ということを見落としていました。
20
20
  最終的にマクロで形を整えるのですから、
21
21
  最後の結果が間違いでなければ、どういう手順処理してもよいですよね?
22
- なので、一旦シート上のすべてのセルの結合を解除した方が考え方が簡単ですかね?
22
+ なので、一旦シート上のすべてのセルの結合を解除した方が考え方が簡単ですかね?
23
+
24
+ ```ExcelVBA
25
+ '表の成型(不要な行の削除)
26
+ Sub test()
27
+ Dim rngTable As Range
28
+ Dim c As Range
29
+ Dim a As Range
30
+ Dim b As Range
31
+
32
+ '処理する表のタイトル行を除いたセル範囲の取得
33
+ With ActiveSheet.Range("A1").CurrentRegion
34
+ Set rngTable = Intersect(.Cells, .Offset(1))
35
+ End With
36
+
37
+ '1列目と2列目の前処理
38
+ For Each c In rngTable.Resize(, 2).Columns
39
+ c.UnMerge 'セルの結合を解除
40
+ Set a = Nothing '変数の初期化
41
+ On Error Resume Next
42
+ Set a = c.SpecialCells(xlCellTypeBlanks) 'ジャンプ機能で空白セル検索
43
+ On Error GoTo 0
44
+
45
+ 'もし、空白セルがあったら
46
+ If Not a Is Nothing Then
47
+ '空白範囲毎に繰り返し
48
+ For Each b In a.Areas
49
+ 'セル範囲の1行上の値を転記
50
+ b.Value = b.Cells(0, 1).Value
51
+ Next
52
+ End If
53
+ Next
54
+
55
+ '3列目が空白の行を削除
56
+ On Error Resume Next
57
+ rngTable.Columns(3).SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'ジャンプ機能で空白セル検索
58
+ On Error GoTo 0
59
+ End Sub
60
+ ```
61
+
62
+ まずは、こんな感じで成形して、小計機能やピボットテーブルなどの機能で、
63
+ 小計や総計を計算できるようにしてやります。
64
+ 元のデータが変わるので、別のシートにでもコピペして作業するとよいかと思います。
65
+ さらに別のシートにピボットテーブルで集計し、
66
+ 期待した見た目にならなければ、それの結果をまた加工したらよいかと思います。
67
+ 中間の作業に使ったシートは、削除してしまえば、
68
+ マクロを使う人には途中にどんなことをしたかはわからないようになります。
69
+ もちろん自作することも可能ですが、
70
+ せっかくエクセルを使っているのですから、
71
+ エクセルの機能を使うと、自作する労力が減らせ、コードを書く量も減らせます。
72
+ (エクセルの機能を調べる方に労力がかかるかもしれませんが。)
73
+ 今回の場合、小計機能を使ってもいいかもしれませんね。

1

追記

2020/11/05 09:42

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -11,4 +11,12 @@
11
11
  ステップ実行をしながら、
12
12
  ローカルウィンドウで変数の中身の変化を確認し、
13
13
  意図通りに変化しているか確認してください。
14
- そうすることで問題点が見えてくると思います。
14
+ そうすることで問題点が見えてくると思います。
15
+
16
+ -----
17
+ 追記
18
+
19
+ 「不要な行を削除したい。」ということを見落としていました。
20
+ 最終的にマクロで形を整えるのですから、
21
+ 最後の結果が間違いでなければ、どういう手順処理してもよいですよね?
22
+ なので、一旦シート上のすべてのセルの結合を解除した方が考え方が簡単ですかね?