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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  test si colonne vide à partir de la 2eme ligne

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

test si colonne vide à partir de la 2eme ligne

n°1315055
Madilina
pouetteuh
Posté le 28-02-2006 à 10:05:29  profilanswer
 

Bonjour à tous!  
 
Je suis en bts IG option réseaux... Je suis en stage et je dois faire un bout de progr en VBA bien sur je galère pas mal... J'ai déjà pas mal avancé mais la, je bloque  
Je fais un export de fichiers texte d'un logiciel (dameware).  
Le but de la manoeuvre était de rassembler ces fichiers textes dans un classeur excel avec une feuille pour chaque fichier.txt. jusque là ca va, j'ai du redimmensionner les colonnes, supprimer celles dont on avait pas besoin jusque là ca va aussi, mais voilà ou ca se corse:  
 
Dans les colonnes à supprimer il faut supprimer celles qui sont vides, seulement il ya toujours l'intitulé de la colonne ce qui fait qu'une bête commande ne marche pas puisqu'il trouve toujours une valeur dans la colones, donc comment faire pour chercher dans chaque colonnes de chaque feuilles et à partir de la deuxième ligne. Voilà le code ou j'en suis mais c'est pas très optimisé...  
 
Worksheets("shares" ).Range("F2:F1000" ).Select  
For Each Cell In Selection  
If IsEmpty(Cell.Value) Then  
Worksheets("shares" ).Columns("F:F" ).Delete  
End If  
Next Cell  
 
j'attends vos conseils et votre aide d'avance merci

mood
Publicité
Posté le 28-02-2006 à 10:05:29  profilanswer
 

n°1315077
Madilina
pouetteuh
Posté le 28-02-2006 à 10:34:34  profilanswer
 

Bon ben j'ai réussi à trouver ca toute seule
mais le pb c'est que quand la deuxième cellule est vide et que les autres ne le sont pas ca m'efface quand meme la colonne
 :fou:  
Worksheets("shares" ).Columns("B:B" ).Rows(2).Select
    For Each Cell In Selection
        If IsEmpty(Cell.Value) Then
            Worksheets("shares" ).Columns("B:B" ).Delete
        End If
    Next Cell
 


Message édité par Madilina le 28-02-2006 à 10:48:44
n°1315166
watashi
La démotivation : JAMAIS !
Posté le 28-02-2006 à 11:41:54  profilanswer
 

Salut madilina,
au lieu de tester si chacune des cellules est vide tu peut tester si la première cellule vide est en ligne 2 en partant du bas de ton tableau :
(code à main levée)

Code :
  1. if sheets("shares" ).cells(65536,2).end(xlup).row = 2 then
  2. sheets("share" ).Columns(2).delete
  3. end if


En ajoutant une boucle for pour faire varier la colone tu devrais pouvoir passer ton tableau en revue.
@+
ps: ton code avec les balises serait plus lisible ;)


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
n°1315175
Madilina
pouetteuh
Posté le 28-02-2006 à 11:50:28  profilanswer
 

désolée je suis novice pour les balises je ne sais pas si ca va marcher  :(  
j'ai pas trop compris ce que tu m'as proposé de faire
J'ai encore avancé depuis tout à l'heure mais c'est toujours le meme problème ca me supprime les colonnes qui ont la deuxième ligne vide alors qu'il y a du texte après  
 

Code :
  1. Worksheets("shares" ).Range("F2" ).Select
  2.     Selection.End(xlDown).Select
  3.     derniereligne = ActiveCell.Row
  4.     Worksheets("shares" ).Columns("F:F" ).Rows("2:" & derniereligne).Select
  5.     For Each cell In Selection
  6.         If IsEmpty(cell.Value) Then
  7.             Worksheets("shares" ).Columns("F:F" ).Delete
  8.         End If
  9.     Next cell


 
Il me semble que c'est la bouche qui pose problème


Message édité par Madilina le 28-02-2006 à 11:51:51
n°1315545
watashi
La démotivation : JAMAIS !
Posté le 28-02-2006 à 18:01:26  profilanswer
 

l'idée que je t'avançais est la suivante :
tu part de la ligne 65536 (limite d'excel), tu lui dis de remonter jusqu'à la première cellule vide.
si cette cellule est en ligne 2 c'est que toute tes cellules sauf  la première donc tu supprime la colone.
Si c'est autre chose que 2 c'est qu'au moins une case est remplie donc tu ne supprime pas la colone.
ceci t'évite de tester le contenu de chacune de tes cellules.  
En reprennant ton code ça donne ceci :

Code :
  1. If Worksheets("shares" ).cells(65536,6).end(xlup).row = 2 then
  2. 'le range de vient cells pour jouer plus facilement
  3. ' le F du range devient 6
  4. 'end(xlup) fait remonter
  5. '.row te donne le numérode ligne
  6. ' si =2 alors je supprime la colonne toujours 6 pour F
  7. Worksheets("shares" ).Columns(6).Delete
  8. 'sinon je sors du if
  9. End If


 
;)
ps nickel les balises ;)


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
n°1315557
watashi
La démotivation : JAMAIS !
Posté le 28-02-2006 à 18:15:02  profilanswer
 

