回答編集履歴

3

未実施が記入されている場合、未実施のシートは除く

2016/09/23 09:27

投稿

cesolution
cesolution

スコア217

test CHANGED
@@ -90,4 +90,130 @@
90
90
 
91
91
 
92
92
 
93
-
93
+ **2016/9/23/18:20**
94
+
95
+ [試験合否の記入欄]というのは、「結果」の欄で間違いないでしょうか?
96
+
97
+ つまり、「結果」の欄には、「OK」、「NG」、「未実施」の3通りの記述があり、「OK」、「NG」の場合は、表を追加し、「未実施」の場合は、表を追加しない、という認識で間違いなければ、以下のコードでお試しください。
98
+
99
+ 現在例として示されているエクセルの表と同様のものをこちらでも作成し、動作検証しました。
100
+
101
+ ```VBA
102
+
103
+ Option Explicit
104
+
105
+
106
+
107
+ Sub testCopy()
108
+
109
+
110
+
111
+ Dim LoopCount As Long 'ループカウンタ
112
+
113
+ Dim ID_Count As Long 'ループカウンタ
114
+
115
+ Dim ST_name As String '各試験シート
116
+
117
+ Dim Find_OK As Range 'B列OK取得
118
+
119
+ Dim Find_NG As Range 'B列NG取得
120
+
121
+ Dim No As Range 'B列未実施取得
122
+
123
+ Dim Find_No As Long 'Noを特定
124
+
125
+ Dim A_LastRow As Long '最終行A列セル
126
+
127
+
128
+
129
+ Worksheets("Sheet1").Activate
130
+
131
+ With Worksheets("Sheet1")
132
+
133
+
134
+
135
+ ' Sheet1のB列が空欄であればfor文を抜ける
136
+
137
+ LoopCount = Application.WorksheetFunction.CountIf(Range("B:B"), "A*")
138
+
139
+ For ID_Count = 6 To 6 + LoopCount
140
+
141
+
142
+
143
+ ' B列にシート名が記入されていれば処理を行う
144
+
145
+ If .Cells(ID_Count, 2).Value <> "" Then
146
+
147
+
148
+
149
+ ' シートにOKかNGのいずれかが記入されていれば表を追加する。
150
+
151
+ ST_name = .Cells(ID_Count, 2).Value
152
+
153
+ Sheets(ST_name).Activate
154
+
155
+
156
+
157
+ Set Find_OK = Worksheets(ST_name).Columns("B:B").Find("OK", lookat:=xlWhole)
158
+
159
+ Set Find_NG = Worksheets(ST_name).Columns("B:B").Find("NG", lookat:=xlWhole)
160
+
161
+ Set No = Worksheets(ST_name).Columns("B:B").Find(what:="未実施", lookat:=xlWhole)
162
+
163
+
164
+
165
+ Find_No = Worksheets(ST_name).Columns("A").Find(what:="No", lookat:=xlWhole).Row
166
+
167
+
168
+
169
+ If (Not Find_OK Is Nothing Or Not Find_NG Is Nothing) And No Is Nothing Then
170
+
171
+ Range(Cells(Find_No, 1), Cells(Find_No + 9, 2)).Copy
172
+
173
+
174
+
175
+ ' A列備考の最終行を特定
176
+
177
+ A_LastRow = Worksheets(ST_name).Cells(Rows.Count, 1).End(xlUp).Row
178
+
179
+ If Cells(A_LastRow, 1) = "備考" Then
180
+
181
+ '貼り付け
182
+
183
+ Range(Cells(A_LastRow + 2, 1), Cells(A_LastRow + 11, 2)).PasteSpecial
184
+
185
+
186
+
187
+ 'コピーしたマクロの記入欄に入力されている値を削除する
188
+
189
+ Worksheets(ST_name).Range(Worksheets(ST_name).Cells(A_LastRow + 2, 2), Worksheets(ST_name).Cells(A_LastRow + 10, 2)).ClearContents
190
+
191
+
192
+
193
+ End If
194
+
195
+
196
+
197
+ End If
198
+
199
+
200
+
201
+ End If
202
+
203
+
204
+
205
+ Next
206
+
207
+
208
+
209
+ End With
210
+
211
+
212
+
213
+ End Sub
214
+
215
+
216
+
217
+ ```
218
+
219
+

