Excel VBA : operation sur "chaine caracteres"
Résolu
Eaheru
Messages postés
197
Date d'inscription
Statut
Membre
Dernière intervention
-
Eaheru Messages postés 197 Date d'inscription Statut Membre Dernière intervention -
Eaheru Messages postés 197 Date d'inscription Statut Membre Dernière intervention -
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 ?
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:
- Excel VBA : operation sur "chaine caracteres"
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
8 réponses
Bonjour
pour récupérer la derniere date quelque soit le nombre de date
si toujours 4 dates
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
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
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
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
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))
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))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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)
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
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 ?
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 ?
??
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 ":"
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 ":"
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 ?)
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 ?)
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.
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.