IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Forcer le format de données de la valeur d'un objet (Range) [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut Forcer le format de données de la valeur d'un objet (Range)
    Bonjour,

    Je vous explique mon problème. J'ai écris un petit code qui me permet d'importer des données qui sont dans un format txt brut.

    Voici un exemple de données (avec le soucis):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1001     NOM NUMERO 1  01.23.45.67.89  01.23.45.67.89/  000
                                           88
    1002     NOM NUMERO 2  01.23.45.67.89  01.23.45.67.89   000
    Certaines lignes contiennent la suite de la valeur de la case supérieure (ici 88 est normalement la suite de 01.23.45.67.89/ )
    Lorsqu'une ligne contient plus d'un report sur la ligne suivante, le contenu de la ligne est considéré comme une suite d'espaces avec du texte. Mais quand il n'y a qu'une seule suite de chiffre, vba considère qu'il s'agit de chiffre et fait sauter tous les espaces précédents.

    Le soucis, c'est que le report peut être présent à différents endroits. Et donc, je ne peux pas anticiper l'endroit ou je compte remettre les données.

    Je découpe les informations grâce à la fonction mid().
    Et je ne peux pas faire le correctif à la main, mon fichier source faisant plus de 40 000 lignes

    La manière dont j'ai écrit ma fonction fait que je ne peux pas forcer le type string sur la source.
    Voici un exemple de mon code qui sera surement plus facile à comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim Cell As Range
     
    For Each Cell In ActiveSheet.Range("A4:A" & nbLignesSrc)
        Workbooks(NomClasseur).Worksheets("DONNEES").Range("A" & LigneDest).Value = Trim(Mid(Cell.Value, ColA(0), ColB(0) - ColA(0)))
        Workbooks(NomClasseur).Worksheets("DONNEES").Range("B" & LigneDest).Value = Trim(Mid(Cell.Value, ColA(1), ColB(1) - ColA(1)))
        Workbooks(NomClasseur).Worksheets("DONNEES").Range("C" & LigneDest).Value = Trim(Mid(Cell.Value, ColA(2), ColB(2) - ColA(2)))
        Workbooks(NomClasseur).Worksheets("DONNEES").Range("D" & LigneDest).Value = Trim(Mid(Cell.Value, ColA(3), ColB(3) - ColA(3)))
        Workbooks(NomClasseur).Worksheets("DONNEES").Range("E" & LigneDest).Value = Trim(Mid(Cell.Value, ColA(4), ColB(4) - ColA(4)))
        LigneDest = LigneDest + 1
    Next Cell
    - nbLignesSrc vient d'une autre fonction qui me donne la taille du fichier en nombre de lignes.
    - ColA() et ColB() sont récupérés avant sur une feuille qui contient les paramètres de mon classeur xls et définissent les bornes de découpe des colonnes.

    Je ne peux pas forcer directement le type string sur Cell lors de la déclaration vu que j'utilise un for each qui réclame un Objet ou Variant. Et si je force le string sur Mid(), cela ne change rien (Strings.Mid())

    Le code n'est probablement pas très propre, on va dire que je débute en VBA.
    Je suis donc ouvert à toute proposition d'amélioration.

    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bonjour,

    Et comme ça, ça ne fonctionne toujours pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 4 To nbLignesSrc
        Workbooks(NomClasseur).Worksheets("DONNEES").Range("A" & LigneDest).Value = Trim(Mid(Cells(i, 1).Value, ColA(0), ColB(0) - ColA(0)))
        LigneDest = LigneDest + 1
    Next
    Cells(i, 1) deviendra Cells(i, 2) pour la deuxième ligne et ainsi de suite.

    D'un côté, je n'ai pas bien compris d'où venait l'erreur

    Teste pour moi

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut
    J'ai donc testé ton remplacement du for each par un simple for
    (Simple, mais j'y avais pas pensé)

    Et ça ne marche pas.

    Il faudrait que je puisse forcer le type string sur Cells(i, 1).Value avant de procéder au découpage avec Mid()

    J'avais oublié de préciser la fin du problème.
    Voici ce que ça donne en résultat après moulinage (bien sur les colonnes sont bien définies, mais la valeur 88 se retrouve dans la première colonne au lieu de la 4ème colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1001     NOM NUMERO 1  01.23.45.67.89  01.23.45.67.89/  000
    88
    1002     NOM NUMERO 2  01.23.45.67.89  01.23.45.67.89   000

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Re,

    Quel est l'intérêt de forcer le type string sur Cells(i,j) ? Je ne comprends pas.

    Mid découpe la valeur de Cells(i,j) tout simplement. Pas de string ou de je ne sais quoi ?

    Peux-tu expliciter cela ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut
    J'ai résolu mon problème de manière différente.

    Mais pour ceux à qui ça arriverait, lors de l'ouverture du fichier txt, excel supprimais automatiquement les espaces pour ne conserver que les chiffres (ici 88), ce qui fait que lorsque je découpais avec la fonction Mid(), il ne trouvais que les 2 caractères (88) au lieu des 50 caractères si les espaces étaient conservés.

    J'ai donc changé de méthode d'importation du document source en VBA en ouvrant la boite de dialogue classique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR9]Masquer des données (colonnes) suivant valeur champ
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 05/09/2005, 09h43
  2. [format des données avec une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 10/03/2005, 13h24
  3. Format de données en sortie d'une procédure stockée
    Par Martin Sylvie dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/02/2005, 12h02
  4. pB format de données
    Par calamity_jane dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 12/10/2004, 08h33
  5. Réponses: 4
    Dernier message: 04/12/2003, 08h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo