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

回答編集履歴

3

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

2016/09/23 09:27

投稿

cesolution
cesolution

スコア217

answer CHANGED
@@ -44,3 +44,66 @@
44
44
  Range(Cells(A_LastRow + 2, 1), Cells(A_LastRow + 11, 2)).PasteSpecial
45
45
  ```
46
46
 
47
+ **2016/9/23/18:20**
48
+ [試験合否の記入欄]というのは、「結果」の欄で間違いないでしょうか?
49
+ つまり、「結果」の欄には、「OK」、「NG」、「未実施」の3通りの記述があり、「OK」、「NG」の場合は、表を追加し、「未実施」の場合は、表を追加しない、という認識で間違いなければ、以下のコードでお試しください。
50
+ 現在例として示されているエクセルの表と同様のものをこちらでも作成し、動作検証しました。
51
+ ```VBA
52
+ Option Explicit
53
+
54
+ Sub testCopy()
55
+
56
+ Dim LoopCount As Long 'ループカウンタ
57
+ Dim ID_Count As Long 'ループカウンタ
58
+ Dim ST_name As String '各試験シート
59
+ Dim Find_OK As Range 'B列OK取得
60
+ Dim Find_NG As Range 'B列NG取得
61
+ Dim No As Range 'B列未実施取得
62
+ Dim Find_No As Long 'Noを特定
63
+ Dim A_LastRow As Long '最終行A列セル
64
+
65
+ Worksheets("Sheet1").Activate
66
+ With Worksheets("Sheet1")
67
+
68
+ ' Sheet1のB列が空欄であればfor文を抜ける
69
+ LoopCount = Application.WorksheetFunction.CountIf(Range("B:B"), "A*")
70
+ For ID_Count = 6 To 6 + LoopCount
71
+
72
+ ' B列にシート名が記入されていれば処理を行う
73
+ If .Cells(ID_Count, 2).Value <> "" Then
74
+
75
+ ' シートにOKかNGのいずれかが記入されていれば表を追加する。
76
+ ST_name = .Cells(ID_Count, 2).Value
77
+ Sheets(ST_name).Activate
78
+
79
+ Set Find_OK = Worksheets(ST_name).Columns("B:B").Find("OK", lookat:=xlWhole)
80
+ Set Find_NG = Worksheets(ST_name).Columns("B:B").Find("NG", lookat:=xlWhole)
81
+ Set No = Worksheets(ST_name).Columns("B:B").Find(what:="未実施", lookat:=xlWhole)
82
+
83
+ Find_No = Worksheets(ST_name).Columns("A").Find(what:="No", lookat:=xlWhole).Row
84
+
85
+ If (Not Find_OK Is Nothing Or Not Find_NG Is Nothing) And No Is Nothing Then
86
+ Range(Cells(Find_No, 1), Cells(Find_No + 9, 2)).Copy
87
+
88
+ ' A列備考の最終行を特定
89
+ A_LastRow = Worksheets(ST_name).Cells(Rows.Count, 1).End(xlUp).Row
90
+ If Cells(A_LastRow, 1) = "備考" Then
91
+ '貼り付け
92
+ Range(Cells(A_LastRow + 2, 1), Cells(A_LastRow + 11, 2)).PasteSpecial
93
+
94
+ 'コピーしたマクロの記入欄に入力されている値を削除する
95
+ Worksheets(ST_name).Range(Worksheets(ST_name).Cells(A_LastRow + 2, 2), Worksheets(ST_name).Cells(A_LastRow + 10, 2)).ClearContents
96
+
97
+ End If
98
+
99
+ End If
100
+
101
+ End If
102
+
103
+ Next
104
+
105
+ End With
106
+
107
+ End Sub
108
+
109
+ ```

2

全体的に見直し

2016/09/23 09:27

投稿

cesolution
cesolution

スコア217

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  まず、ここまでご確認いただければと思います。
6
6
 
7
7
  2016/9/23/6:40追記
8
- もう1点気になったのですが、今回実行したいのは、「OKか、NGが記入されている場合に、表を追加する」ということですよね?であれば、
8
+ 1点気になったのですが、今回実行したいのは、「OKか、NGが記入されている場合に、表を追加する」ということですよね?であれば、
9
9
  ```VBA
