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 :

Pb cellule apparemment vide [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Par défaut Pb cellule apparemment vide
    Bonjour,

    J'ai un fichier issu d'un système à traiter avec grosso modo 1000 lignes sur un trentaine de colonnes.
    J'arrive à l'ouvrir avec opentxt et à supprimer les espace inutiles, cependant il me reste des cellules apparemment vides qui ne le sont pas.
    Vous trouverez ci-joint un extrait d'une colonne qui me pose souci, avec une colonne "Test vide" dans laquelle les seules cellules reconnues comme vides sont celles pour lesquelles j'ai utilisé la touche "Suppr" pour supprimer les données. J'ai choisi la mise en forme "Soulignée" afin de bien voir que je n'ai plus d'espaces inutiles.

    Ce dont j'ai besoin est soit :
    a. vider réellement les cellules qui n'affichent rien.
    b. a défaut de les vider, savoir les identifier.

    J'ai bien trouvé une méthode mais je n'ai pas le sentiment qu'elle soit optimale :
    a. Filtre la colonne pour ne garder que les "(Vides)".
    b. Sélectionner ensuite la colonne et faire "Suppr".
    c. Effacer le filtre.

    Le code que j'ai utilisé pour ouvrir le fichier est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MsgBox "Dans la boîte de dialogue suivante" & vbCrLf & vbCrLf & "veuillez choisir le fichier à traiter" _
    & vbCrLf & vbCrLf & "(fdetm).", vbOKOnly + vbInformation, "Choix du fichier"
    FichierTxt = Application.GetOpenFilename(, , , , False)
    If TypeName(FichierTxt) = "Boolean" Then Exit Sub
    Workbooks.OpenText FichierTxt, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, Semicolon:=True, _
        FieldInfo:=Array(Array(1, 2), Array(2, 5), Array(3, 1), Array(4, 1), Array(5, 2), Array(6, 2), _
        Array(7, 2), Array(8, 2), Array(9, 2), Array(10, 2), Array(11, 5), Array(12, 2), Array(13, 2), _
        Array(14, 5), Array(15, 5), Array(16, 2), Array(17, 2), Array(18, 2), Array(19, 5), Array(20, 2), _
        Array(21, 5), Array(22, 5), Array(23, 5), Array(24, 2), Array(25, 2), Array(26, 2), Array(27, 2), _
        Array(28, 2), Array(29, 2), Array(30, 1), Array(31, 9)), _
        Local:=True, DecimalSeparator:=".", TrailingMinusNumbers:=True
    Ensuite pour supprimer les espace j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Cellule In Cells.SpecialCells(xlCellTypeConstants, 2)
        Cellule.Value = Application.Trim(Cellule.Value)
    Next Cellule
    J'ai également essayé cette autre méthode un peu plus rapide mais qui me pose problème sur les colonnes avec un format de date, certaines cellules ne sont plus reconnues comme des dates.
    Le code un peu plus haut m'a permis de n'appliquer "trim" qu'aux cellules au format texte ce que je n'ai su faire avec le code ci-dessous. Comme le gain n'est que de 1 à 2 secondes ce n'est pas bien grave mais si quelqu'un avait une idée pour améliorer le code ci-dessous pour conserver mes dates je serais preneur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set Tab_Cel = Range("A1").CurrentRegion
         Tab_Val = Tab_Cel.Value
         For i = LBound(Tab_Val) To UBound(Tab_Val)
             For j = 1 To Tab_Cel.Columns.Count
                  Tab_Val(i, j) = Trim(Tab_Val(i, j))
             Next j
         Next i
    Tab_Cel.Value = Tab_Val
    Vous remerciant par avance.
    Amicalement
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en général, deux raisons possibles :

    1) Un problème lié au formatage des cellules

    2) Un caractère "invisible/fantôme" comme le caractère insécable, ou la simple chaine vide "" (ceci n'est pas "Rien", la cellule contient quelque chose, une chaine, et c'est cette chaine qui est vide, pas la cellule ! Nuance très importante)

    regarde si en convertissant, colonne par colonne, les données tu retrouves des cellules réellement vides

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub FormatageKo()
        For i = 1 To 30
            On Error Resume Next ' si la colonne est vide, ça plante ... plus rapide que de calculer si la colonne est vide
            Columns(i).TextToColumns Destination:=Columns(i), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Tab:=True, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
        Next i
    End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour (et un salut à joe.levrai)
    Cela "sent" (je ne peux que "sentir", puisque je n'ouvre jamais un classeur tiers ... voir ma signature) l'importation mal faite d'un fichier texte structuré (j'ai déjà vu ce coup-là il y a ... je ne sais plus combien d'années ...)
    Si tel est le cas, une "réparation" n'est alors possible que par une méthode barbare (ici sur la seule colonne A en exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each c In Range("A:A").SpecialCells(xlCellTypeConstants)
     If c.Text = "" Then c.Value = Empty
    Next
    Nota : j'appelle cela être conduit à "mettre un cataplasme sur une jambe de bois". Ce n'est pas orthodoxe. Du moins : ce qui ne l'est pas, est d'en être arrivé !
    Il y a probablement bien mieux à faire, mais bien en amont, évidemment.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Par défaut
    Bonjour,

    Merci à vous 2 pour ces réponses.

    La solution de Joël est efficace et rapide mais il me faut ne l'appliquer qu'aux colonnes dans lesquelles je sais rencontrer ces cas, sinon dans les colonnes avec des nombre sous forme de texte je me retrouve avec par exemples des 2 à la place des 02 et dans les colonnes "standard" avec des décimales je me retrouve avec du texte (la virgule étant remplacée par le point).
    Mais je saurais me débrouiller avec ça.

    Je suis bien d'accord avec toi unparia il eut été préférable d'agir en amont, alors peut-être auras-tu une idée si je t'explique en 3 étapes comment j'en suis arrivé là :
    Les données sont issues d'un ERP dont la conception remonte à presque 30 ans.
    L'informaticien qui a créé le process qui génère le fichier structuré m'a expliqué que malheureusement si un champ donné fait x caractères il en sera de même dans le fichier texte, d'où des espaces là où il n'y a rien au départ.
    Après l'ouverture du fichier j'ai donc utilisé l'instruction "trim" pour supprimer les espaces inutiles et c'est là que je me retrouve avec des cellules pas vraiment vides.

    Si avec ce cas je peux apprendre à faire plus propre et plus efficace j'en serai heureux, sinon je vais déjà pouvoir arriver au bon résultat, alors si mon code met quelques secondes de plus pour arriver au bout ce n'est pas bien grave.

    Encore merci.

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    qui a créé le process qui génère le fichier structuré m'a expliqué que malheureusement si un champ donné fait x caractères il en sera de même dans le fichier texte, d'où des espaces là où il n'y a rien au départ
    C'était à ce niveau (celui de génération) qu'il fallait agir (en amont, donc, et pas en aval). Je devine (mais je peux me tromper), que le fichier texte généré n'est pas de type csv, mais un fichier structuré.
    Il est peut-être possible d'agir sur ce fichier pour le réécrire autrement avant, donc, de l'importer dans ton classeur. En connais-tu la structure exacte (qui est un type personnalisé) ?

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    As-tu essaye la suggestion de unparia dans ton code, c-a-d de vider vraiment avec Empty ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each Cellule In Cells.SpecialCells(xlCellTypeConstants, 2)
        Cellule.Value = Application.Trim(Cellule.Value)
     
        If Cellule.Value = "" Then Cellule.Value = Empty
    Next

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Par défaut
    Bonjour,

    Effectivement le fichier n'est pas un csv mais je n'en connais pas la structure exacte, je pourrais peut-être avoir l'info demain.

    La proposition de unparia fonctionne également.

    Merci pour vos réponses

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par Scrabblouille Voir le message
    les seules cellules reconnues comme vides sont celles pour lesquelles j'ai utilisé la touche "Suppr" pour supprimer les données.
    L'évidence même avant cette manipulation les cellules ne sont donc pas vides ‼     L'importation est donc à revoir …

    ___________________________________________________________________________________________________________
    Je suis Paris, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

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

Discussions similaires

  1. Compter le nombre de cellule non vide
    Par christian ler dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/03/2007, 11h24
  2. Tester si une cellule est vide
    Par amka dans le forum Access
    Réponses: 1
    Dernier message: 09/08/2006, 15h58
  3. [VBA-A]Problème de cellule Excel vide
    Par soad029 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 05/05/2006, 14h12
  4. [EXCEL][VBA] Compter les cellules non-vides
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2006, 15h40
  5. [VBA-E]selectionner la premiere cellule non vide d'une ligne
    Par muse47 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/10/2005, 08h11

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