test si colonne vide à partir de la 2eme ligne

test si colonne vide à partir de la 2eme ligne - VB/VBA/VBS - Programmation

Marsh Posté le 28-02-2006 à 10:05:29    

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

Reply

Marsh Posté le 28-02-2006 à 10:05:29   

Reply

Marsh Posté le 28-02-2006 à 10:34:34    

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
Reply

Marsh Posté le 28-02-2006 à 11:41:54    

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 ;-)
Reply

Marsh Posté le 28-02-2006 à 11:50:28    

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
Reply

Marsh Posté le 28-02-2006 à 18:01:26    

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 ;-)
Reply

Marsh Posté le 28-02-2006 à 18:15:02    

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 ;-)
Reply

Marsh Posté le 03-03-2006 à 15:36:19    

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  :(

Reply

Marsh Posté le 04-03-2006 à 12:05:11    

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
Reply

Marsh Posté le 06-03-2006 à 08:40:25    

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

Reply

Marsh Posté le 07-03-2006 à 10:17:59    

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 ;-)
Reply

Marsh Posté le 07-03-2006 à 10:17:59   

Reply

Marsh Posté le 07-03-2006 à 13:34:15    

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
Reply

Sujets relatifs:

Leave a Replay

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