回答編集履歴

3

誤りの修正

2021/02/03 06:13

投稿

退会済みユーザー
test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
 
92
92
 
93
- endRowやwsがどちらのsheetを指しているのか本人でも分かりづらく間違えているのが原因なので、変数名をEnemyEndRowやNewWorksheetなど判別出来るように書いた方がよさそうです。
93
+ endRowやwsがどちらのsheetを指しているのか本人でも分かりづらく間違えているのが原因なので、変数名をEnemyEndRowやEnemyWorksheetなど判別出来るように書いた方がよさそうです。
94
94
 
95
95
  (Enemyも適切ではないのですが)
96
96
 

2

追記

2021/02/03 06:13

投稿

退会済みユーザー
test CHANGED
@@ -23,3 +23,121 @@
23
23
  End(xlDown).Rowの影響でデータがとびとびになったり正常に動きません。
24
24
 
25
25
  此処を直していけば想定通りの動作になるのでは?
26
+
27
+
28
+
29
+
30
+
31
+ **追記**
32
+
33
+ コメントに修正コードが追加されたので3点ほど気になる点をまとめました。
34
+
35
+
36
+
37
+ ・forEachループは正常に動作していますし基本の処理は問題ないです。
38
+
39
+ ・If分岐がおかしいです。
40
+
41
+ ・変数に正常なデータが入っていません。
42
+
43
+
44
+
45
+ 3シート目以降を飛ばすのは新規追加した
46
+
47
+ ```VBA
48
+
49
+ If srcEndClm = endClm And srcEndClm < Rows.Count Then
50
+
51
+ ```
52
+
53
+ これが原因の可能性はあります。
54
+
55
+ srcEndClm = endClmなのですが一番最初の「処理」sheetと今の「処理」シートのcolumn数値が同じでなければ処理をしないになっています。
56
+
57
+ (まとめシートの数値は代入されていません)
58
+
59
+ Column数値にばらつきのあるsheetなら処理されないです。
60
+
61
+ srcEndClm < Rows.Countも行と列の比較になってるのでこのif文自体削除してもよさそうです。
62
+
63
+
64
+
65
+ またendRow変数がおかしいです。
66
+
67
+ ```VBA
68
+
69
+ If endRow = 0 Then
70
+
71
+ endClm = ws.Cells(1, Columns.Count).End(xlToLeft).Column
72
+
73
+ endRow = ws.Cells(Rows.Count, 4).End(xlUp).Row
74
+
75
+ ```
76
+
77
+ 最初の分岐では「処理データ」sheetのRowデータを扱っていますが
78
+
79
+ ```VBA
80
+
81
+ endRow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
82
+
83
+ ws.Range(ws.Cells(4, 1), ws.Cells(srcEndRow, endClm)).Copy newWS.Cells(endRow + 1, 1)
84
+
85
+ ```
86
+
87
+ 二回目のループからは「まとめ」sheetのRowデータを扱っています。(二行目は混ざってます)
88
+
89
+ データがないシートを飛ばしたいならその後にIf srcEndRow >= 4 Thenで分岐させて良いです。
90
+
91
+
92
+
93
+ endRowやwsがどちらのsheetを指しているのか本人でも分かりづらく間違えているのが原因なので、変数名をEnemyEndRowやNewWorksheetなど判別出来るように書いた方がよさそうです。
94
+
95
+ (Enemyも適切ではないのですが)
96
+
97
+ 自動メンバー表示のショートカットキー Ctri+J を使えばある程度長くても素早く入力出来ます。
98
+
99
+
100
+
101
+ ちなみに直すとこの形でしょうか。
102
+
103
+ ```VBA
104
+
105
+ 'endClmは使用していないため削除
106
+
107
+ '処理一回目でnewWS.Cells(3 + 1, 1)にするため
108
+
109
+ endRow = 3
110
+
111
+ For Each ws In ThisWorkbook.Worksheets
112
+
113
+ If ws.Name <> "まとめ" Then
114
+
115
+ '処理データのRowColumn取得
116
+
117
+ srcEndClm = ws.Cells(1, Columns.Count).End(xlToLeft).Column
118
+
119
+ srcEndRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
120
+
121
+ 'インデックス指定エラー回避
122
+
123
+ If srcEndRow >= 4 Then
124
+
125
+ 'ws.Cells(1, 1)ではなくws.Cells(4, 1)?
126
+
127
+ ws.Range(ws.Cells(4, 1), ws.Cells(srcEndRow, srcEndClm)).Copy newWS.Cells(endRow + 1, 1)
128
+
129
+ 'まとめデータのRowを取得して次回に使用
130
+
131
+ endRow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
132
+
133
+ End If
134
+
135
+ End If
136
+
137
+ Next ws
138
+
139
+ ```
140
+
141
+ 処理の流れ自体はほぼ間違ってなく、変数内データが確認出来ないまま対応しようとして道を外れていった印象です。
142
+
143
+ F8のステップインを使いつつローカルウィンドウで変数データを確認すると投稿主でも案外あっさり対応できるように感じました。

1

誤字の修正

2021/02/03 02:33

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,5 @@
1
+ 大幅に見間違えていたため修正しました。
2
+
1
3
  ```
2
4
 
3
5
  'Ctrl+↓
@@ -8,40 +10,16 @@
8
10
 
9
11
  endRow = ws.Cells(RowsCount, 1).End(xlUp).Row
10
12
 
11
- ```
12
13
 
14
+
15
+ endRow = endRow + srcEndRow - 1
16
+
13
- 操作としてはCtrl+↓を行っていることになりますが、空データのまとめシートを作成した後に参照しているためこの後でエラーが出ます。
17
+ endRow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
14
18
 
15
19
  ```
16
20
 
17
- '操作意図不明
21
+ 末尾取得はEnd(xlUp).Rowの方いいです。
18
22
 
19
- srcEndRow = ws.Cells(4, 1).End(xlDown).Row
23
+ End(xlDown).Rowの影響でデータがとびとびになったり正常に動きません。
20
24
 
21
- endRow = endRow + srcEndRow - 1
22
-
23
- '仮に10行目までデータがあったと仮定した場合、この式でループ
24
-
25
- 10 = ws.Cells(4, 1).End(xlDown).Row
26
-
27
- 19 = 10 + 10 - 1
28
-
29
- '末尾の正確な取得
30
-
31
- endRow = ws.Cells(RowsCount, 1).End(xlUp).Row
32
-
33
- ```
34
-
35
- また此処で不明な位置飛ぶようにっています。
25
+ 此処を直していけば想定通りの動作になるのでは?
36
-
37
- 例えば10行ある場合と仮定した場合、上記の式として扱われます。
38
-
39
- この場合、11~18行目は空になるためsrcEndRowが10,endRowが19の値で固定されるためデータが上書きされ続けます。
40
-
41
- 2sheetしか転記されない(上書きされている)のは此処が原因では?
42
-
43
-
44
-
45
- またプログラム的にもまとめシートの有無でチェックをしていないので手動でsheet削除を行わなければエラーになります。
46
-
47
- デバッグ的にも面倒なのでシートの存在確認を行った分岐が楽です。