2

全体的に見直し

2016/09/23 09:27

投稿

cesolution
cesolution

スコア217

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  2016/9/23/6:40追記
14
14
 
15
- もう1点気になったのですが、今回実行したいのは、「OKか、NGが記入されている場合に、表を追加する」ということですよね?であれば、
15
+ 1点気になったのですが、今回実行したいのは、「OKか、NGが記入されている場合に、表を追加する」ということですよね?であれば、
16
16
 
17
17
  ```VBA
18
18
 
@@ -36,20 +36,58 @@
36
36
 
37
37
 
38
38
 
39
- また、同様の理由で以下も変更が必要かと思います。
39
+ また、全体的に見ていて気になった点を以下、先に記載しておきます。
40
+
41
+ Find_Noは、それ以降のコードを見る限りRangeオブジェクトではなく、A列のNOの行を取得したいということかと思いますので、
40
42
 
41
43
  ```VBA
42
44
 
43
- If Find_No Is Nothing Then
45
+ Find_No = Worksheets(ST_name).Columns("A").Find(What:="No", LookAt:=xlWhole).Row
44
46
 
45
47
  ```
46
48
 
47
-
49
+ にする必要があります。
50
+
51
+
52
+
53
+ また、当該範囲のコピーの書き方は、Cellsではなく、Rangeで以下のように記載します。
48
54
 
49
55
  ```VBA
50
56
 
51
- If Not Find_No Is Nothing Then
57
+ Range(Cells(Find_No, 1), Cells(Find_No + 9, 2)).Copy
52
58
 
53
59
  ```
54
60
 
55
61
 
62
+
63
+ また、以下のコードですが、A_LastRowは、行数で数値ですので、恐らく
64
+
65
+ ```VBA
66
+
67
+ If A_LastRow = "備考" Then
68
+
69
+ ```
70
+
71
+ ではなく、
72
+
73
+ ```VBA
74
+
75
+ If Cells(A_LastRow, 1) = "備考" Then
76
+
77
+ ```
78
+
79
+ かと思います。
80
+
81
+
82
+
83
+ 貼り付けのコードも、Pasteは使えませんので、以下に変更した方が良いかと思います。
84
+
85
+ ```VBA
86
+
87
+ Range(Cells(A_LastRow + 2, 1), Cells(A_LastRow + 11, 2)).PasteSpecial
88
+
89
+ ```
90
+
91
+
92
+
93
+

1

9/22最終の検証結果についての追記

2016/09/22 21:57

投稿

cesolution
cesolution

スコア217

test CHANGED
@@ -7,3 +7,49 @@
7
7
  2.For文のID_CountはIDCount=6 To 6+LoopCountではないでしょうか?
8
8
 
9
9
  まず、ここまでご確認いただければと思います。
10
+
11
+
12
+
13
+ 2016/9/23/6:40追記
14
+
15
+ もう1点気になったのですが、今回実行したいのは、「OKか、NGが記入されている場合に、表を追加する」ということですよね?であれば、
16
+
17
+ ```VBA
18
+
19
+ If Find_OK Is Nothing Or Find_NG Is Nothing Then
20
+
21
+ ```
22
+
23
+ ではなく、
24
+
25
+ ```VBA
26
+
27
+ If Not Find_OK Is Nothing Or Find_NG Is Nothing Then
28
+
29
+ ```
30
+
31
+ ということではないでしょうか。
32
+
33
+ If Notにしないと、Find_OKか、Find_NGに値がある時はEnd Ifに飛んでしまいます。
34
+
35
+ Then~の記述を見ると、Find_OKかFind_NGに値がある時にNoをコピーして表を最終行の下に張り付けたいのかと思いますので、上述のように変更してステップ実行してみてください。
36
+
37
+
38
+
39
+ また、同様の理由で以下も変更が必要かと思います。
40
+
41
+ ```VBA
42
+
43
+ If Find_No Is Nothing Then
44
+
45
+ ```
46
+
47
+
48
+
49
+ ```VBA
50
+
51
+ If Not Find_No Is Nothing Then
52
+
53
+ ```
54
+
55
+