Suppression lignes vides sur Tableau Nommé Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
David69400
Jeune membre
Jeune membre
Messages : 28
Inscrit le : 2 avril 2014
Version d'Excel : 2010

Message par David69400 » 24 avril 2014, 10:50

Bonjour,

Je suis nouveau sur le forum et en VBA, merci de votre indulgence.
Je travaille beaucoup avec des tableaux nommés dans ExceL et je suis venu à la VBA dès lors que j'ai voulu mettre des "protections" qui ont pour conséquence qu'on ne peut plus insérer des lignes automatiquement, ni filtrer pour ordonner, ni supprimer..

Je vous joint un fichier excel d'exemple.
Il s'agit d'une saisie d'info NOM + PRENOM + TAUX...

J'arrive à faire un bouton pour ajouter un nouvelle personne, qui s'incrémente à la bonne place (trie auto).

Je souhaite faire un bouton pour supprimer une/des lignes vides dans ce tableau particulier.
(ex, si j'ai plusieurs tableau sur la même feuille, je ne veux pas supprimer une ligne entière...)

Concrètement, je n'y arrive pas,...
J'ai regarder beaucoup de poste, mais pas le bon sans doute.

merci de votre aide.

David

ps:
par ailleurs, concernant le code de la USERFORM de saisie, je voulais savoir s'il était possible encore une fois de le limiter au tableau, au lieu de la feuille, en utilisant les nom de colonne du tableau par ex:

L = Range("A65000").End(xlUp).Row + 1 => L = Range("TAB_OPERATEURS[NOM]").End(xlUp).Row + 1

'pour saisir dans les 3 colonnes
Range("A" & L).Value = Nom => Range("TAB_OPERATEURS[NOM]" & L).Value = Nom
Range("B" & L).Value = Prenom => Range("TAB_OPERATEURS[PRENOM]" & L).Value = Prenom
Range("C" & L).Value = Taux => Range("TAB_OPERATEURS[TAUX]" & L).Value = Taux

j'ai essayé, mais cela ne fonctionne pas..

Merci pour votre aide,



David
TEST_DB_230414.xlsm
(50.03 Kio) Téléchargé 89 fois
B
Benead
Membre fidèle
Membre fidèle
Messages : 455
Inscrit le : 15 octobre 2011
Version d'Excel : 2007 FR 32bits- 2013 FR 64bits

Message par Benead » 24 avril 2014, 13:25

Bonjour David,

Voici une solution pour la validation du userform, il y a peut-être plus simple, mais celle-ci fonctionne :
   Range("tab_operateurs").ListObject.ListRows.Add
   L = Range("tab_operateurs").ListObject.ListRows.Count
   Range("tab_operateurs").ListObject.ListRows(L).Range.Cells(, Range("tab_operateurs").ListObject.ListColumns("NOM").Index) = Nom
   Range("tab_operateurs").ListObject.ListRows(L).Range.Cells(, Range("tab_operateurs").ListObject.ListColumns("PRENOM").Index) = Prenom
   Range("tab_operateurs").ListObject.ListRows(L).Range.Cells(, Range("tab_operateurs").ListObject.ListColumns("TAUX").Index) = Taux
t
N'oublie pas de déprotéger la feuille avant de faire la modification.

Et pour la suppression des lignes vides :
Private Sub Bouton_Supprimer_Click()
    ActiveSheet.Unprotect "mdp"
    For L = Range("tab_operateurs").ListObject.ListRows.Count To 1 Step -1
    Range("tab_operateurs").ListObject.ListRows(L).Range.Select
      If WorksheetFunction.CountA(Range("tab_operateurs").ListObject.ListRows(L).Range) = 0 Then
         Range("tab_operateurs").ListObject.ListRows(L).Delete
      End If
    Next L
    ActiveSheet.Protect "mdp"
End Sub
A+
Benoît Marchand
[Benead]
Avatar du membre
David69400
Jeune membre
Jeune membre
Messages : 28
Inscrit le : 2 avril 2014
Version d'Excel : 2010

Message par David69400 » 24 avril 2014, 14:20

Bonjour Benoît,

Merci pour votre réponse rapide !

La première partie de codification du Userform spécifiquement aux tableau fonctionne bien.
A vrai dire, les nouvelles lignes paraissent effectivement longue par rapport aux initiales, mais avec l'avantage de pointer les tête de colonne nommées du tableau.

En revanches, j'ai collé la Macro pour la partie suppression ligne vide, mais je n'arrive pas à la faire marcher.
cf fichier joint.

Un dernier petit coup de main, si vous pouvez y jeter un oeil,

merci !

David
TEST_DB_230414 vu BENEAD.xlsm
(51.53 Kio) Téléchargé 59 fois
Avatar du membre
Mattsly
Membre fidèle
Membre fidèle
Messages : 239
Inscrit le : 31 mars 2014
Version d'Excel : 2010 FR

Message par Mattsly » 24 avril 2014, 14:57

Bonjour,

Pour la suppression d'une ligne entière tu peux mettre ça :
Sub supp_ligne()
x = InputBox("No. ligne à supprimer ?")
If x <> "" Then
    Sheets("Feuil1").Rows(x).Delete
End If
End Sub
Ou sinon pour supprimer juste une cellule :
Sub supp_ligne()
    x = InputBox("No. ligne à supprimer ?")
    y = InputBox("No. colonne à supprimer ?")
If x <> "" Then
    Sheets("Feuil1").Cells([surligner]x[/surligner], [surligner]y[/surligner]).Delete
End If
    End Sub
Le "y" correspond à la colonne et le "x" à la ligne.

Cdlt
TEST_DB_230414 vu BENEAD.xlsm
(51.41 Kio) Téléchargé 65 fois
Avatar du membre
David69400
Jeune membre
Jeune membre
Messages : 28
Inscrit le : 2 avril 2014
Version d'Excel : 2010

Message par David69400 » 24 avril 2014, 15:20

Bonjour Matsly,

c'est une réponse intéressante mais non concluante:
intéressante, car je peux choisir le numéro de ligne à supprimer
mais non concluante car, je ne veux suppirmier à minima que la ligne vide,
et surtout, que la ligne "à l'interieur" du tableau, et non la ligne entière
qui pourra me supprimer d'autres données sur la même feuille..
(cf ma demamde initiale)

merci de votre contribution en tout les cas !

David
B
Benead
Membre fidèle
Membre fidèle
Messages : 455
Inscrit le : 15 octobre 2011
Version d'Excel : 2007 FR 32bits- 2013 FR 64bits

Message par Benead » 24 avril 2014, 19:03

David,

Effectivement, j'avais remarqué que les deux premières lignes ne supprimaient pas avec le code que je t'ai donné, mais c'est parce que ce sont des fausses lignes vides. Pour t'en convaincre, sélectionne la ligne et regarde la barre d'état (là ou il y a généralement la somme automatique), tu verras qu'Excel te dira qu'elles ne sont pas vides !

Si tu effaces leurs contenus manuellement, elles se supprimerons avec le code que je t'ai donné.

Si cela ne te convient pas, il faudra modifier la condition de suppression.
A+
Benoît Marchand
[Benead]
Avatar du membre
David69400
Jeune membre
Jeune membre
Messages : 28
Inscrit le : 2 avril 2014
Version d'Excel : 2010

Message par David69400 » 25 avril 2014, 08:52

Bonjour Benoît,

Merci pour ton retour.

Effectivement, une suppression manuel des cases les vide bien et le bouton suppression marche alors.
C'est en partie ce que je cherche dans le cas, ou l'on supprime un opérateur existant préalablement.

En revanche, les "fausses lignes vides" correspondent à des insertions ''à vide" de la user forme.

Je ne sais pas ce qui est mis précisément dans ces cases, mais je veux bien qu'on les efface aussi
et je ne sais pas "modifier la condition de suppression".
Pour le moment c'est =0 et j'ai essayé de mettre = "", ca ne marche pas, et de toute façon il faut les 2 conditions...

Ou sinon, on peut dire conditionner le clique du bouton valider à la présence d'au moins une saisie dans la case Nom et/ou Prénom ?

Voilà, si tu peux encore un peu m'aider sur ces points ?

Je te remercie par avance

David,
B
Benead
Membre fidèle
Membre fidèle
Messages : 455
Inscrit le : 15 octobre 2011
Version d'Excel : 2007 FR 32bits- 2013 FR 64bits

Message par Benead » 25 avril 2014, 12:21

Bonjour David,

Pour contrôler que les TextBox soient remplis :
If Nom = Empty Or Prenom = Empty Or Taux = Empty Then Exit Sub

Mais tu pourrais aussi tester le nb de caractères, si le taux est numérique, etc. et mettre l'information dans un label :
If len(Nom)<10 then
LabelInfo.Caption="Le nom doit comporter x au moins 10 caractères..."
Goto Fin
end if
Et en fin de procédure :
Fin:
End Sub
Et pour forcer la suppression des lignes vides, plutôt que de faire une boucles sur toutes les cellules de la ligne, il suffit de tester la cellule Nom et si elle est vide alors on supprime la ligne :
Private Sub Bouton_Supprimer_Click()
       
       ActiveSheet.Unprotect "mdp"
       
       For L = Range("tab_operateurs").ListObject.ListRows.Count To 1 Step -1
'       Range("tab_operateurs").ListObject.ListRows(L).Range.Select ' A supprimer (Pour test)
          If Range("tab_operateurs").ListObject.ListRows(L).Range.Cells(1, 1) = Empty Then
             Range("tab_operateurs").ListObject.ListRows(L).Delete
          End If
       Next L
       
        ActiveSheet.Protect "mdp"
End Sub
A+
Benoît Marchand
[Benead]
Avatar du membre
David69400
Jeune membre
Jeune membre
Messages : 28
Inscrit le : 2 avril 2014
Version d'Excel : 2010

Message par David69400 » 28 avril 2014, 11:04

Bonjour Bernard,

Je reviens vers vous pour terminer mon fichier d'ajout...

En fait, vendredi, dans la réponse de mon message de 14:20 dans lequel j'avais inséré les formules que vous m'aviez transmises, j'avais pas fait attention, mais le fichier ne fonctionnait pas correctement.

En effet, l'ajout d'un nouvel opérateur en supprime un ... bref à la fin, y'en a plus.
Je n'arrive pas à trouver l'erreur et du coup, je m'y perd avec le reste des formules...

Bref, je préfère revenir vers vous pour voir si vous auriez l'amabilité de me donner un dernier coup de main globl, directement sur le fichier de 14:20...

Pour clarifier, ce que je veux avoir au final:

- Le bouton "Nouvel opérateur"
=> qui lance la user form, valide que les 3 cases ne soit pas vide pour ne pas insérer des lignes à blanc avec une msg box qui pourrait dire '' la saisie des 3 infos n'est pas compléte, voulez vous continuer ?" tant que c'est pas compléte...
si oui, on reste sur la user box de saisie , si non on sort...
une fois les 3 cases complétées, classement pas A/Z sur le nom (comme j'ai essayé de le farie dès le début)

- le bouton "effacer ligne"
qui sera utiliser quand on veut simplement sortir un opérateur historique: on peut effacer les 3 lignes dans le tableau, du coup, il reste un ligne vide, et la formule que vous m'avez proposée initialement fonctionne bien il me semble

je vous remercie de votre retour global !


David
B
Benead
Membre fidèle
Membre fidèle
Messages : 455
Inscrit le : 15 octobre 2011
Version d'Excel : 2007 FR 32bits- 2013 FR 64bits

Message par Benead » 28 avril 2014, 23:33

Bonsoir David,

Bernard ???
En effet, l'ajout d'un nouvel opérateur en supprime un
Dans l'événement Bouton_Valider_Click(), il faut commencer par déprotéger la feuille avant la ligne
Range("tab_operateurs").ListObject.ListRows.Add
Sinon, le nouvel opérateur écrase le dernier, par contre cela ne supprime aucune ligne ! Tu as peut-être un autre problème ailleurs.

Concernant la validation, oui tu peux mettre un MsgBox d'erreur.Personnellement, je ne suis pas fan de ce genre de chose parce que l'utilisateur est obligé de cliquer sur Ok pour continuer, je préfère rester sur l'UF et lui mettre un message dans un label. Tu sais mettre un MsgBox si erreur ?

J'ai bien lu ton message mais je ne sais pas ce que tu attends encore de moi. Dis-moi clairement si tu as encore besoin d'aide ou si tu peux t'en sortir tout seul.
A+
Benoît Marchand
[Benead]
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message