Excel VBA : operation sur "chaine caracteres"

Résolu
Bonjour,

J'ai une macro qui me remonte des modification de date dans une cellule. Ce qui donne quelque chose dans le genre suivant :
30/05/2011 : 06/06/2011 : 06/06/2011 : 06/06/2011

Mon problème vient du fait que mon tableau contient plusieurs fois la même ligne, que je ne peux pas supprimer les doublons mais que je ne dois pas remonter la date si elle est déjà présente dans la cellule d'historique.

J'essaie donc de "capter les 10 derniers caractères de la cellule, de les inscrire dans une autre cellule, de passer cette chaine au format "date" et d'effectuer la comparaison avec la date qui me préoccupe;


Dim varN1
Dim cel1

'Recuperation de la derniere date entrée en commentaire :
ws1.Activate
If Not (Cells(cel1.Row, 48)) Like "" Then
varN1 = Right((Cells(cel1.Row, 36)), 10)
Range(Cells(cel1.Row, 48)) = varN1
Range(Cells(cel1.Row, 48)).NumberFormat = "dd/mm/yyyy"
End If
If Not ws1.Range("O" & cel1.Row) Like "" Then
If Not (ws2.Range("O" & cel2.Row).Value) = (ws1.Range("O" & cel1.Row).Value) Then
If Not (ws1.Range("O" & cel1.Row).Value) = ws1.Range("AV" & cel1.Row) Then
If ws1.Range("AJ" & cel1.Row) Like "" Then
ws1.Range("AJ" & cel1.Row).Value = ws2.Range("O" & cel2.Row).Value & " : " & ws1.Range("O" & cel1.Row).Value
Else
ws1.Range("AJ" & cel1.Row).Value = ws1.Range("AJ" & cel1.Row).Value & " : " & ws1.Range("O" & cel1.Row).Value
End If
End If
End If
End If


Et avec ce code, j'ai un message "incompatibilité de type" sur la ligne "Range(Cells(cel1.Row, 48)) = varN1"

Quelqu'un verrait il ou se trouve le problème svp ?

8 réponses

  1. Contributeur
    Bonjour

    pour récupérer la derniere date quelque soit le nombre de date

    Function der_date(cellule As Range) As Date 
    temp = Split(cellule, " : ") 
    der_date = temp(UBound(temp)) 
    End Function


    si toujours 4 dates
    Function der_date(cellule As Range) As Date 
    der_date= Split(cellule, " : ")(3) 
    End Function


    renvoie le numéro de série de la date(a mettre au format date dans la cellule)

    si utilisation dans une procédure renvie la valeur directement au type date
    Michel
    0
    1. Ça a l'air super. Merci Michel.
      Je teste au plus vite et je t'informe.
      0
      1. Bonjour Michel,

        Je souhaitais tester la fonction :

        Function der_date(cellule As Range) As Date
        temp = Split(cellule, " : ")
        der_date = temp(UBound(temp))
        End Function

        Mais je dois dire que je ne sais pas comment la mettre en oeuvre
        Est ce quelque chose comme :

        ws1.Activate
        der_date (Cells(cel1.Row, 48))

        ?
        Merci de votre aide
        0
        1. Contributeur
          Bonjour la fonction renvoie une date (donc une valeur

          par exemple
          range("A1")=der_date(Cells(cel1.Row, 48))
          ou si utilisation dans le code
          tavar=der_date(.....
          tavar déclarée en date
          0
      2. Ok, je vois merci.
        Il y a t il le moyen de la lier à l'espace de travail "ws1" ?
        J'imagine que c'est faisable mais sans en connaitre la syntaxe.
        (Quelque chose dans le genre : ws1.Range("AJ" & cel1.Row).Value )

        La j'ai le retour suivant :

        "L'indice n'appartient pas à la sélection"
        sur la ligne :
        der_date = temp(UBound(temp))
        0
        1. Contributeur
          Si je comprend ton souci: la cible n'est pas sur la m^me feuille que la source ?

          si oui, petite démo (classeur d'essai)

          Sub essai()  
          Set ws1 = Sheets(1)  
          Set ws2 = Sheets(2)  
          ws2.Range("B2") = der_date(ws1.Range("A1"))  
          End Sub  
          
          Function der_date(cellule As Range) As Date  
          temp = Split(cellule, " : ")  
          der_date = temp(UBound(temp))  
          End Function  
          
           Michel
          0
          1. C'est effectivement tout à fait ça.
            Il ne me reste plus qu'un souci, je pense.
            Si la cellule contenant l'historique de date est vide, je la zappe, ça c'est ok,
            Si la cellule comprend plus d'une seule date, la fonction der_date prend en charge la dernière date délimitée par le ":" mais comme j'ai encore le message "L'indice n'appartient pas à la sélection" je suppose que ça peut venir du fait que si j'ai une seule date dans cette cellule, je n'ai pas de ":" et la fonction plante ?
            0
            1. Contributeur
              ??
              Je viens d'essayer avec 1 seule date sans ":" ,c'est OK
              s'il n'y a qu'une date l'indice est égal à 0 (les tableaux VBA commencent à 0)
              par contre ca plante s'il y a ":"
              0
              1. Ok, alors je vais reprendre mon bout de code pour repartir tout propre a partir de la fonction que tu propose :)
                Je te tiens informé !
                0
            2. Bon, je ne m'en sort pas trop :(
              voici le bout de code qui me pose ce probleme :
              If Not (ws1.Range("AJ" & cel1.Row)) Like "" Then
              varN1 = der_date(ws1.Range("AJ" & cel1.Row))
              End If

              If Not ws1.Range("O" & cel1.Row) Like "" Then
              If (ws2.Range("O" & cel2.Row).Value) <> (ws1.Range("O" & cel1.Row).Value) Then
              If Not ((ws1.Range("O" & cel1.Row).Value) = varN1) And (ws1.Range("AJ" & cel1.Row) Like "") Then
              ws1.Range("AJ" & cel1.Row).Value = ws2.Range("O" & cel2.Row).Value & " : " & ws1.Range("O" & cel1.Row).Value
              End If

              Je me retrouve toujours avec le message "l'indice n'appartient pas à la sélection" et la valeur de verN1 est 00:00:00 (donc j'imagine que c'est le 0 dont tu parlais ?)
              0
              1. Contributeur
                là, je ne comprend pas...

                quelle valeur a la cellule: ws1.Range("AJ" & cel1.Row) ?
                0
              2. Houla, désolé je n'avais pas regardé les réponses. Toutes mes excuses.
                Au final, J'ai utilisé la commande "Right" afin de capté les 10 Premiers caractères depuis la droite (la dernière date de la ligne donc). une fois cette opération accomplie, je formate la cellule qui va recevoir cette valeur en format "texte" et j'y inscrit ma date toujours au format texte.
                Ensuite un coup de CDATE et ma date est exploitable pour faire des comparaisons avec la date du jour.

                J'espère avoir été clair ? :) Merci d'avoir pris la peine de me répondre.
                0