お世話になります。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, k As Long, myNum As Long
If Range("C1") <= Date - Day(Date) Then Exit Sub
If Not Intersect(Target, Range("C1,B9:B39")) Is Nothing And Target.Count = 1 Then
Application.EnableEvents = False
With Target
If .Column = 3 Then
myNum = WorksheetFunction.Max(Range("B9:B39"))
If IsDate(.Value) Then
For i = 9 To 39
If Cells(i, "A").Value = "" Then
Cells(i, "B").Value = ""
Else
Cells(i, "B") = myNum + i - 8
End If
Next i
End If
Else
i = .Row
If .Value = "" Then
Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents
Else
For k = i + 1 To 39
If Cells(k, "A").Value = "" Then
Cells(k, "B").Value = ""
Else
Cells(k, "B") = Cells(k - 1, "B") + 1
End If
Next k
End If
End If
End With
Application.EnableEvents = True
ElseIf Not Intersect(Target, Range("R8:R38")) Is Nothing Then
Application.EnableEvents = False
Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value
Application.EnableEvents = True
End If
End Sub
これはセルC1に年月を表記させ、そのC1セルの年月を変更した場合B9~B39のセルが自動で連続データの数字を記入し、B9~B39のどこかのセルを空白にすると、そのセル以降も空白になります。
そこで質問ですが、例えばB14の数字を消すとB15~39まで空白のセルになります。そして、B20に1と入力するとB21~39に連続データの数字が自動記入されます。
そしてC1の年月を次の月に更新した際は、B39で示された数字以降の連続データをB9に表示させるには、どうすれば良いでしょうか?
続けてお邪魔します。
B列の消去・R列の対応もやってみました。
尚、A列が「空白の場合・・・」の条件はおそらく、この月末部分の対応ではないかと思いましたので
勝手にその部分は割愛しています。
必要であればその部分も追加しておいてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, k As Long, myNum As Long, myMax As Long
If Intersect(Target, Range("C1,B9:B39,R9:R39")) Is Nothing Or Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
If IsDate(Range("C1")) Then
myMax = Day(WorksheetFunction.EoMonth(Range("C1"), 0))
End If
With Target
Select Case .Column
Case 3
If IsDate(.Value) = True And .Value > Date - Day(Date) Then
myNum = Cells(40, "B").End(xlUp)
Range("B9:B39").ClearContents
For i = 1 To myMax
Cells(i + 8, "B") = myNum + i
Next i
End If
Case 2
k = .Row
If .Value = "" Then
Range(Cells(k, "B"), Cells(39, "B")).ClearContents
Else
For i = k + 1 To myMax + 8
Cells(i, "B") = Cells(i - 1, "B") + 1
Next i
End If
Case Else
k = .Row
Range(Cells(k + 1, "R"), Cells(39, "R")).ClearContents
Range(Cells(k + 1, "R"), Cells(myMax + 8, "R")) = .Value
End Select
End With
Application.EnableEvents = True
End Sub
徐々にご希望の形に近づいているでしょうかね?m(_ _)m
No.2・3です。
小の月の対応ができたいなかったようでごめんなさい。
もう一度コードを載せてみます。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, k As Long, myNum As Long
If Intersect(Target, Range("C1,B9:B39,R9:R39")) Is Nothing Or Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
With Target
Select Case .Column
Case 3
If IsDate(.Value) = True And .Value > Date - Day(Date) Then
myNum = Cells(40, "B").End(xlUp)
For i = 1 To Day(WorksheetFunction.EoMonth(.Value, 0)) '←この行を変更(C1セルの月末数値まで)
Cells(i + 8, "B") = myNum + i
Next i
End If
Case 2
k = .Row
If .Value = "" Then
Range(Cells(k, "B"), Cells(39, "B")).ClearContents
Else
For i = k + 1 To 39
If Cells(i, "A") <> "" Then
Cells(i, "B") = Cells(i - 1, "B") + 1
End If
Next i
End If
Case Else
k = .Row
Range(Cells(k + 1, "R"), Cells(39, "R")) = .Value
End Select
End With
Application.EnableEvents = True
End Sub
※ 月末部が表示されている場合の消去は不要なのか?
※ R列も同様に対応しなければならないのか?
という疑問を持ちつつ・・・m(_ _)m
No.2です。
前回のコード内の
>If IsDate(.Value) = True And .Value > Date Then
を
>If IsDate(.Value) = True And .Value > Date - Day(Date) Then
に変更してください。
もう一度以前の質問を拝見すると、こうしないとお望み通りにならないと思います。
どうも失礼いました。m(_ _)m
こんばんは!
今までの質問を拝見しましたが、それぞれの回答で解決済みだと思い
敢えて顔を出しませんでした。
今までの質問を総合的にやってみると、↓のような感じでよいのでしょうかね?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, k As Long, myNum As Long
If Intersect(Target, Range("C1,B9:B39,R9:R39")) Is Nothing Or Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
With Target
Select Case .Column
Case 3
If IsDate(.Value) = True And .Value > Date Then
myNum = Cells(40, "B").End(xlUp)
For i = 1 To 31
Cells(i + 8, "B") = myNum + i
Next i
End If
Case 2
k = .Row
If .Value = "" Then
Range(Cells(k, "B"), Cells(39, "B")).ClearContents
Else
For i = k + 1 To 39
If Cells(i, "A") <> "" Then
Cells(i, "B") = Cells(i - 1, "B") + 1
End If
Next i
End If
Case Else
k = .Row
Range(Cells(k + 1, "R"), Cells(39, "R")) = .Value
End Select
End With
Application.EnableEvents = True
End Sub
※ ご希望通りの動きにならなかったらごめんなさいね。m(_ _)m
提示されたコードは話に出てこないA列やR列などが出てきて何がしたいのか良く解らなかったので1から作り直しました。
こんな感じです。
Private Sub Worksheet_Change(ByVal Target As Range)
'複数セルが更新された場合は処理なし
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
If Target.Address = "$C$1" And IsDate(Target) Then
'変更したのがC1で日付型の値だった場合の処理
'最終値を取得
nData = 0
If WorksheetFunction.Count(Range("B9:B39")) > 0 Then
nData = Range("B40").End(xlUp).Value
End If
'最終値の続きの値をB9:B39に入れる
For i = 1 To 31
nData = nData + 1
Cells(8 + i, "B") = nData
Next i
ElseIf Target.Column = 2 And Target.Row >= 9 And Target.Row <= 39 Then
'変更したのがB9:B39のどれかだった場合の処理
If Target = "" Then
'セルの値を空白にしたらそれ以下のセルも空白にする
Range("B" & Target.Row & ":B39") = ""
ElseIf Target = 1 Then
'セルの値を1にしたらそれ以下のセルは1からの連番にする
nData = 0
For j = Target.Row To 39
nData = nData + 1
Cells(j, "B") = nData
Next j
End If
End If
Application.EnableEvents = True
End Sub
お礼
この度はありがとうございました。 VBAに関してはあまり詳しくない為、勉強になりました。 おっしゃる通りです、これでは私の勉強になりません。頼りすぎました。 今後、自分で勉強し今度は自分でしっかりとVBAを組める様に努力します。 その上で分からない事があれば、また宜しくお願いします。 この度は長い間付き合って下さり感謝申し上げます。