Code :
  1. Worksheets("shares" ).Range("F2" ).Select
  2.     Selection.End(xlDown).Select
  3.    
  4.     Worksheets("shares" ).Columns("F:F" ).Rows("2:" & derniereligne).Select
  5.     For Each cell In Selection
  6.         If IsEmpty(cell.Value) Then
  7.             Worksheets("shares" ).Columns("F:F" ).Delete
  8.         End If
  9.     Next cell


Sur ton code ici ce qui ne marche pas  
1- Worksheets("shares" ).Range("F2" ).Select
    Selection.End(xlDown).Select
    derniereligne = ActiveCell.Row
    Worksheets("shares" ).Columns("F:F" ).Rows("2:" & derniereligne).Select
tu lui fait sélectionner soit la dernière cellule pleine si F2 est rempli soit la première cellule pleine si F2 est vide le tout en partant de la ligne 2 vers la ligne 65536.
2-     If IsEmpty(cell.Value) Then
            Worksheets("shares" ).Columns("F:F" ).Delete
        End If
ici sur ta mauvaise plage dés qu'il rencontre une cellule vide il supprime la colone donc à chaque fois que F2 est vide la colone est supprimée. Si tu avais pris la plage maximun du tableau comme avec le F2:F1000 excel aurait également suprimé tout la colonne dès qu'il aurait reconté une seule cellule vide.
 
bon courage


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
n°1317870
Madilina
pouetteuh
Posté le 03-03-2006 à 15:36:19  profilanswer
 

Bon tout marche avec le code :

Code :
  1. xx=""
  2. worksheets("groups" ).range("B2" ).select
  3. selection.End(xlDown).select
  4. derniereligne=Activecell.row
  5. worksheets("Groups" ).columns("B:B" ).rows("2:"& dernierligne).select
  6. for each cell in selection
  7.    if cell.value<>"" then
  8.       xx="x"
  9.    end if
  10. next cell
  11. if xx = " " then
  12.    worksheets("Groups" ).columns("B:B" ).delete
  13. end if


 
Seulement n'étant pas du tout calée, je fais ca pour chaque colonne, donc jusqu'à F voir plus et pour chaque feuille... Vous imaginez la taille du code.... il faudrait que je l'optimise en mettant une boucle ou en remplacant les noms de colonnes par des variables et appeler des fonctions mais je galère...
J'en ai marre je suis spécialisée réseau pas programmation  :(

n°1318376
watashi
La démotivation : JAMAIS !
Posté le 04-03-2006 à 12:05:11  profilanswer
 

Madilina a écrit :

Seulement n'étant pas du tout calée, je fais ca pour chaque colonne, donc jusqu'à F voir plus et pour chaque feuille... Vous imaginez la taille du code.... il faudrait que je l'optimise en mettant une boucle ou en remplacant les noms de colonnes par des variables et appeler des fonctions mais je galère...
J'en ai marre je suis spécialisée réseau pas programmation  :(


Salut madilina
Une fois de plus je reviens avec l'idée que pour optimiser ton code il vaut mieux ne pas tester chaque cellule de la plage mais tester pour chaque colonne le numéro de ligne de la première cellule vide.
Je ne sais pas comment ton code en plus peut fonctionner si ta cellule en ligne 2 est vide à mois que tu aie en plus rajouté un tri sur la colonne avant.
 
Si tu veux optimiser le taille de ton code et sa vitesse pour l'appliquer non seulement à toutes les colones de ton ta bleau mais aussi à toutes les feuilles de ton classeur (si j'ai bien compris tu intégre dans le même classeur plusieurs fichiers texte essaye donc ce code. Il est commenté, ça t'indiquera ce qu'il fait !

