Microsoft 365 Bug de macro pour effacer une ligne

ShrekL

XLDnaute Junior
Bonjour groupe de super héro d'Excel.

Je fais appel à vous encore aujourd'hui pour voir si quelqu'un est en mesure de m'aider à résoudre un problème que je rencontre avec un fichier Excel que j'ai créé.

J'ai créé une macro associée à un bouton de contrôle qui permet à l'utilisateur d'effacer une même ligne sur plusieurs feuille de calcul sans avoir à renommer les no d'item dans la colonne 1.

Pour une raison que j'ignore, il y a un bug entre la première partie de ma commande qui efface la ligne sur la feuille active (Suivi budgétaire) et la 2e partie qui efface la ligne sur les feuilles de rapport.

Vous trouverez ci-joint l'extrait pertinent de mon fichier dans lequel j'ai recopié ma macro en 3 copie pour une meilleure compréhension.

Vous verrez 3 boutons servant à effacer une ligne d'item.
- Le 1er fait appel à la macro complète
- Le 2e fait appel à la copie de la macro mais dans laquelle la 2e partie de la macro est désactivée
- Le 3e fait appel à la copie de la macro mais dans laquelle la 1ere partie est désactivée

La morale de l'histoire est que le 2e et 3e bouton fonctionne sans bug mais le 1er (faisant appel à la macro complète) crée un bug.

J'en comprend qu'il y a conflit entre la 1ere et la 2e partie de ma macro mais je ne le trouve vraiment pas.

Je vous met aussi ci-bas une copie de ma macro
VB:
Sub Effacer_ligne()
'
' Effacer les lignes sélectionnées

'2E PARTIE DE LA MACRO
'   Définition des variables
    Dim rng1 As Range
    Set rng1 = Cells(ActiveCell.Row, 1)
   
    Range(rng1.Address).EntireRow.Delete
    Cells(ActiveCell.Row, 1).Select
    ActiveCell.Offset(-2, 0).Copy
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

'2E PARTIE DE LA MACRO
'   DANS LE RAPP. D'ESTIMATION

    Sheets("RAPP ESTIMATION").Activate
    Range(rng1.Address).Select
    Selection.EntireRow.Delete
    ActiveCell.Offset(-1, 0).Copy
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

   

'   DANS LE RAPP DE SOUMISSION

    Sheets("RAPP SOUM").Activate
    Range(rng1.Address).Select
    Selection.EntireRow.Delete
    ActiveCell.Offset(-1, 0).Copy
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

       
    Sheets("SUIVI BUDGÉTAIRE").Select

End Sub

Merci infiniment de votre aide.
 

Pièces jointes

  • Effacer une ligne_Test.xlsm
    391.2 KB · Affichages: 5
Solution
Bonjour @ShrekL

C'est normal car quand tu enchaines la macro "totale" tu détruis set rng1 🤔

Set rng1 = Cells(ActiveCell.Row, 1)
La destruction est ici donc elle n'existe plus :oops:
Range(rng1.Address).EntireRow.Delete
et quand tu la rappelles ici 🙃
'2E PARTIE DE LA MACRO
' DANS LE RAPP. D'ESTIMATION

Sheets("RAPP ESTIMATION").Activate
Range(rng1.Address).Select

et bien ça plante o_O

Par contre quand tu fais en 2 partie distinctes tu prends bien soin de la déclarer à chaque fois

Sub Effacer_ligne_1ere_ptie()
'
' Effacer les lignes sélectionnées

' Définition des variables
Dim rng1 As Range
Set...

Phil69970

XLDnaute Barbatruc
Bonjour @ShrekL

C'est normal car quand tu enchaines la macro "totale" tu détruis set rng1 🤔

Set rng1 = Cells(ActiveCell.Row, 1)
La destruction est ici donc elle n'existe plus :oops:
Range(rng1.Address).EntireRow.Delete
et quand tu la rappelles ici 🙃
'2E PARTIE DE LA MACRO
' DANS LE RAPP. D'ESTIMATION

Sheets("RAPP ESTIMATION").Activate
Range(rng1.Address).Select

et bien ça plante o_O

Par contre quand tu fais en 2 partie distinctes tu prends bien soin de la déclarer à chaque fois

Sub Effacer_ligne_1ere_ptie()
'
' Effacer les lignes sélectionnées

