2017-11-06 11 views
2

セル(列K)に日付が含まれているかどうかを自動的にチェックするコードを作成していました。列Kに日付が含まれておらず、列Lの日付が30日以上前の場合は、エラーが発生します。すべての日付がVBAによって認識されるわけではありません

私のコードは動作することがわかりましたが、すべての日付で動作するわけではありません。だから私はDebug.printと彼はちょうどifの要件を満たしていないという事実を無視して見た。私はこれを経験したことがありません。

これは、私は、セル22217は、彼がエラーを与える必要がありますケースが含まれていることを発見したコード(それの下でデバッグを見つけることができます)

Aantal = 0 
i = 0 
LastRow = 0 
k = 0 
LastRow = ThisWorkbook.Sheets("Acknowledgements follow up").Range("A1").End(xlDown).Row 
'For i = 2 To LastRow 
For i = 22214 To 22222 
Debug.Print ActiveWorkbook.Sheets("Acknowledgements follow up").Range("L" & i).Value & "  " & ActiveWorkbook.Sheets("Acknowledgements follow up").Range("K" & i) + 30 & "  "; Date & vbCrLf 
    If ActiveWorkbook.Sheets("Acknowledgements follow up").Range("L" & i).Value = "" And ActiveWorkbook.Sheets("Acknowledgements follow up").Range("K" & i) + 30 > Date Then 
    Aantal = Aantal + 1 
    MsgString = MsgString & i & "/" 
    End If 
Next i 
If MsgString <> "" Then MsgString = Left(MsgString, Len(MsgString) - 3) 

If Aantal > 1 Then 
MsgBoxAnswer = MsgBox("There are " & Aantal & " dates missing in the acknowlegement sheet" & vbCrLf _ 
& "The missing dates are on rows " & MsgString, vbOKOnly + vbExclamation, "Missing dates") 
End If 

If Aantal = 1 Then 
MsgBoxAnswer = MsgBox("There is " & Aantal & " date missing in the acknowlegement sheet" & vbCrLf _ 
& "The missing date is on row " & MsgString, vbOKOnly + vbExclamation, "Missing dates") 
End If 

です。しかし、彼はそうではありません、文書全体が29000以上の行を含んでいます。それは私に58のエラーを与えるが、現実にはより多くの方法がある。

これは私が得たデバッグ情報(日付が空の場合(列L)/列K + 30日/今日を確認してください)

05-08-13 01-09-13 06-11-です17

05-08-13 01-09-13 06-11-17

05-08-13 01-09-13 06-11-17

01-09-13  06-11-17 

05-08- 13 04-09-13 06-11-17

06-08-13 04-09-13 06-11-17

05-08-13 04-09-13 06-11-17

05-08-13 04-09 -13 06-11-17

30-12-13 04-09-13 06-11-17

あなたはそれがその行22217が空で、日付が30以上である認識して見ることができるように日々。だからそれは引き起こされるべきです。私はそれが正常に動作しないこの行であることを知りました:ActiveWorkbook.Sheets("Acknowledgements follow up").Range("K" & i) + 30 > Date

アイデア? ありがとう! かわる

+0

このコードは、セルに日付があるかどうかを確認するだけです。 – dwirony

+0

何かがペーストで間違っていました:)私はそれを修正しました – KawaRu

+0

@cxw列Lが空で、列Kが30日より古いかどうかをチェックします。これらの2つの要件が満たされている場合は、ポップアップを表示する必要があります。それは何らかの理由ではありません。私は私の説明でそれを修正しました。指摘してくれてありがとう! – KawaRu

答えて

4

これは、30日より古い日付テストするために私のシステム上で動作します。私のテストデータ

Option Explicit ' Always start every VBA file with this 
Option Base 0 ' Not as important, but I use it as a reminder to myself 

