Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1474 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  traitement des caractères fonctions Lef, Mid , Right

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

traitement des caractères fonctions Lef, Mid , Right

n°1260733
phanou44
Posté le 07-12-2005 à 09:25:42  profilanswer
 

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

mood
Publicité
Posté le 07-12-2005 à 09:25:42  profilanswer
 

n°1260749
phanou44
Posté le 07-12-2005 à 09:56:57  profilanswer
 

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
n°1260775
olivthill
Posté le 07-12-2005 à 11:01:50  profilanswer
 

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.

n°1260857
phanou44
Posté le 07-12-2005 à 12:15:38  profilanswer
 

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
n°1260914
olivthill
Posté le 07-12-2005 à 13:19:36  profilanswer
 

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.

n°1261513
phanou44
Posté le 08-12-2005 à 10:03:31  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  traitement des caractères fonctions Lef, Mid , Right

 

Sujets relatifs
les chaines de caracteresXml / ISO et python qui veut pas des caractères non ascii [Résolu]
Utilisation JProgressBar & temps de traitement incconulien vers une url comportant des caractères spéciaux
plusieurs remplacements de chaînes de caractères ds un fic en une seulModifier les caractéres spéciaux et les Majuscules d'une variable
[VBS - RESOLU] Recherche recursive de fichiers avec caracteres généricComment récupérer les caractères tapés au clavier comme un keylogger ?
[PL/SQL] traitement de date[PHP] Créer une variable à partir d'une chaîne de caractères ?
Plus de sujets relatifs à : traitement des caractères fonctions Lef, Mid , Right


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR