🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

6734閲覧

VBA target を用いた複数行への入力方法

N_kota

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/03/10 12:40

Targetを用いて入力のあったセルの隣の列に日時を記録する

エクセルにて入力があったセルの隣の列に日時を記録する機能をtarget.offsetを用いて作っています。
複数行への同時入力(コピーペースト)を行いたいのですが、エラーとなりました(二次元配列となるので「型が一致しません」と表示されます)。

実行時エラー’13' 型が一致しません。

これまでのコード(この状態だと複数行への同時の入力が可能でした)

Private Sub Worksheet_Change(ByVal Target As Range) If Target.column = 3 Then 'C列に入力がある場合、D列に時間を記録  Application.EnableEvents = False  Target.Offset(,1).value = Now  Application.EnableEvents = True End If End Sub

試したこと:条件分岐の追加

このままだとC列の情報を削除した場合でもD列に記録されてしまうので、条件分岐を入れてC列が削除された時はD列の時間も同時に削除する仕様を試みました。

Private Sub Worksheet_Change(ByVal Target As Range) If Target.column = 3 Then 'C列に入力がある場合、D列に時間を記録 If Target.Offset(,0).Value = "" Then Application.EnableEvents = False 'C列を削除した場合、D列は空白となる Target.Offset(,1).value = "" Application.EnableEvents = True Else Application.EnableEvents = False Target.Offset(,1).value = Now Application.EnableEvents = True End If End If End Sub

この仕様にすると一行に対する処理は実行できましたが、ドラッグしてコピーする際にエラーを起こしてしまいました。
Targetの仕様上、複数範囲(二次元配列)に対する処理が行えないとありましたので、何か対応策、代替策などないでしょうか。
宜しくお願い致します。

補足情報(FW/ツールのバージョンなど)

仕様:MicrosoftExcel for Microsoft365 MSO

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

これではどうでしょうか。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 ' 3 If Target.Column = 3 Then 4 ' 5 Dim MyRange As Range 6 Dim TrRange As Range 7 Set TrRange = Range(Cells(Target.Row, 3), Cells(Target.Row + Target.Rows.Count - 1, 3)) 8 ' 9 For Each MyRange In TrRange 10 If MyRange.Value = "" Then 11 Application.EnableEvents = False 12 Cells(MyRange.Row, MyRange.Column + 1).Value = "" 13 Application.EnableEvents = True 14 Else 15 Application.EnableEvents = False 16 Cells(MyRange.Row, MyRange.Column + 1).Value = Now 17 Application.EnableEvents = True 18 End If 19 Next 20 ' 21 End If 22 ' 23End Sub

投稿2021/03/11 02:13

tosi

総合スコア553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

N_kota

2021/03/12 22:52

有り難うございます! お陰様で解決しました!
guest

0

For Each targetcell In Target.Cells とかではどうでしょう。


VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 For Each Target In Target.Cells 3 If Target.Column = 3 Then 'C列に入力がある場合、D列に時間を記録 4 If Target.Offset(, 0).Value = "" Then 5 Application.EnableEvents = False 'C列を削除した場合、D列は空白となる 6 Target.Offset(, 1).Value = "" 7 Application.EnableEvents = True 8 Else 9 Application.EnableEvents = False 10 Target.Offset(, 1).Value = Now 11 Application.EnableEvents = True 12 End If 13 End If 14 Next 15End Sub

投稿2021/03/10 12:49

編集2021/03/11 03:51
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

N_kota

2021/03/12 22:53

ご回答有り難うございます! 対応策が様々な方法があることが分かりました。 このようなやり方を色々と使ってみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問