10
10
  If Find_OK Is Nothing Or Find_NG Is Nothing Then
11
11
  ```
@@ -17,11 +17,30 @@
17
17
  If Notにしないと、Find_OKか、Find_NGに値がある時はEnd Ifに飛んでしまいます。
18
18
  Then~の記述を見ると、Find_OKかFind_NGに値がある時にNoをコピーして表を最終行の下に張り付けたいのかと思いますので、上述のように変更してステップ実行してみてください。
19
19
 
20
- また、同様の理由で以下も変更が必要かと思います。
20
+ また、全体的に見ていて気になった点を以下、先に記載しておきます。
21
+ Find_Noは、それ以降のコードを見る限りRangeオブジェクトではなく、A列のNOの行を取得したいということかと思いますので、
21
22
  ```VBA
22
- If Find_No Is Nothing Then
23
+ Find_No = Worksheets(ST_name).Columns("A").Find(What:="No", LookAt:=xlWhole).Row
23
24
  ```
24
-
25
+ にする必要があります。
26
+
27
+ また、当該範囲のコピーの書き方は、Cellsではなく、Rangeで以下のように記載します。
25
28
  ```VBA
26
- If Not Find_No Is Nothing Then
29
+ Range(Cells(Find_No, 1), Cells(Find_No + 9, 2)).Copy
27
30
  ```
31
+
32
+ また、以下のコードですが、A_LastRowは、行数で数値ですので、恐らく
33
+ ```VBA
34
+ If A_LastRow = "備考" Then
35
+ ```
36
+ ではなく、
37
+ ```VBA
38
+ If Cells(A_LastRow, 1) = "備考" Then
39
+ ```
40
+ かと思います。
41
+
42
+ 貼り付けのコードも、Pasteは使えませんので、以下に変更した方が良いかと思います。
43
+ ```VBA
44
+ Range(Cells(A_LastRow + 2, 1), Cells(A_LastRow + 11, 2)).PasteSpecial
45
+ ```
46
+

1

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

2016/09/22 21:57

投稿

cesolution
cesolution

スコア217

answer CHANGED
@@ -2,4 +2,26 @@
2
2
  私がパッと見た中で怪しいのは、以下の点です。
3
3
  1.添付いただいているエクセルの表では、B列のデータはA001、A002、、、となっていますが、マクロ側で検索をかけているのは、A_xxxという形式です。データ側をA_001とするか、Axxxという形式にした方が良いかと思います。
4
4
  2.For文のID_CountはIDCount=6 To 6+LoopCountではないでしょうか?
5
- まず、ここまでご確認いただければと思います。
5
+ まず、ここまでご確認いただければと思います。
6
+
7
+ 2016/9/23/6:40追記
8
+ もう1点気になったのですが、今回実行したいのは、「OKか、NGが記入されている場合に、表を追加する」ということですよね?であれば、
9
+ ```VBA
10
+ If Find_OK Is Nothing Or Find_NG Is Nothing Then
11
+ ```
12
+ ではなく、
13
+ ```VBA
14
+ If Not Find_OK Is Nothing Or Find_NG Is Nothing Then
15
+ ```
16
+ ということではないでしょうか。
17
+ If Notにしないと、Find_OKか、Find_NGに値がある時はEnd Ifに飛んでしまいます。
18
+ Then~の記述を見ると、Find_OKかFind_NGに値がある時にNoをコピーして表を最終行の下に張り付けたいのかと思いますので、上述のように変更してステップ実行してみてください。
19
+
20
+ また、同様の理由で以下も変更が必要かと思います。
21
+ ```VBA
22
+ If Find_No Is Nothing Then
23
+ ```
24
+
25
+ ```VBA
26
+ If Not Find_No Is Nothing Then
27
+ ```