traitement des caractères fonctions Lef, Mid , Right - VB/VBA/VBS - Programmation
Marsh Posté le 07-12-2005 à 09:56:57
j'ai essayé de permuter la date et le mois par traitement de chaine de caractères, je coince sur la syntaxe car la cellule n'est pas modifiée, pouvez-vous me corriger ? merci
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 07/12/2005 par Phanou44
'
'permute le mois et la date
Set celluleCourante = Worksheets("Feuil1" ).Range("A1" )
compteur = 3
Do While compteur <> 0
Set celluleSuivante = celluleCourante.Offset(1, 0)
If IsEmpty(celluleCourante) Then
compteur = compteur - 1
chaine = celluleCourante.Value
chaine = Mid(chaine, 5, 3) & Mid(chaine, 2, 3) & Right(chaine, 2)
celluleCourante.Value = chaine
End If
Set celluleCourante = celluleSuivante
If Not IsEmpty(celluleCourante) Then
compteur = compteur + 1
End If
Loop
End Sub
Marsh Posté le 07-12-2005 à 11:01:50
Sous Excel, les données ont un format interne et un format externe.
En interne, une date est nombre de secondes, et en externe la date s'affiche selon le format de la cellule qui, en l'occurence, serait mm/jj/aaaa.
Si le but recherché n'est pas de changer la date, mais de changer sa représentation, alors il faut agir au niveau externe et non pas au niveau interne :
Code :
|
Cette subroutine a été testée. Elle change le format pour les cellules A1 à A20. Pour que le changement ait lieu, il a été necessaire de sauvegarder la valeur de chaque cellule, puis de la remettre, car changer le format ne suffisait pas.
Pour la troisième colonne, il est possible que cela soit encore un problème de format, et il faudrait faire une boucle comme pour la date pour avoir un format monétaire différent.
Marsh Posté le 07-12-2005 à 12:15:38
Super olivthill !!! , c'est mieux, merci pour ton aide !!!
J'ai modifié ton code pour éviter la boucle for next, car ma procédure, doit convertir puis trier un nombre inconnu de lignes, ça donne ça :
Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 07/12/2005 par Phanou44
'
Set celluleCourante = Worksheets("Feuil1" ).Range("A1" )
compteur = 3
Do While compteur <> 0
Set celluleSuivante = celluleCourante.Offset(1, 0)
If IsEmpty(celluleCourante) Then
compteur = compteur - 1
End If
If Not IsEmpty(celluleCourante) Then
compteur = 3
chaine = celluleCourante.Value
celluleCourante.Clear
celluleCourante.NumberFormat = "dd/mm/yyyy"
celluleCourante.Value = chaine
End If
Set celluleCourante = celluleSuivante
Loop
End Sub
sauf que j'ai toujours le même problème, au départ mes dates sont en txt au format mm/jj/aa et je les voudrais au format jj/mm/aaaa , ta procédure ne règle pas ce problème, encore un petit effort ?
Merci par avance .
Marsh Posté le 07-12-2005 à 13:19:36
Il faut peut-être alors essayer de reprendre l'idée intiale avec juste une petite modification :
chaine = celluleCourante.Value |
L'apostrophe au début d'une valeur force la cellule à être au format chaine de caractère.
Marsh Posté le 08-12-2005 à 10:03:31
Mille mercis olivthill, j'ai abouti grace à ton aide !!!
alors pour résumer,
-bien garder en tête qu'il y a un format externe visible et interne invisible,
-il faut surprimer une cellule, lui attribuer son format et réecrire ensuite son contenu
-les data que je devais traiter ne sont pas au format excel mais au format TXT, donc en imposant le format, si la syntaxe ne correspond à rien de reconnaissable par excel , le logiciel ne fera rien
-pour ma part il a fallu que je force les cellules en format TXT, puis traiter les data comme du texte pour une remise en forme, puis insérer le format voulu après une sauvegarde et suppresion de cellule pour imposer le format.
ça donne ça :
'met en forme la colonne des dates au format txt pour le traitement qui suit
Columns("A:A" ).Select
Selection.NumberFormat = "@"
'permute le mois et la date
Set celluleCourante = Worksheets("Feuil1" ).Range("A1" )
compteur = 3
Do While compteur <> 0
Set celluleSuivante = celluleCourante.Offset(1, 0)
If IsEmpty(celluleCourante) Then
compteur = compteur - 1
End If
If Not IsEmpty(celluleCourante) Then
compteur = 3
chaine = celluleCourante.Value
chaine = Mid(chaine, 5, 3) & Mid(chaine, 2, 3) & Right(chaine, 2)
celluleCourante.Value = chaine
End If
Set celluleCourante = celluleSuivante
Loop
'met en forme le texte pour quil devienne une date par loutil convertir
Columns("A:A" ).Select
Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4)
'met en forme les gains/pertes en txt et enlève la dernière parenthèse si elle existe
Columns("C:C" ).Select
Selection.NumberFormat = "@"
Selection.TextToColumns Destination:=Range("C1" ), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:=" )", FieldInfo:=Array(Array(1, 1), Array(2, 9))
'enlève le $ ou remplace le ($ en -Set celluleCourante = Worksheets("Feuil1" ).Range("C1" )
compteur = 3
Do While compteur <> 0
Set celluleSuivante = celluleCourante.Offset(1, 0)
If IsEmpty(celluleCourante) Then
compteur = compteur - 1
End If
If Not IsEmpty(celluleCourante) Then
compteur = 3
chaine = celluleCourante.Value
If Mid(chaine, 2, 1) = "$" Then chaine = Right(chaine, Len(chaine) - 2)
If Mid(chaine, 2, 2) = "($" Then chaine = "-" & Right(chaine, Len(chaine) - 3)
celluleCourante.Value = chaine
End If
Set celluleCourante = celluleSuivante
Loop
'met la colonne gain/perte au format 0.00
Set celluleCourante = Worksheets("Feuil1" ).Range("C1" )
compteur = 3
Do While compteur <> 0
Set celluleSuivante = celluleCourante.Offset(1, 0)
If IsEmpty(celluleCourante) Then
compteur = compteur - 1
End If
If Not IsEmpty(celluleCourante) Then
compteur = 3
chaine = celluleCourante.Value
celluleCourante.Clear
celluleCourante.NumberFormat = "0.00"
celluleCourante.Value = chaine
End If
Set celluleCourante = celluleSuivante
Loop
'tri les 3 colonnes en fonction de la date et lheure
Columns("A:C" ).Select
Selection.Sort Key1:=Range("A2" ), Order1:=xlAscending, Key2:=Range("B2" ) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom
Encore merci pour ton aide olivthill
Amitiés à tous !!
Marsh Posté le 07-12-2005 à 09:25:42
Bonjour a tous,
je fabrique une macro pour classer ces données par ordre croissant de la date et de l'heure en VBA. Ces données n'ont pas été fabriquées à partir d'Excel, mais plutôt d'un fichier .txt par exemple. La date est au format US (mm/jj/aa) et c'est là que je bloque , car pas moyen de faire reconnaitre ce type de date et encore moins la convertir.
voici un échatillon des données :
02/15/02 08:10 ($142.50)
02/15/02 14:00 ($305.00)
02/19/02 09:20 $32.50
02/19/02 15:00 ($17.50)
02/20/02 08:10 ($180.00)
02/20/02 11:40 ($117.50)
02/20/02 14:00 ($92.50)
01/30/04 15:00 $563.75
02/02/04 08:10 ($30.00)
02/03/04 08:10 $745.00
02/03/04 15:00 $1.25
02/04/04 09:20 ($342.50)
02/04/04 10:30 ($255.00)
02/04/04 12:50 ($92.50)
02/05/04 08:10 ($242.50)
02/20/02 15:00 ($42.50)
02/21/02 08:10 $157.50
02/22/02 12:50 ($305.00)
02/22/02 15:00 $70.00
02/25/02 08:10 ($98.75)
01/29/04 08:10 ($411.25)
01/29/04 11:40 ($236.25)
01/29/04 15:00 ($186.25)
01/30/04 08:10 $188.75
quel serait le code VBA qui transformerait la colonne A de mm/jj/aa en jj/mm/aaaa ?
quel serait le code VBA qui m'enlèvera le $ de la 3e colonne ?
Merci par avance.
Phanou44