Fonction pour supprimer ligne

Bonjour à tous.
Une fois de plus j’en appel à la communauté.
Mais là, j’ai réellement besoin d’aide.

J’ai créé 2 fonctions ; la première me permet de trouver une ligne en fonction d’une valeur recherchée. La seconde a pour but de la supprimer.
Ici, c’est la seconde qui me pose problème
J’ai beau tout essayer, pas moyen de supprimer cette foutue ligne.
J’ai trituré mon code dans tous les sens mais rien n’y fait.
Si quelqu’un avait une idée, je lui en serait vraiment reconnaissant.
De mon coté, je commence vraiment à désespérer.

Voici le code de mes fonctions :

Public Function SuppLigne(MyVal As String, NomFeuille As String) As Boolean
'Fonction utilisée pour supprimer une ligne dans une feuille Excel.
'Utilisé conjointement avec [TrouveLigne] afin de récupérer le numéro de la ligne à supprimer.

Dim Ws As Worksheet     'Réf à la feuille de calcul
Dim Plage As Range

Set Ws = ThisWorkbook.Sheets(NomFeuille)

'If (TrouveLigne(MyVal, NomFeuille)) <> 0 Then
'    Set plage = Ws.Cells(TrouveLigne(MyVal, NomFeuille)).EntireRow.Select
'    Selection.Delete Shift:=xlUp
'    SuppLigne = True
'End If

If (TrouveLigne(MyVal, NomFeuille)) <> 0 Then
    Ws.Cells((TrouveLigne(MyVal, NomFeuille)), 1).EntireRow.Delete Shift:=xlUp
'    Ws.Rows(TrouveLigne(MyVal, NomFeuille)).EntireRow.Delete Shift:=xlUp
    SuppLigne = True
End If

Set Plage = Nothing
Set Ws = Nothing

End Function

Public Function TrouveLigne(MyVal As String, NomFeuille As String) As Long
'Fonction chargée de récupérér le Numéro de ligne en rapport avec la valeur recherchée.

Dim Ws As Worksheet     'Réf à la feuille de calcul
Dim MyRange As Range    'Réf à la plage de cellules
Dim MyCell As Range     'Réf à la cellule recherchée

Dim Lng_LastRow As Long     'dernière Ligne
Dim Lng_LastCol As Long     'dernière colonne

'On définit la plage de cellule sur laquelle va s'effectuer la recherche
Set Ws = ThisWorkbook.Sheets(NomFeuille)
Lng_LastRow = Ws.Range("A" & Rows.Count).End(xlUp).Row
Lng_LastCol = Ws.Cells(1, Cells.Columns.Count).End(xlToLeft).Column

'Si le tableau est vide on quitte la procédure.
'Attention, le tableau contient 1 ligne d'en-tête
If Lng_LastRow <= 1 Then
    Set Ws = Nothing
    Exit Function
End If

TrouveLigne = 0

Set MyRange = Ws.Range(Cells(1, 1), Cells(Lng_LastRow, Lng_LastCol))

Set MyCell = MyRange.Find(What:=MyVal, LookIn:=xlValues, LookAt:=xlWhole)

If MyCell Is Nothing Then Exit Function

TrouveLigne = MyCell.Row

Set MyCell = Nothing
Set MyRange = Nothing
Set Ws = Nothing

End Function

J’attends vos réponses avec impatience.
Please Heeeeeelp

Bonsoir

Je ne sais pas si avec une fonction on peux supprimer une ligne
Seule chose que j’arrive à faire c’est de faire passer à VRAI la cellule qui possède cette fonction mais en modifiant celle ligne ainsi :

Set MyRange = Ws.Range(Cells(1, 1).Address, Cells(Lng_LastRow, Lng_LastCol).Address)

et en ajoutant une variable Public par exemple « A » avec laquelle je récupère la valeur Trouveligne dans la fonction Function TrouveLigne comme ceci :

TrouveLigne = MyCell.Row
A = TrouveLigne

Cette variable public que je rapporte ici dans la fonction « Function SuppLigne » ici :

Ws.Cells(A, 1).EntireRow.Delete Shift:=xlUp

Il faut bien évidemment déclarer cette variable Public comme ceci :

Public A

Mais la ligne ne se supprime pas
Si j’exécute dans une Sub classique cette même ligne de code de suppression la ligne est bien supprimée
Si j’inclus dans la fonction l’appel de la macro de cette Sub classique avec le code de suppression la ligne ne se supprime pas
J’ai la nette impression que par une fonction on ne peut supprimer une ligne et pourtant le traitement passe bien sur la ligne de code concernée pour cette suppression (vérifié pas à pas)

Ainsi le résultat de mes recherches

Re,

Sans variable Publique (qui doivent être bannies !!!)
Créer une fonction quand une seule ligne de code suffit me semble superflu :

