Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
特定のセルにコピペでデータ入力された時に別セルに日付の表示
投稿日時: 21/12/21 15:22:27
投稿者: きなころん

品物の発注や納入を管理しているエクセルシートがあり
発注した日と納入した日付けが自動で入力できるようにならないかと思っています。
例えば
 
  品名  型式  数量    納入数
   A   B   C   D   E   F
 1 米1  F-21  3      1
 2 米2  B-33  1      1
 3 
 4
 5
 
品名・型式・数量は別のエクセルシートからデータをコピペして入力されている。
A列にデータが入力された時にD列には登録した日付を入れたい。
後日、品物が入ってきたらE列に納品された数量を記載するが、E列に入力した日付をF列に自動で入力したい。
 
で、下記の式をシートのデータに貼り付けた。
これだとコピペで数値を入力しても日付は出ず、手入力じゃないと日付は表示されませんでした。
 
数値コピペでも日付が表示されるように出来ないものなのでしょうか?
 
 
 
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Select Case Target.Column
Case 1
Cells(Target.Row, 4).Value = Date
Case 5
Cells(Target.Row, 6).Value = Date
End Select
End Sub

回答
投稿日時: 21/12/21 18:03:43
投稿者: mattuwan44

 >If Target.Count > 1 Then Exit Sub
 
ここで1列目以上の場合をはじいているので、5列目の場合は処理されません。
 
 >Select Case Target.Column
 
ここで列判定してますので、
If Target.Count > 1 Then Exit Sub
この行は要らなくないですか?

回答
投稿日時: 21/12/21 18:19:01
投稿者: mattuwan44

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim i As Long
    Set Target = Intersect(Me.Range("A:A,E:E"), Target) '変数TargetにA列かE列があればその範囲に限定する
    If Target Is Nothing Then Exit Sub                  'セル範囲に重なる部分が無ければ処理を抜ける
    If Target.Areas.Count > 1 Then Exit Sub             '飛び飛びのセル範囲があれば(A列とE列)、例外として抜ける
    
    '対象の列によりオフセット量を決める
    Select Case Target.Column
        Case 1: i = 3
        Case 5: i = 1
    End Select
    
    '所定のセル範囲へ日付を入力
    Target.Offset(, i).Value = Date
End Sub

 
サンプル書いてみました。
動作確認してないので、期待の結果が得られるか不明ですが、
考え方としてはこんな感じになるかと思いました。

回答
投稿日時: 21/12/21 18:54:46
投稿者: simple

If Target.Count > 1 Then Exit Sub
ということは、同時に二つ以上のセルに貼り付けすると、
以下の処理をせずに直ぐに抜けますよ。
そういう動作を手作業でしていませんか?

回答
投稿日時: 21/12/21 23:26:13
投稿者: simple

こういうことでは?

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim myRange As Range, r As Range
    
    Set myRange = Intersect(Target, Range("A1,E1").EntireColumn)
    If myRange Is Nothing Then Exit Sub
    Application.EnableEvents = False
    For Each r In myRange
        If r.Value <> "" Then
            Select Case r.Column
                Case 1
                    Cells(r.Row, "D").Value = Date
                Case 5
                    Cells(r.Row, "F").Value = Date
            End Select
        End If
    Next
    Application.EnableEvents = True
End Sub

投稿日時: 21/12/23 13:20:18
投稿者: きなころん

mattuwan44 様
 
ご教授ありがとうございます。
 
動作確認しました。
データが入力されていないセルにカーソルを合わせるだけで日付が入力されました。
日付はデータが入力されている箇所だけ欲しいです。
3行コピペした場合、日付は1行目だけ日付が入り、2・3行目は日付が表示されませんでした。
 

投稿日時: 21/12/23 13:45:12
投稿者: きなころん

simple 様
 
ご教授ありがとうございます。
 
別ファイルから複数行のデータをコピペしても
貼り付けられた行全てに日付の表示が出来るようになりました。
手入力で行った場合でも日付がちゃんと入力されます。
 
やりたい事ができるようになりとてもスッキリしています。
 
ありがとうございました。