Suppression lignes vides sur Tableau Nommé

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

104test-db-230414.xlsm (50.03 Ko)

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

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

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(x, y).Delete
End If
    End Sub

Le "y" correspond à la colonne et le "x" à la ligne.

Cdlt

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

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.

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,

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

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

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.

Bonjour Benoît !

Désolé pour la confusion des prénoms.

Avec votre dernier poste, mon besoin est effectivement résolu. (ci-joint).

Je peux ajouter un nouvel opérateur.

Si la saisi est faite à blanc, ou si l'on a effacer une ligne de données,

alors je peux supprimer cette ligne à vide avec le 2nd bouton.

Merci pour votre collaboration !

David

22test-db-290414.xlsm (51.57 Ko)

Bonsoir David,

Je trouvais juste cela rigolo qu'on m'appelle Bernard...

Quand tu cliques sur le bouton Valider, tu devrais interdire la saisie si le nom est vide, cela fait plus professionnel. Autre solution que celle proposée précédemment (affichage d'un message) et qui est très professionnelle, c'est de verrouiller le bouton Valider à l'initialisation de l'UF (Bouton_Valider.Enabled=False) et d'utiliser l'événement Change du TextBox Nom pour le déverrouiller si le Len(Nom)>0 et le reverrouiller si l'utilisateur efface le nom qu'il vient de saisir, et aussi après avoir valider un nouvel opérateur. Je te laisse essayer de mettre cela en forme et reviens si pb (ce n'est pas compliqué)...

Ici c'est un forum sympa, exit le vouvoie, on se tutoie,c'est bien plus sympa

Rechercher des sujets similaires à "suppression lignes vides tableau nomme"