|
アップ後、なんらかの(たとえばチェックする行をB列以外にした場合)変更時の
対応を、よりすうー図にするため1行変更して再度アップします。
▼けい さん:
こんにちは
セルの値が日付かどうかということは悩ましいものがありますね。
ですのでアップされたコードでは 数値の 1 以上かどうかを判定、
あるいはkanabunさんのコードでは、より現実的に 40000 以上かどうかを
判定しておられますね。
たとえば IsDate という関数があります。
セルに 2012/5/29 と入っていたとして、IsDate は True になります。
ところが、このセルの表示書式を 標準 にしますと 41058 という
シリアル値に変換されますけど、これを IsDate で判定しますと False になります。
で、日付かどうかという条件を、もう少し限定して、
【セルの上で日付として表示されているかどうか】ということにしますと、
以下のようなことでもいいかもしれません。
パターンは 1->2->3->4 の優先順位にしています。なので、申し上げたように
パターン 4 はありえないのですけど。
Sub 日付チェック2()
Dim c As Range
Dim dS As Variant
Dim dT As Variant
Dim dU As Variant
Dim dW As Variant
Dim dX As Variant
Dim dY As Variant
Dim ans As Variant
Dim v() As Variant
Dim k As Long
With Sheets("★★★")
With .Range("B4", .Range("B" & .Rows.Count).End(xlUp))
ReDim v(1 To .Rows.Count, 1 To 1)
For Each c In .Cells
If c.Value = "●" Then
With c.EntireRow
dS = .Range("S1").Value
dT = .Range("T1").Value
dU = .Range("U1").Value
dW = .Range("W1").Value
dX = .Range("X1").Value
dY = .Range("Y1").Value
ans = ""
If IsDate(dS) And IsDate(dT) And IsDate(dY) Then
ans = 1
ElseIf IsDate(dS) And IsDate(dT) And IsDate(dU) Then
ans = 2
ElseIf IsDate(dS) And IsDate(dT) Then
ans = 3
ElseIf IsDate(dS) And IsDate(dT) And IsDate(dW) And IsDate(dX) Then
ans = 4
Else
ans = ""
End If
k = k + 1
v(k, 1) = ans
End With
End If
Next
.Offset(, Columns("AR").Column - .Column).Value = v
End With
End With
MsgBox "判定して転記しました"
End Sub
|
|