VBAのワークシートイベントを使用した値の転記を繰り返して行う、値をクリアした場合転記先の値もクリアする。
値の転記は、対象行に末尾から転記していく。対象行に値が入力されていたら、一つ上の行に転記する。
値の転記はうまく行えたが、繰り返し処理の方法が分からない。
またクリア処理が実行されない。
1グループ3項目の転記を10グループで同じように行いたいです。
A1セルからA3セルに入力されたら、20行目から18行目に転記する。
次のグループはA31セルからA33セルで、
50行目から48行目に入力する。
次のグループは30行ごとプラスされる。
VBA
1 2'ワークシートモジュール 3Private Sub Worksheet_Change(ByVal Target As Range) 4 5Select case target.address 6 7case$A$1 8set target = range("A1") 9 10If target.value<>"" then 11Call grp1_1 12Endif 13 14End Select 15End Sub 16 17'標準モジュール 18sub grp1-1() 19 20If range("A20")="" then 21 22range("A20")= range("A1") 23range("E20")=10 24range("F20")="abc" 25End If 26End sub
クリア処理は、
ElseIf target.value="" then
としましたが駄目でした。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
記載コードについて
質問のコードはVBAですよね?本当に動いた実績のあるコードでしょうか?
・VBAでは関数名にハイフン(-)は使用できません。転記ミス?
・Selectに対するCase文の条件記述が間違っている。Adressプロパティで分岐するなら"$A$1"のように文字列型で記述する
・Select/Ifに対するEnd Select/End Ifの記述がない。
・select target = range("A1")
は何をしたい?代入?TargetがA1の場合に入る処理でTargetにA1をセットしなおしている??
間違った情報を記載されていては正しい回答はなかなか得られません。
まずは正しい情報を記載しましょう。
クリア処理について
>クリア処理は、
>ElseIf target.value="" then
>としましたが駄目でした。
とのことですが、例えば
If target.value<>"" then Call grp1_1 ElseIf target.value="" then 'ここにクリア処理を記述 Call grp_Clear() End If
というような記述をされていればクリア処理(上記ではgrp_Clearという関数)が実行されるはずです。
ちなみにElseIf
に続けて記述されているtarget.value=""
の部分は代入ではなく条件式です。
target.value
に空文字をセットしているわけではないのですが、そこは大丈夫でしょうか?
なお上記のIf文であれば第2条件は第1条件の裏返しですので、ElseIf
ではなくElse
でも同等の動きをすると思います。
ループ処理について
プログラムでループ処理というと、1つの処理を実行する中で、特定の処理を繰り返し行うようなものを言います。
今回行いたいループ処理とは、「どんなタイミング」で「どこからどこまでの範囲」でループを行いたいのかがよくわかりません。
例えば記載いただいたコードでは
・A1セルに値を入力したタイミングで
・A20、E20、F20に値をセットする
といった処理を行っています。
今回期待するループ処理とは
・A1に値をセットしたタイミングで、A1⇒A20、A2⇒A19、A3⇒A18・・・A10⇒A11の転記を行いたい?
・同様にA31に値をセットしたタイミングで、A31⇒A50、A32⇒A49、A33⇒A48の転記を行いたい?
・A2やA3が変更された時はどんな動作?
ここらへんがはっきりしないとアドバイスが難しいです。
追記・修正をお願いします。
(回答を受けて追記)
整理すると
・A1~A3のセルで値が入力されたタイミングで
・A20~A18の空いているセルに転記する
といった感じであってますでしょうか。
全てのセルに1回ずつしか値が入力されないのならよいのですが、Worksheet_Chagneイベントは値を変更するたびに発生しますので、A1⇒A2⇒A1(変更)としたときにA18まで転記してしまいそうですね。
ここらへんの仕様をどうするか、もう少し詰めた方がいいかもしれません。
とりあえず各セルには1回ずつしか入力されない前提で、簡単なサンプルを提供させていただきます。
Private Sub Worksheet_Change(ByVal target As Range) 'A列以外は監視対象外 If target.Column > 1 Then Exit Sub '30で割った余りが1~3となる行のみ処理(つまり各グループの先頭3行) If (target.Row Mod 30) >= 1 And (target.Row Mod 30) <= 3 Then If target.Value <> "" Then Call tenki(target) End If Else '対象外の行では何もしない Exit Sub End If End Sub Sub tenki(ByVal target As Range) Dim i As Integer Dim iRow_Fr As Integer Dim iRow_To As Integer Dim iRow_End As Integer '転記元行 iRowFr = target.Row 'グループ最終行 iRowEnd = target.Row - (target.Row Mod 30) + 20 '3行分のループ処理 For i = 0 To 2 '転記先の行番号 iRowTo = iRowEnd - i If Cells(iRowTo, "A") = "" Then '転記先のA列が空なら転記 Cells(iRowTo, "A") = Cells(iRowFr, "A") Cells(iRowTo, "E") = 10 Cells(iRowTo, "F") = "abc" '転記で来たらループ終了 Exit For End If Next End Sub
同じセルに複数回入力したときとか、範囲クリアした時とか問題ありますが、とりあえずの参考までに。
投稿2018/07/25 05:26
編集2018/07/25 07:27総合スコア3020
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2018/07/25 06:30

退会済みユーザー
2018/07/25 12:37

退会済みユーザー
2018/07/31 11:58 編集

退会済みユーザー
2018/08/01 03:11

退会済みユーザー
2018/08/01 06:26

退会済みユーザー
2018/08/07 05:02

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。