回答編集履歴
3
未実施が記入されている場合、未実施のシートは除く
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
全体的に見直し
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
まず、ここまでご確認いただければと思います。
|
6
6
|
|
7
7
|
2016/9/23/6:40追記
|
8
|
-
|
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
|
-
|
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
|
-
|
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最終の検証結果についての追記
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
|
+
```
|