ここから本文です

excel(マクロ)で入力したセルの隣のセルに入力した日付、時間を入れたいのですが...

アバター

ID非公開さん

2017/6/2500:11:35

excel(マクロ)で入力したセルの隣のセルに入力した日付、時間を入れたいのですが、よい方法をお教えください。

たとえば、持ち出しでA1を数字を入力したらB1に日時
返却したらM1に数字を入力したらN1に日時を自動入力したい

B1は下記のマクロを検索でみつけたので解決したのですが、返却日時をN1に組み込む方法がわかりません。
なにぶん、マクロは初めてでまったく意味がわからないので理解のあるかた、教えてください。
よろしくお願いいたします。

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Application.Intersect(Range("A1:A1000"), Target) Is Nothing Then Exit Sub
If .Count > 1 Then Exit Sub
If IsEmpty(.Value) Then
.Offset(, 1).ClearContents
Else
.Offset(, 1).Value = Format(Now, "yyyy年 m月 d日 hh時mm分")
End If
End With
End Sub

閲覧数:
152
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

a_h********さん

2017/6/2500:55:52

0)Private Sub Worksheet_Change(ByVal Target As Range)
1)With Target
2) If Application.Intersect(Range("A1:A1000"), Target) Is Nothing Then Exit Sub
3)If .Count > 1 Then Exit Sub
4) If IsEmpty(.Value) Then
5) .Offset(, 1).ClearContents
6) Else
7) .Offset(, 1).Value = Format(Now, "yyyy年 m月 d日 hh時mm分")
8)End If
9) End With

0はシートがの値が変化したら、セル番地を変数Targetとして扱う
1と9は Targetを大前提として処理を行う
2はTargetのセル番地がA1:A1000の範囲なら3以下の処理はせず終了
3はTargetの範囲が複数なら3以下の処理はせず終了
4はTargetのセルが未入力なら 5を処理、
5はTargetのセルの右隣の内容を消去
6は4の条件の分岐で、4の条件と一致しない場合 7を処理
7はTargetのセルの右隣のセルに、現在日時を入力
8は3の条件の判断はここまで

で「Offset(, 1)」は右隣のセルを指定してます
Offset(行の変化,列の変化)で列の変化が+1しますので、A列ならB列の同じセルを指定したことになります。

で、本題。
>返却したらM1に数字を入力したらN1に日時を自動入力したい
ですから
元との違いはA列か、M列かということになります。
ので
2行目の
If Application.Intersect(Range("A1:A1000"), Target) Is Nothing Then Exit Sub
を、A列だけでなくM列もと言うことですから
If Application.Intersect(Range("A1:A1000"), Target) Is Nothing And Application.Intersect(Range("M1:M1000"), Target) Is Nothing Then Exit Sub
と、「どちらにもなければ」を条件に変更するだけで解決しますよ。

もちろん

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Application.Intersect(Range("A1:A1000"), Target) Is Nothing Then Exit Sub
If .Count > 1 Then Exit Sub
If IsEmpty(.Value) Then
.Offset(, 1).ClearContents
Else
.Offset(, 1).Value = Format(Now, "yyyy年 m月 d日 hh時mm分")
End If
End With
With Target
'ここからが追加行
If Application.Intersect(Range("M1:M1000"), Target) Is Nothing Then Exit Sub
If .Count > 1 Then Exit Sub
If IsEmpty(.Value) Then
.Offset(, 1).ClearContents
Else
.Offset(, 1).Value = Format(Now, "yyyy年 m月 d日 hh時mm分")
End If
End With
'ここまでが追加行
End Sub

としても、OKです。
行の追加した内容は、元の内容をそのままコピーして、「A1:A1000」を「M1:M1000」に変更しただけです。
'ここからが追加行
'ここまでが追加行
の範囲が、「M1:M1000」の範囲の場合に処理される分になります。
今後追加するのなら、後者の変更方法の方が理解はしやすいと思いますが、命令の行数が増えるのでスマートではありません。

  • a_h********さん

    2017/6/2500:56:49

    誤:0はシートがの値が変化したら、セル番地を変数Targetとして扱う

    正:0はシートの値が変化したら、セル番地を変数Targetとして扱う

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

アバター

質問した人からのコメント

2017/6/25 20:23:23

回答、ありがとうございました。
詳しく、説明していただいたのでマクロを理解できるようにがんばりたいと思います。
明日、会社で試してみます。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

tai********さん

2017/6/2507:19:59

下記のマクロを検索でみつけたので解決しているなら、

Intersect(Range("A1:A1000"), Target)の部分にM1:M1000を追加するだけではないですか?

M1:M1000はちょっと長くなるのでM:Mでいいと思います。

Intersect(Range("A:A,M:M"), Target)
A列、M列とTargetの共通範囲、ということです。

If Application.Intersect(Range("A:A,M:M"), Target) Is Nothing Then Exit Sub
変化したセルと、A列、M列に共通範囲がなければ何もしない、と訳すことができます。



ここを変更するだけでA列もM列も前のコードと同じ動作をします。

でも、たとえばA列の数値をまとめて削除したとき
If .Count > 1 Then Exit Sub
なので何も起きないですね。これは次の課題になると思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

aka********さん

2017/6/2500:36:47

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column() = 1 Then
Range("B" & Target.Row) = Date
End If
If Target.Column() = 13 Then
Range("N" & Target.Row) = Date
End If
End Sub

で 試してください。

日付は セルの書式設定で 好きな設定に してください。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる