Excel VBA : operation sur "chaine caracteres"

Résolu/Fermé
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 - 27 mai 2011 à 12:23
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 - 27 juin 2011 à 23:42
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 ?
A voir également:

8 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 27/05/2011 à 16:37
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
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
27 mai 2011 à 17:28
Ça a l'air super. Merci Michel.
Je teste au plus vite et je t'informe.
0
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
30 mai 2011 à 14:54
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 mai 2011 à 15:14
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
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
Modifié par Eaheru le 30/05/2011 à 15:30
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 30/05/2011 à 15:34
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
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
30 mai 2011 à 15:51
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 mai 2011 à 16:03
??
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
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
30 mai 2011 à 16:07
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
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
Modifié par Eaheru le 30/05/2011 à 17:17
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
31 mai 2011 à 12:33
là, je ne comprend pas...

quelle valeur a la cellule: ws1.Range("AJ" & cel1.Row) ?
0
Eaheru Messages postés 197 Date d'inscription mercredi 23 juin 2010 Statut Membre Dernière intervention 12 mars 2018 20
27 juin 2011 à 23:42
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