Public Sub KawaRu() 
    Dim CL As Long, CK As Long ' Column numbers for L, K 
    CL = AscW("L") - AscW("A") + 1 
    CK = AscW("K") - AscW("A") + 1 

    ' Always Dim your variables, and use Option Explicit 
    Dim aantal As Long, i As Long, LastRow As Long, k As Long 
    Dim MsgString As String 
    aantal = 0 
    i = 0 
    k = 0 

    ' Avoid repeating references to objects. Instead, save them in a variable. 
    Dim sh As Worksheet 
    Set sh = ActiveWorkbook.Sheets("Acknowledgements follow up") 

    LastRow = sh.Range("A1").End(xlDown).Row 

    For i = 1 To LastRow 
     Debug.Print sh.Range("L" & i).Value, sh.Range("K" & i) + 30, Date 
     ' Use Cells() for speed when you're in a loop. 
     If sh.Cells(i, CL).Value = "" And _ 
       sh.Cells(i, CK) < (Date - 30) Then 
       ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ older than 30 days 
      aantal = aantal + 1 
      MsgString = MsgString & i & "/" 
     End If 
    Next i 

    Debug.Print aantal 
    If MsgString <> "" Then MsgString = Left(MsgString, Len(MsgString) - 3) 

    Dim MsgBoxAnswer As VbMsgBoxResult 

    If aantal > 1 Then 
     MsgBoxAnswer = MsgBox("There are " & aantal & " dates missing in the acknowlegement sheet" & vbCrLf _ 
      & "The missing dates are on rows " & MsgString, vbOKOnly + vbExclamation, "Missing dates") 
    End If 

    If aantal = 1 Then 
     MsgBoxAnswer = MsgBox("There is " & aantal & " date missing in the acknowlegement sheet" & vbCrLf _ 
     & "The missing date is on row " & MsgString, vbOKOnly + vbExclamation, "Missing dates") 
    End If 

End Sub 

されました:

col. A  K    L    M 
x   5/8/2013  1/9/2013  6/11/2017 
x   1/9/2013      6/11/2017 
x   1/9/2013      6/11/2017 
x   11/1/2017     6/11/2017 

私が得る結果は次のとおりです。

There are 2 dates missing in the acknowledgement sheet 
The missing dates are on rows 2/ 3 

編集

アルゴリズムの問​​題は日付テストでした。 Kx + 30 > Dateは、列Kの値が過去30日以内で、30日を超えていないかどうかをテストします。上記のコードでは、Kx < (Date - 30)は30日以上経過したことをテストしています。 (Kx + 30) < Date(以下)は同じことを行います。

上記のコードの改善点は、CKCLと名前を変更することです。 の位置の後に名前を付ける代わりに、の意味の後に名前を付けます。たとえば、COL_ACK_RECEIVEDまたは何か。後でそれに戻ったときにコードを理解しやすくなります。 @HarassedDadコメントで述べたよう

編集2

  • は、D/M/Y対M/D/Y及び他の日付フォーマットの問題に注意してください。
  • 「30日以上」は、ご要望に応じて< Date - 30または<= Date - 30を意味する場合があります。
  • これを適応させる将来の読者にとっては、「30日前」と「先月」は非常に異なることに注意してください。
  • This answerについては、Range.Valueが良いです。 Range.ValueがVariantを返すので、CStr()または他のコンバータ関数を使用することをお勧めします。
  • This questionおよびthis questionとその回答は、よく読まれています。 = ""が空であると思われるセルと常に一致するとは限りません。
+0

これは確かに動作します!ありがとう、まだいくつかの行のために動作するように私のコードで何が問題になったのか分からない。 あなたのヒントをありがとう、私はそれらを念頭に置いておきます:) 素敵な一日を! – KawaRu

+0

01-09-13は2013年9月1日または2013年1月9日のいずれかであることを覚えておいてください。そのExcelでは、同じ方法で日付を一貫して解釈しません。 (実際には、あなたの地域の設定に応じて、2001年9月13日に状況によって解釈される可能性があります) –

+0

私はこの回答を2回upvoteできます。実際、私はすべてのSO回答者が自分の投稿に多くの努力を払うことを願っています!彼らは来てください! –

関連する問題