XL 2016 Erreur 2042 dans une recherche de date

apt

XLDnaute Impliqué
Bonjour à tous,

Je dois rechercher une date DateCrit dans la colonne A, mais voila, ce me génère une erreur 2042 sur cette ligne :

VB:
' Recherche la date dans la colonne A
dateRow = Application.Match(DateCrit, ws2.Range("A2:A" & ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row), 0)

Comment résoudre ce problème ?

Merci d'avance.
 

Pièces jointes

  • Recherche_Date.xlsm
    16.4 KB · Affichages: 6
Dernière édition:
Solution
Je ne vois toujours pas l'intéret d'un code aussi long pour si peu
et pourquoi déclarer une variable "DateCrit" juste pour recopier Target

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or IsEmpty(Target) Then Exit Sub
    If Not Intersect(Target, Range("C2")) Is Nothing Then
        if not isdate(target) then
            msgbox "il ne s'agit pas d'une date valide"
            exit sub
        end if
        With ActiveSheet.Range("A:A")
             Set trouve = .Find(Target, LookIn:=xlValues)
            If Not trouve Is Nothing Then
                MsgBox "date trouvée à la ligne: " & trouve.Row
           else
              msgbox "Date introuvable"
            End If
        End With
    End If
End...

vgendron

XLDnaute Barbatruc
après. ca me semble une très longue macro juste pour trouver une date

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or IsEmpty(Target) Then Exit Sub
    If Not Intersect(Target, Range("C2")) Is Nothing Then
        With ActiveSheet.Range("A:A")
             Set trouve = .Find(Target, LookIn:=xlValues)
            If Not trouve Is Nothing Then
                MsgBox "date trouvée à la ligne: " & trouve.Row
            End If
        End With
    End If
End Sub
 

apt

XLDnaute Impliqué
mais à aucun moment tu dis à VBA que DateCrit

J'ai compris, merci.

Cependant, dans mon code global sur lequel je travaille, DateCrit est défini dans le cours d'exécution du code, et à servit dans plusieurs calculs sans erreurs, mais à chaque fois que cette est atteinte :

VB:
' Recherche la date dans la colonne A
dateRow = Application.Match(DateCrit, ws2.Range("A2:A" & ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row), 0)

l'erreur 2042 est générée.

Je pense que la fonction Find fonctionne plus efficacement que la fonction Application.Match, dans notre exemple ?
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Je n'ai pas tout lu mais l'erreur 2042 est la transcription CStr() d'un #N/A.

1694190554949.png
 

apt

XLDnaute Impliqué
Bonsoir Dudu2,

Match ne connait pas les dates

Merci 👍

VB:
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim ws1 As Worksheet
    Dim dateRow As Variant
    Dim DateCrit As Variant
          
    ' Spécifiez la feuille de calcul
    Set ws1 = ThisWorkbook.Sheets("Feuil1")

    If Target.Count > 1 Or IsEmpty(Target) Then Exit Sub

    ' Vérifiez si la modification a eu lieu dans le Tableau1 et dans la colonne A Date
    If Not Intersect(Target, ws1.Range("C:C")) Is Nothing Then
     
        ' Initialisation de DateCrit
        DateCrit = CLng(Target.Value)
       
        ' Recherche la date dans la colonne A
        dateRow = Application.Match(DateCrit, ws1.Range("A2:A" & ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row), 0)
       
        If Not IsError(dateRow) Then
            Debug.Print "DateRow = " & dateRow
        End If

    End If
End Sub
 

Dudu2

XLDnaute Barbatruc
Une petite remarque...
Idéalement il faudrait quand même que tu testes IsDate(Target.Value) pour être sûr que la valeur saisie soit une date car tu pourrais avoir un vrai nombre qui ne soit pas une date mais qui corresponde au nombre d'une des dates de la liste.
 

apt

XLDnaute Impliqué
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim ws1 As Worksheet
    Dim dateRow As Variant
    Dim DateCrit As Variant

    ' Spécifiez la feuille de calcul
    Set ws1 = ThisWorkbook.Sheets("Feuil1")

    If Target.Count > 1 Or IsEmpty(Target) Then Exit Sub

    ' Vérifiez si la modification a eu lieu dans le Tableau1 et dans la colonne A Date
    If Not Intersect(Target, ws1.Range("C:C")) Is Nothing Then

        ' Tester si la date saisie est une date valide
        If IsDate(Target.Value) Then
        
        ' Initialisation de DateCrit
            DateCrit = CLng(Target.Value)
        
            ' Recherche la date dans la colonne A
            dateRow = Application.Match(DateCrit, ws1.Range("A2:A" & ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row), 0)

            If Not IsError(dateRow) Then
                Debug.Print "DateRow = " & dateRow
            End If

            If VarType(dateRow) = vbError Then
                MsgBox "Pas trouvé"
            End If
        Else
            MsgBox "Date invalide"
        End If
    End If
End Sub
 

vgendron

XLDnaute Barbatruc
Je ne vois toujours pas l'intéret d'un code aussi long pour si peu
et pourquoi déclarer une variable "DateCrit" juste pour recopier Target

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or IsEmpty(Target) Then Exit Sub
    If Not Intersect(Target, Range("C2")) Is Nothing Then
        if not isdate(target) then
            msgbox "il ne s'agit pas d'une date valide"
            exit sub
        end if
        With ActiveSheet.Range("A:A")
             Set trouve = .Find(Target, LookIn:=xlValues)
            If Not trouve Is Nothing Then
                MsgBox "date trouvée à la ligne: " & trouve.Row
           else
              msgbox "Date introuvable"
            End If
        End With
    End If
End Sub
 

apt

XLDnaute Impliqué
Bonjour,

pourquoi déclarer une variable "DateCrit" juste pour recopier Target

Dans mon code global, je dois vérifier si l'entrée dans la colonne A est une date. Si c'est le cas, je procède ensuite à la vérification la date de la ligne précédente. Ensuite, j'initialise DateCrit :

VB:
    If Target.Count > 1 Or IsEmpty(Target) Or Not IsDate(Target) Then Exit Sub

    ' Vérifiez si la modification a eu lieu dans le Tableau1 et dans la colonne A Date
    If Not Intersect(Target, ws2.Range("A:A")) Is Nothing Then
        ' Testez si la ligne précédente contient une date valide
        If IsDate(Target.Offset(-1).Value) Then
            If Target.Value <> Target.Offset(-1).Value Then
                DateCrit = Target.Offset(-1).Value
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 241
Membres
103 162
dernier inscrit
fcfg