Option Explicit
Sub test()
Dim col As Range, noL As Long
  
  Set col = ThisWorkbook.Worksheets(1).Columns(2)  'ou n'importe quelle colonne d'un autre classeur
  noL = TrouveLigne("Lucette", col)
  If noL = 0 Then
    MsgBox "Non Trouvé"
  Else
    col.Parent.Rows(noL).Delete
    MsgBox "`Ligne " & noL & " supprimée."
  End If

End Sub

Public Function TrouveLigne(MyVal As Variant, myCol As Range) As Long
'Fonction chargée de récupérér le Numéro de ligne en rapport avec la valeur recherchée.
Dim MyCell As Range
  Set MyCell = myCol.Find(What:=MyVal, LookIn:=xlValues, LookAt:=xlWhole)
  If Not MyCell Is Nothing Then TrouveLigne = MyCell.Row
  Set MyCell = Nothing
End Function
``

Bonjour
Pourquoi ceci :

Sans variable Publique (qui doivent être bannies !!!)

Depuis de nombreuses années j ai été amené à utiliser leur service sans aucune difficulté ni désagrément de quelle nature que ce soit et elles m ont bien rendu service
Chaque situation peut nécessiter ou non leur concours
Maintenant tu as peut être de tres bonnes raisons pour être si tranché fais nous les partager je suis preneur
Merci d avance

La première raison, c’est que j’ai appris à coder à une époque où il fallait économiser chaque octet (pas Ko ou Mo). C’est très formateur pour apprendre à optimiser les ressources.
La principale raison, c’est qu’il est préférable de limiter la portée des variables au strict nécessaire : pourquoi laisser vivre une variable quand c’est inutile ? Pour consommer des ressources ?
Une autre très bonne raison c’est une meilleure architecture du code (plus lisible, plus simple, plus autonome, plus maintenable)
Et je partage entièrement l’argumentation de Pierre Fauconnier qui tu trouveras ici :
Problème variables publiques par Pierre Fauconnier

La différence entre le code que j’ai proposé et le code d’origine me semble suffisamment démonstrative.

Bonsoir FFO, Bonsoir Patrice.

@FFO
En effet, en passant par un Sub plutôt que par une fonction, Plus de problème.
Cela me laisse assez perplexe étant donné que la seule différence majeure est que la fonction te renvoie une valeur. Le plus marrant dans l’histoire, c’est que j’ai refait des test avec ladite fonction sans rien toucher au code et tout s’est déroulé sans le moindre accroc. La seule chose que j’avais fait, c’est quitter Excel pour tester un exemple qu’un ami m’avait envoyé. Au redémarrage d’excel tout marchait comme sur des roulettes. Je suis rudement soulagé mais je rage de ne pas comprendre l’origine du problème.

@Patrice33740
Merci beaucoup pour ton aide et tous ces précieux renseignements.
A l’avenir, je tacherai de faire beaucoup plus attention à la portée de mes variables et je penserais à toi à chacune de mes déclarations. :grin:
Je m’en vais de ce pas lire attentivement l’article de Pierre Fauconnier, histoire d’en savoir un peu plus et de ne pas refaire les mêmes erreurs.

Je vous remercie beaucoup pour votre aide qui, comme d’habitude, m’a été d’un grand secours
Une très bonne soirée à tout deux et à (très) bientôt sur un prochain fil…

Longue vie à Excel

Je te remercie beaucoup pour ta réponse
Tu as tout à fait raison de vouloir simplifier optimiser simplifier les procédures
C est à mon sens une saine démarche pour l efficacité de l exécution pour la compréhension et l évolution du code
Malgré tout lorsque des procédures par l ampleur des données en entrée les opérations très denses et complexe à effectuer accompagner d une multitudes de contrôle de cas divers et variés à mettre en musique atteignant pour certaine d entre elles les limites d absorption de l éditeur de macro sont particulièrement conséquentes pas d autres choix pour les scinder que de faire appel aux variable public salvatrice et en près de 20 ans de vie professionnel baigné dans toutes les automatisation qu elles représentaient ils à bien fallu composer avec elles pour mon plus grand bien et je leur doit une fiere chandelle
Certain traitement demandé la bagatelle de plus d 1 heure pour arriver au terme
Donc effectivement sur ce cas il est mieux comme tu dis de concentrer sur une seule procédure et de s affranchir du concours de variable public
Pour autant je ne tiendrais pas de tel propos les concernant car j ai bien été content de leur existant par le passé
Ces propos ne sont que le reflet de mon expérience

Maintenant chacun voit midi à sa porte

Il y a longtemps que j’ai compris que la variables publiques rendent le code spécifique et inutilisable dans d’autres contextes sans modification.
Il n’y a que très peu de cas où je suis contraint d’en utiliser.
Dans tous les autres cas le code n’est pas plus compliqué, c’est juste une discipline d’écriture qui produit un code plus universel et donc facilement réutilisable sans avoir besoin de refaire des tests…

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.