Code :
  1. Dim F as integer, C as integer
  2. 'F sert a faire changer de feuille
  3. 'C sert a faire changer la colone testée
  4. For F = 1 to worksheets.count
  5. 'va parcourir to classeur feuille par feuille
  6.       For C = 6 to 1 Step -1
  7.       'Va parcourir les colones F à A
  8.       'On part de F et pas de A car si tu supprime la colonne B ta colonne qui était C deviendrait B
  9.       ' Ca t'évite d'avoir à jongler avec les numéros de colones
  10.             If Worksheets(F).cells(65536,C).end(xlup).row = 2 then
  11.                ' si =2 alors je supprime la colonne
  12.                ' Si car cela voudra dire que toutes tes cellules sont vide sauf ton entête
  13.                Worksheets(F).Columns(C).Delete
  14.             'sinon je sors du if
  15.             End If
  16.        'Je passe à la colone précédente
  17.        Next C
  18. 'Le parcours de la feuille est terminé
  19. 'Je passe à la feuille suivante
  20. Next F


Taille du code seul 8 lignes, ça devrait te convenior mieux non ?
Sur ce, bonne lecture !
En espérant que tu en tienne compte.
Edit : orthographe


Message édité par watashi le 04-03-2006 à 12:06:42
n°1319198
Madilina
pouetteuh
Posté le 06-03-2006 à 08:40:25  profilanswer
 

Merci beaucoup pour la structure de la boucle, reste plus qu'à compléter car pour l'intant ca ne marche pas, merci vraiment pour ton attention watashi, je vais essayer de faire comme toi... Pas de démotivation, mais c'est pas évident, surtout un lundi matin

n°1319955
watashi
La démotivation : JAMAIS !
Posté le 07-03-2006 à 10:17:59  profilanswer
 

Salut madilina,
Caz ne marche pas c'est un peu vague... Que fait le code sur ton tableau
Quel est le problème exact ?
 
Si tu précise plus on pourra t'aider mais sans informations concrètes c'est impossible .
@+


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
mood
Publicité
Posté le 07-03-2006 à 10:17:59  profilanswer
 

n°1320138
Madilina
pouetteuh
Posté le 07-03-2006 à 13:34:15  profilanswer
 

Bien le bonjour vous!
 
Alors c'est bon après pas mal de prise de tête ca marche correctement
 

Code :
  1. 'recherche et suppression des colonnes vides
  2. Dim F As Integer, C As Integer
  3.     For F = 1 To Worksheets.Count
  4.         Worksheets(F).Select
  5.         For C = 15 To 1 Step -1
  6.             xx = ""
  7.             Worksheets(F).Columns(C).Select
  8.             Selection.End(xlDown).Select
  9.             derniereligne = ActiveCell.Row
  10.             For Each Cell In Selection
  11.                 If Cell.Value <> "" Then
  12.                     xx = "x"
  13.                 End If
  14.             Next Cell
  15.             If xx = "" Then
  16.                 Worksheets(F).Columns(C).Delete
  17.             End If
  18.         Next C
  19.     Next F


 
Bon par contre je suis désolée je ne t'ai encore pas écoutée pour l'histoire de la deuxième ligne  :(  
Mais bon, le principal c'est que tout marche et que ca m'a enlevé une bonne centaine de lignes :)
Merci encore pour ton aide, ta boucle m'a beaucoup aidé!
J'ai pas encore tout a fait fini, il faut que je fasse la mise en page pour pouvoir ensuite imprimer le fichier Excel. Je pense que le plus dur est passé!
Encore merci!
A bientot


Message édité par Madilina le 07-03-2006 à 13:35:44

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

  test si colonne vide à partir de la 2eme ligne

 

Sujets relatifs
[Resolu]selection de ligne d'un tableau dynamique et formulaire[BATCH] Saisie clavier sur une nouvelle ligne
Vente en ligne CB sécurisée shtmlChangement de ligne en CSS
[XSLT] Ecrire dans un XLST à partir de .NETListe des partages de fchiers a partir d'appli java
Signification d'une ligne de code en PHP[Oracle XML] Requete simple, 1 ligne de résultat = plusieurs résultats
[CSS] Répartir régulièrement sur une ligne[debutant C++] [Urgent] Tableau 2D nombre de colonne inconnu
Plus de sujets relatifs à : test si colonne vide à partir de la 2eme ligne


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