Supprimer des lignes de code dans une Sub

Bonjour à toutes et à tous,

Je suis à la recherche de l'instruction permettant de supprimer certaines lignes de code au sein d'une sub() SANS supprimer la sub()

Avec le code suivant, j'arrive à identifier les lignes qui m'intéressent mais quand j'applique la suppression (càd DeleteLines Debut, Lignes), ça plante !

Sub suppression_lignes_de_code()
Dim Debut As Integer, Lignes As Integer
With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
        Debut = .ProcStartLine("Exemple", 0) + 3 ' on garde les 2 premières lignes
        Lignes = .ProcCountLines("Exemple", 0) - 1  ' on s'arrête à l'avant-dernière
        MsgBox "Le commencement vaut " & Debut & " et la fin vaut " & Lignes  ' juste pour contrôle
        .DeleteLines Debut, Lignes ' cette instruction plante !!!
End With
End Sub

Qui peut me dire comment réaliser ça ?

Merci d'avance

Bonjour

Les lignes après la procédure Exemple influent sur le résultat attendu

Le second paramètre de la fonction .DeleteLines est le nombre de ligne à supprimer donc ton code doit ressembler à

    Sub suppression_lignes_de_code()
    Dim Debut As Integer, Lignes As Integer
    With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
            Debut = .ProcStartLine("Exemple", 0) + 3 ' on garde les 2 premières lignes
           Lignes = .ProcCountLines("Exemple", 0) - 1  ' on s'arrête à l'avant-dernière
           MsgBox "Le commencement vaut " & Debut & " et la fin vaut " & Lignes  ' juste pour contrôle
           .DeleteLines Debut, Lignes- Debut' cette instruction plante !!!
    End With
    End Sub

Bonsoir Banzai64,

bien vu, c'était tellement simple que je ne l'avais pas vu. Merci pour ton aide !

En revanche, je suis étonné que ça ne pointe pas exclusivement sur le nombre de lignes présentes dans la sub précisée (ici "Exemple"). Ca compte tout ce qu'il y a en Module2, donc si tu as d'autres choses sous Sub Exemple() et bien ça compte tout.

As-tu une idée pour restreindre le décompte à ce qu'il y a uniquement dans Exemple() ?

Merci d'avance

Bonsoir

Désolé

Pour trouver pourquoi tu avais ce problème j'ai fouiné un peu sur la toile

Mais je te rassure je n'y connais rien

Si tu n'as pas d'autre réponse, clôture ce post et ouvre en un autre

Salut Banzai64,

je te remercie pour ton aide, tu as raison, ce sujet doit faire l’objet d’un nouveau fil.

En revanche, je me suis inspiré de ton code et ne comprends pas pourquoi celui qui suit plante. J’ai voulu mettre dans une variable la première et la dernière ligne à flinguer mais échec, pourtant je me suis assuré au préalable que les valeurs étaient bonnes (via affichage dans msgbox).

As-tu une idée où ça coince ?

Sub Squeezer_lignes_code()
Dim Debut As Long, Lignes As Long, FirstRow As Long, LastRow As Long
With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
        Debut = .ProcStartLine("Exemple", 0) ' donne la première ligne de la Sub()
        Lignes = .ProcCountLines("Exemple", 0) ' donne la dernière ligne de la Sub()
        FirstRow = Debut + 2  ' car on veut conserver au moins une ligne entre Sub() et End Sub()
        LastRow = Lignes - 1  ' car on veut conserver la ligne où il y a End Sub

        MsgBox "Le commencement vaut " & Debut & " et la fin vaut " & Lignes
        MsgBox "La 1ère ligne à supprimer est " & FirstRow & " et la dernière à supprimer est " & LastRow

        .deleteLines FirstRow, LastRow 
        ' ça plante en me disant "Argument ou appel de procédure incorrect"
        ' pourtant en ayant affiché la valeur préalablement, je vois bien que les
        ' chiffres sont bons ! (quelque soit l'ordre Last ou First au début)
End With
End Sub

Bonjour

C'est le même problème que dans ton 1er post

.deleteLines FirstRow, LastRow- FirstRow

Re,

merci pour ta réponse.

Plus j'avance et moins je comprends ...

Pourquoi n'est-il pas possible de placer la valeur de début et de fin dans une variable ? Après tout, c'est bien ce qu'on fait en affectant Debut = .ProcStartLine("Exemple", 0) et Lignes = .ProcCountLines("Exemple", 0) donc pourquoi ne peut-on pas manipuler ces valeurs ?

Pourquoi ça plante quand on écrit que la position basse vaut Lignes-1 ?

D'ailleurs, en bricolant, je me rends compte que ça ne plante que si le deuxième terme de l'instruction est autre qu'une soustraction ou une constante. Ainsi, l'instruction

.deleteLines FirstRow, 5 ne plante pas, alors que FirstRow est une variable calculée préalablement ... ???

as-tu une idée ?

Bonjour

Je vais essayer de t'esssssspliquer

L'instruction .deleteLines Ligne_de_départ, Nombre_de_ligne_ à_enlever

Imagine un cahier avec 100 pages

Si on te dit de la page 20 tu enlèves 100 pages, dans l'absolu tu ne pourras pas, tu ne pourras enlever que 100 - 20 pages

.deleteLines travaille de la même façon, et comme elle est bornée (têtue) si le nombre de ligne à enlever + le numéro de la ligne de départ dépasse le nombre de ligne au total elle râle (message d'erreur)

Après moi je ne sais plus comment dire

OK,

effectivement c'est beaucoup plus clair comme ça ! Je n'avais pas capté qu'il s'agissait du NOMBRE de lignes, je pensais que c'était la position d ela dernière ligne.

Mais comme je risque de lancer la procédure plusieurs fois, à chaque itération, le nombre de lignes se réduit; or,n je veux impérativement conserver la ligne avec Sub() et la ligne avec End sub() donc j'imagine que je vais devoir tester avec if/end if ...

Je teste ça !

Encore merci pour ta patience et tes conseils

Bonjour à tous,

Mais comme je risque de lancer la procédure plusieurs fois, à chaque itération, le nombre de lignes se réduit

Tu pourrais les remplacer par un commentaire avec .ReplaceLine

Mais .ProcStartLine et ProcCountLines doivent te permettre de situer tes lignes dans le code (propriété en lecture). Seulement il faut tenir le compte des suppressions qq part

eric

Bonjour à tous,

en fait, après moult essais, il n'y a pas besoin de gérer les valeurs si on met en oeuvre

.deleteLines FirstRow, LastRow- FirstRow

Ce qui m'avait embrouillé, c'est que deleteLines x,y fonctionne avec

x=1ere ligne à supprimer

y= NOMBRE de lignes à supprimer à partir de la xième (et NON rang de la ligne)

alors que je pensais que y=position (ou n° de ligne) jusqu'où supprimer les lignes ...

En fait il y a assez peu de littérature à ce sujet et je m'étais égaré

Encore merci à vous tous et particulièrement à Banzai64

(pour moi le fil est donc clos mais je ne sais pas où cliquer pour cela !)

Rechercher des sujets similaires à "supprimer lignes code sub"