traitement des caractères fonctions Lef, Mid , Right

traitement des caractères fonctions Lef, Mid , Right - VB/VBA/VBS - Programmation

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

Reply

Marsh Posté le 07-12-2005 à 09:25:42   

Reply

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


Message édité par phanou44 le 07-12-2005 à 09:57:55
Reply

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 :
  1. Sub cvt_format_date()
  2. ' Met au format jj/mm/aaaa hh mm
  3. i_col = 1
  4. For i_row = 1 To 20
  5.    temp = Cells(i_row, i_col)
  6.    Cells(i_row, i_col).Clear
  7.    Cells(i_row, i_col).NumberFormat = "dd/mm/yyyy hh:mm"
  8.    Cells(i_row, i_col) = temp
  9. Next i_row
  10. End Sub

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.

Reply

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 .


Message édité par phanou44 le 07-12-2005 à 12:17:57
Reply

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  
 chaine = "'" & Mid(chaine, 5, 3) & Mid(chaine, 2, 3) & Right(chaine, 2)  
 celluleCourante.Value = chaine

L'apostrophe au début d'une valeur force la cellule à être au format chaine de caractère.

Reply

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 qu’il devienne une date par l’outil 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 l’heure
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 !!


Message édité par phanou44 le 08-12-2005 à 10:07:09
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed