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

回答編集履歴

1

tuiki

2018/07/25 07:27

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -47,4 +47,66 @@
47
47
  ・A2やA3が変更された時はどんな動作?
48
48
 
49
49
  ここらへんがはっきりしないとアドバイスが難しいです。
50
- 追記・修正をお願いします。
50
+ 追記・修正をお願いします。
51
+
52
+ (回答を受けて追記)
53
+ ---
54
+ 整理すると
55
+ ・A1~A3のセルで値が入力されたタイミングで
56
+ ・A20~A18の空いているセルに転記する
57
+ といった感じであってますでしょうか。
58
+
59
+ 全てのセルに1回ずつしか値が入力されないのならよいのですが、Worksheet_Chagneイベントは値を変更するたびに発生しますので、A1⇒A2⇒A1(変更)としたときにA18まで転記してしまいそうですね。
60
+ ここらへんの仕様をどうするか、もう少し詰めた方がいいかもしれません。
61
+
62
+ ---
63
+ とりあえず各セルには1回ずつしか入力されない前提で、簡単なサンプルを提供させていただきます。
64
+ ```
65
+ Private Sub Worksheet_Change(ByVal target As Range)
66
+
67
+ 'A列以外は監視対象外
68
+ If target.Column > 1 Then Exit Sub
69
+
70
+ '30で割った余りが1~3となる行のみ処理(つまり各グループの先頭3行)
71
+ If (target.Row Mod 30) >= 1 And (target.Row Mod 30) <= 3 Then
72
+ If target.Value <> "" Then
73
+ Call tenki(target)
74
+ End If
75
+ Else
76
+ '対象外の行では何もしない
77
+ Exit Sub
78
+ End If
79
+ End Sub
80
+
81
+ Sub tenki(ByVal target As Range)
82
+
83
+ Dim i As Integer
84
+ Dim iRow_Fr As Integer
85
+ Dim iRow_To As Integer
86
+ Dim iRow_End As Integer
87
+
88
+ '転記元行
89
+ iRowFr = target.Row
90
+
91
+ 'グループ最終行
92
+ iRowEnd = target.Row - (target.Row Mod 30) + 20
93
+
94
+
95
+ '3行分のループ処理
96
+ For i = 0 To 2
97
+ '転記先の行番号
98
+ iRowTo = iRowEnd - i
99
+
100
+ If Cells(iRowTo, "A") = "" Then
101
+ '転記先のA列が空なら転記
102
+ Cells(iRowTo, "A") = Cells(iRowFr, "A")
103
+ Cells(iRowTo, "E") = 10
104
+ Cells(iRowTo, "F") = "abc"
105
+
106
+ '転記で来たらループ終了
107
+ Exit For
108
+ End If
109
+ Next
110
+ End Sub
111
+ ```
112
+ 同じセルに複数回入力したときとか、範囲クリアした時とか問題ありますが、とりあえずの参考までに。