|    | 
     アップ後、なんらかの(たとえばチェックする行を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 
 | 
     
    
   |