' Définition des variables
Dim rng1 As Range
Set rng1 = Cells(ActiveCell.Row, 1) '<== ici

Sub Effacer_ligne_2e_ptie()
'
' Effacer les lignes sélectionnées

' Définition des variables
Dim rng1 As Range
Set rng1 = Cells(ActiveCell.Row, 1) '<== ici
Et donc cela ne plante pas ...

*Voila l'explication 🤣🤣

*Pense à te servir de la touche F8 pour voir ton code avancer pas à pas et tu pourras voir pas mal de chose quand il y a un pb sur ton code ....

*Par contre ton code n'est pas terrible du tout..... ;)
*On peut en général se passer des select et des activate ==> pas besoin d'aller dans la feuille pour faire une action dessus......:rolleyes:

Si tu veux supprimer la ligne active ceci peux le faire ....
ActiveCell.EntireRow.Delete

*Merci de ton retour

@Phil69970
 

ShrekL

XLDnaute Junior
Bonjour @ShrekL

C'est normal car quand tu enchaines la macro "totale" tu détruis set rng1 🤔


La destruction est ici donc elle n'existe plus :oops:

et quand tu la rappelles ici 🙃


et bien ça plante o_O

Par contre quand tu fais en 2 partie distinctes tu prends bien soin de la déclarer à chaque fois




Et donc cela ne plante pas ...

*Voila l'explication 🤣🤣

*Pense à te servir de la touche F8 pour voir ton code avancer pas à pas et tu pourras voir pas mal de chose quand il y a un pb sur ton code ....

*Par contre ton code n'est pas terrible du tout..... ;)
*On peut en général se passer des select et des activate ==> pas besoin d'aller dans la feuille pour faire une action dessus......:rolleyes:

Si tu veux supprimer la ligne active ceci peux le faire ....


*Merci de ton retour

@Phil69970
Merci merci merci phil69970!!! Cela a très bien fonctionné avec une légère correction à ta note... je ne devais pas répéter "Dim Rng1 as Range" la 2e fois que je déclare ma variable.


Je suis quand même assez néophyte dans le domaine. Ce que je sais, je le dois en bonne partie à ce forum.

Et merci pour l'astuce du F8 que j'avais déjà utilisé dans le passé, mais que j'avais oublié.

Merci aussi pour la note de se passer d'activer et sélectionner les lignes et les feuilles. J'avais essayé de le faire sans cela, mais il y avait quelque chose qui me bloquait à ce moment-là donc.

Je me permets donc 2 questions supplémentaires :
- Mes feuilles seront protégées naturellement. Est-ce qu'il est possible d'exécuter ce type de commande sans inclure une action pour désactiver la protection et la réactiver ensuite?
- Comme je suis du Québec, les expressions peuvent parfois porter à confusion. Quand tu dis : "*Par contre ton code n'est pas terrible du tout", est-ce que ça veut dire que ce n'est "pas très fort" ou c'est plus dans le sens de "pas mauvais"? J'apprécie la critique qui me permet de m'améliorer. :-D

Merci et salutations,
 

Phil69970

XLDnaute Barbatruc
Re

1)Pour la 1ere question :
- Mes feuilles seront protégées naturellement. Est-ce qu'il est possible d'exécuter ce type de commande sans inclure une action pour désactiver la protection et la réactiver ensuite?
Le principe général pour que le code fonctionne avec une protection

VB:
Sub Mon_Action()'1) On déprotege la feuille
Worksheets("MaFeuille").Unprotect "123" 'Nom et MDP à adapter

'2) On fait l'action
Blablabla mon action...

'3) On reprotege la feuille
Worksheets("MaFeuille").Protect "123"

End Sub

Autre solution possible cela permet au code de fonctionné MAIS l’utilisateur ne peut pas modifier la/les feuilles sans déverrouiller la/les feuilles, en clair la/les macros fonctionnent uniquement

VB:
Private Sub Workbook_Open()
Dim Ws As Worksheet
For Each Ws In Worksheets
    Ws.Protect Password:="123", UserInterFaceOnly:=True
Next wSheet
End Sub



