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
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)
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
``
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.
@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.
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…
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
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…