XL 2019 chercher une date dans une colonne vba

escudo

XLDnaute Nouveau
bonjour,
j'aimerais chercher une date dans une colonne s'elle n'existe pas donc un message s'affiche .
le problème c'est que j'ai un code il marche tres bien si la valeur cherchée est un texte les dates il ne les reconnaisse pas.

Dim VAR As Variant
VAR = Sheets("CLOTURE").Range("B1")

Set rg2 = Sheets("ETAT_ST").Columns("a").Find(what:=CDate(VAR), LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows)
If rg2 Is Nothing Then
rep = MsgBox("Inventaire Non réalisé !!" & Chr(10) & "Veuillez Réaliser un inventaire pour le mois écoulé !!", vbCritical): Exit Sub
End If

si var est un texte le code fais son travail si var et une date rien ne se passe.

merci de m'aider.
 
Solution
Bonsoir,
Vos dates dans "ETAT_ST" sont des chaines non des dates.
Si vous faites en A5 Format de cellules et standard, vous obtenez ça :
1729711549103.png

En Standard une date devrait donner un nombre et non un texte, comme ceci :
1729711649718.png


d'où deux choix :
1- Vous gardez ainsi mais vous faites :
VB:
c = Application.Match("" & Feuil2.Range("B1") & "", Feuil1.Columns(1), 0)
2- ou vous gardez la formule actuelle mais vous retaper les dates correctement dans CLOTURES.
En PJ une simulation de la seconde option.

(NB : Dans la PJ j'ai viré tout ce qui est inutile pour le problème qui nous préoccupe.
Le fichier est alors beaucoup moins lourd et peut être livré directement.
C'est plus pérenne qu'un fichier sur site qui disparaitra sous...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Vos dates dans "ETAT_ST" sont des chaines non des dates.
Si vous faites en A5 Format de cellules et standard, vous obtenez ça :
1729711549103.png

En Standard une date devrait donner un nombre et non un texte, comme ceci :
1729711649718.png


d'où deux choix :
1- Vous gardez ainsi mais vous faites :
VB:
c = Application.Match("" & Feuil2.Range("B1") & "", Feuil1.Columns(1), 0)
2- ou vous gardez la formule actuelle mais vous retaper les dates correctement dans CLOTURES.
En PJ une simulation de la seconde option.

(NB : Dans la PJ j'ai viré tout ce qui est inutile pour le problème qui nous préoccupe.
Le fichier est alors beaucoup moins lourd et peut être livré directement.
C'est plus pérenne qu'un fichier sur site qui disparaitra sous peu, pensez aux lecteurs futurs )
 

Pièces jointes

  • Classeur1 (V2).xlsm
    22.5 KB · Affichages: 1

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Si le problème vient d'un copier coller intempestif ou d'un export d'un outil tiers, cela risque d'être pénible à chaque fois de faire les modifs.
Alors autant transformer ces textes éventuels en vrai dates avec en début de macro :
VB:
' On transforme les dates en texte par des dates en nombres en colonne A
T = Range("A5:A" & [A10000].End(xlUp).Row)
For i = 1 To UBound(T)
    T(i, 1) = CDate(T(i, 1))
Next i
[A5].Resize(UBound(T, 1), UBound(T, 2)) = T
 

Pièces jointes

  • Classeur1 (V3).xlsm
    23.5 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
Bonsoir
ce qui est bien avec les date conformes (même en texte)
c'est que tu peut convertir tout d'un coup de manière simple
exemple
VB:
Sub test()
    With [A1:A26]
        t = .Value
        .NumberFormat = "dd/mm/yyyy"
        .Value = t
    End With
End Sub
que c'est il passé?
je crée une variable tableau(t) avec la plage de cellule (.value)
je remet un numberformat date sur les cellule de la plage
et je repose le tableau dedans
en fait vba est très gentil il a fait la conversion quand les dates sont arrivées dans la variable(t)
voila si les dates se retrouvent à gauche c'est que ça a fonctionné

patrick
 

patricktoulon

XLDnaute Barbatruc
re
apres si c'est des importations par tiers
et bien on se casse pas la tête on teste les deux formats
en prenant soin bien évidemment de convertir en texte anonymement dans la sub la valeur de B
VB:
Sub CLOTURE()
    Dim c, c2
    With Application

        c = .IfError(.Match(CLng(CDate(Feuil2.Range("B1"))), Feuil1.Columns(1), 0), 0)
        c2 = .IfError(.Match(CStr((Feuil2.Range("B1"))), Feuil1.Columns(1), 0), 0)
    End With
    If c2 > 0 Then c = c2

    If c > 0 Then
        rep = MsgBox("Etes vous sûr de cloturer cette période", vbYesNo + vbQuestion)
        If rep = vbYes Then
            Call transfert
        ElseIf IsError(c) Then
            rep = MsgBox("Inventaire non réalisé" & Chr(10) & "Veuillez réaliser un inventaire pour le mois écoulé", vbInformation)
            Exit Sub
        End If
    End If
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous :),

Sans vergogne et tel un parasite, je profite de vos codes pour suggérer, sans honte aucune, ces quelques lignes 😎 :
VB:
Sub CLOTURE()
Dim n
   n = Application.IfError(Application.Match(CLng(CDate(Feuil2.Range("B1"))), Feuil1.Columns(1), 0), 0)
   n = n + Application.IfError(Application.Match(CStr((Feuil2.Range("B1"))), Feuil1.Columns(1), 0), 0)
   If n Then
      If MsgBox("Etes vous sûr de clôturer cette période ?", vbYesNo + vbQuestion + vbDefaultButton2) = vbYes Then transfert
   Else
      MsgBox "Inventaire non réalisé" & Chr(10) & "Veuillez réaliser un inventaire pour le mois écoulé.", vbInformation
   End If
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
314 727
Messages
2 112 263
Membres
111 477
dernier inscrit
hanaz