2)Pour la 2eme question :
est-ce que ça veut dire que ce n'est "pas très fort" ou c'est plus dans le sens de "pas mauvais"?
Comme ton code est rempli de select activate etc je pense que l'on peut largement optimiser ton code
En clair et désolé mais c'est :
"pas très fort"

Exemple d'optimisation :
Ta macro "Masquer_sections" peut être remplacer par celle ci (Non testé)

VB:
' Afficher ou masquer les sections du devis selon la liste de l'onglet INFO PROJET
Sub Masquer_sections()
Application.ScreenUpdating = False
Dim i&
For i = 10 To 21
    If Sheets("Info projet").Range("A" & i).Value = "" Then
        If i > 18 Then
            Sheets("suivi budgétaire").Range("SECTION" & i - 9).EntireRow.Hidden = True
        Else
            Sheets("suivi budgétaire").Range("SECTION0" & i - 9).EntireRow.Hidden = True
        End If
        Sheets("rapp estimation").Range("RAP_ESTIM_SEC" & i - 9).EntireRow.Hidden = True
        Sheets("rapp soum").Range("RAP_SOUM_SEC" & i - 9).EntireRow.Hidden = True
    Else
        If i > 18 Then
            Sheets("suivi budgétaire").Range("SECTION" & i - 9).EntireRow.Hidden = False
        Else
            Sheets("suivi budgétaire").Range("SECTION0" & i - 9).EntireRow.Hidden = False
        End If
        Sheets("rapp estimation").Range("RAP_ESTIM_SEC" & i - 9).EntireRow.Hidden = False
        Sheets("rapp soum").Range("RAP_SOUM_SEC" & i - 9).EntireRow.Hidden = False
    End If
Next i

End Sub

@Phil69970
 
Dernière édition:

ShrekL

XLDnaute Junior
Re

1)Pour la 1ere question :

Le principe général pour que le code fonctionne avec une protection

VB:
Sub Mon_Action()'1) On déprotege la feuille
Worksheets("MaFeuille").Unprotect "123" 'Nom et MDP à adapter

'2) On fait l'action
Blablabla mon action...

'3) On reprotege la feuille
Worksheets("MaFeuille").Protect "123"

End Sub

Autre solution possible cela permet au code de fonctionné MAIS l’utilisateur ne peut pas modifier la/les feuilles sans déverrouiller la/les feuilles, en clair la/les macros fonctionnent uniquement

VB:
Private Sub Workbook_Open()
Dim Ws As Worksheet
For Each Ws In Worksheets
    Ws.Protect Password:="123", UserInterFaceOnly:=True
Next wSheet
End Sub



2)Pour la 2eme question :

Comme ton code est rempli de select activate etc je pense que l'on peut largement optimiser ton code
En clair et désolé mais c'est :


Exemple d'optimisation :
Ta macro "Masquer_sections" peut être remplacer par celle ci (Non testé)

VB:
' Afficher ou masquer les sections du devis selon la liste de l'onglet INFO PROJET
Sub Masquer_sections()
Application.ScreenUpdating = False
Dim i&
For i = 10 To 21
    If Sheets("Info projet").Range("A" & i).Value = "" Then
        If i > 18 Then
            Sheets("suivi budgétaire").Range("SECTION" & i - 9).EntireRow.Hidden = True
        Else
            Sheets("suivi budgétaire").Range("SECTION0" & i - 9).EntireRow.Hidden = True
        End If
        Sheets("rapp estimation").Range("RAP_ESTIM_SEC" & i - 9).EntireRow.Hidden = True
        Sheets("rapp soum").Range("RAP_SOUM_SEC" & i - 9).EntireRow.Hidden = True
    Else
        If i > 18 Then
            Sheets("suivi budgétaire").Range("SECTION" & i - 9).EntireRow.Hidden = False
        Else
            Sheets("suivi budgétaire").Range("SECTION0" & i - 9).EntireRow.Hidden = False
        End If
        Sheets("rapp estimation").Range("RAP_ESTIM_SEC" & i - 9).EntireRow.Hidden = False
        Sheets("rapp soum").Range("RAP_SOUM_SEC" & i - 9).EntireRow.Hidden = False
    End If
Next i

End Sub

@Phil69970
Merci Phil69970... Je vais essayer ça et optimiser un peu.
 

Discussions similaires

Réponses
2
Affichages
80

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 846
dernier inscrit
Silhabib