Une même macro pour plusieurs feuilles

  • Initiateur de la discussion Initiateur de la discussion Oscurio
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Oscurio

XLDnaute Nouveau
Bonjour à tous,

Voici mon objectif : j'ai un fichier client où j'aimerais obliger les commerciaux à remplir la colonne pilote chargé du contrat.
Pour cela j'ai repris une macro proposé par Job45 je crois

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim dercel As Range, plage As Range
Set dercel = Sheets("Feuil1").Range("A1:A65536").Find(What:="*", _
LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 'dernière cellule renseignée
If dercel Is Nothing Then Exit Sub
Set plage = Sheets("Feuil1").Range("C1:C" & dercel.Row) 'plage obligatoire du tableau
If Application.CountBlank(plage) Then
plage.SpecialCells(xlBlanks).Select 'sélection des cellules vides
MsgBox "Renseignez la (les) cellule(s) sélectionnée(s)", 48
Cancel = True
End If
End Sub

Le 1er problème est que j'aimerais appliquer cette macro à plusieurs feuilles (dans le fichier test, feuill 1 et 2) d'un même classeur et là ça coince... Je n'arrive pas à combiner...
Le 2ème est qu'à chaque fois que je veux quitter le classeur en étant sur la feuille 2, j'ai une erreur,puis débogage

je vous joins un fichier test.

Merci de votre aide
 

Pièces jointes

Dernière édition:
Re : Une même macro pour plusieurs feuilles

Bonjour Oscurio et bienvenu dans le forum, bonjour le forum,

peut-être comme ça (non testé) :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim dercel As Range, plage As Range, x As Byte
 
For x = 1 To 2 'boucle sur les deux premiers onglets
    With Sheets(x) 'prend l'onglet en compte
        Set dercel = .Range("A1:A65536").Find(What:="*", _
        LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 'dernière cellule renseignée
        If dercel Is Nothing Then GoTo suite
        Set plage = Sheets("Toutes affaires").Range("C1:C" & dercel.Row) 'plage obligatoire du tableau
        If Application.CountBlank(plage) Then
            Sheets("Toutes affaires").Activate
            plage.SpecialCells(xlBlanks).Select 'sélection des cellules vides
            MsgBox "Renseignez la (les) cellule(s) sélectionnée(s)", 48
            Cancel = True
            Exit Sub 'pas sûr que ce soit nécessaire
        End If
    End With 'fin de la prise en compte de l'onglet
suite:
Next x 'prochain onglet de la boucle
End Sub
 
Re : Une même macro pour plusieurs feuilles

Merci Robert, j'attendais pas un réponse aussi rapide.

Ta macro règle le 2ème problème, c-a-d, quand je suis sur la feuil2 et que je quitte, il me renvoie à la feuil1 non complétée, pour que je la complète.

Par contre, elle ne règle pas le 1er problème, à savoir, m'obligé à remplir la feuil2
 
Re : Une même macro pour plusieurs feuilles

Bonjour Oscurio, bonjour le forum,

Si tu avais mis un fichier plus compet (il n'y a même pas l'onglet "Toutes affaires") on pourrait mieux te renseigner car on pourait tester avant...
Normalement la boucle se fait sur les deux onglets...
 
Re : Une même macro pour plusieurs feuilles

Désolé pour le fichier simpliste, mais le problème est que le fichier client appartient à l'entreprise où je fais mon stage, et ils sont très très protecteurs.. ça se comprend.
N'est-ce pas suffisant deux feuilles pour constituer la macro ?

j'ai corrigé en remplaçant toutes affaires :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim dercel As Range, plage As Range, x As Byte
 
For x = 1 To 3 'boucle sur les deux premiers onglets
    With Sheets(x) 'prend l'onglet en compte
        Set dercel = .Range("A1:A65536").Find(What:="*", _
        LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 'dernière cellule renseignée
        If dercel Is Nothing Then GoTo suite
        Set plage = Sheets("Feuil1").Range("C1:C" & dercel.Row) 'plage obligatoire du tableau
        If Application.CountBlank(plage) Then
            Sheets("Feuil1").Activate
            plage.SpecialCells(xlBlanks).Select 'sélection des cellules vides
            MsgBox "Renseignez la (les) cellule(s) sélectionnée(s)", 48
            Cancel = True
            Exit Sub 'pas sûr que ce soit nécessaire
        End If
    End With 'fin de la prise en compte de l'onglet
suite:
Next x 'prochain onglet de la boucle
End Sub

Par contre ça veut dire quoi quand tu parles de boucles sur deux onglets ? Des formules dans feuil1 et feuil2 de la VBA ?
 
Re : Une même macro pour plusieurs feuilles

Bonjour Oscurio, bonjour le forum,

Il m'est difficile de t'aider d'avantage car je ne comprends pas ce que veut ta macro sans fichier... Toutefois, je pense que tu ne devrais pas boucler sur le premier onglet puisque visiblement c'est l'onglet de référence. Le code devrait être For x = 2 To 3.
La boucle répète la procédure dans chaque onglet (en VBA). Pour que tu comprennes mieux, va dans le code VBA (Alt + F8) place le curseur au début de la macro et utilise la touche F8 pour exécuter le code pas à pas. Tu peux alterner entre le classeur et VBE et voir la progression de la macro...
 
Re : Une même macro pour plusieurs feuilles

Bonjour robert, bonjour à tous.

Je vous joins le fichier test, pour que vous puissiez testez.
Et je ré-eplique : le but c'est qu'une cellule de la colonne "pilotes en charge" ne soit jamais vide si la cellule correspondante dans la colonne "contrat" est remplie...
et ceci pour les 3 feuilles


Merci de votre aide
 

Pièces jointes

Re : Une même macro pour plusieurs feuilles

Bonjour Oscurio, bonjour le forum,

C'est enfin plus clair pour moi, car je pensais que le premier onglet définissait une plage de référence.
Comme quoi quand on veut, on peut... Essaie comme ça :

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim dercel As Range, plage As Range, x As Byte
 
For x = 1 To 3 'boucle sur les trois premiers onglets
    With Sheets(x) 'prend l'onglet en compte
        Set dercel = .Range("A1:A65536").Find(What:="*", _
        LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 'dernière cellule renseignée
        If dercel Is Nothing Then GoTo suite
        Set plage = Sheets(x).Range("C1:C" & dercel.Row) 'plage obligatoire du tableau
        Sheets(x).Select
        plage.Select
        If Application.CountBlank(plage) Then
            plage.SpecialCells(xlBlanks).Select 'sélection des cellules vides
            MsgBox "Renseignez la (les) cellule(s) sélectionnée(s)", 48
            Cancel = True
            Exit Sub 'pas sûr que ce soit nécessaire
        End If
    End With 'fin de la prise en compte de l'onglet
suite:
Next x 'prochain onglet de la boucle
End Sub
 
Re : Une même macro pour plusieurs feuilles

Bonjour à tous


Une autre façon de procéder

Code:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Dim p As Range
Set p = Columns(1).SpecialCells(xlCellTypeConstants, 23)
If Not Application.CountA(p) = Application.CountA(p.Offset(, 1)) Then
MsgBox "Renseignez la (les) cellule(s) sélectionnée(s)", 48
p.Offset(, 1).SpecialCells(4).Select
End If
End Sub
 
Re : Une même macro pour plusieurs feuilles

Merci robert, ça marche parfaitement !

Staple1600, merci pour la réponse, mais le problème de ta macro, c'est qu'elle demande à renseigner toutes les colonnes, or, je ne veux l'obligation sur une seule (pilote en charge)

j'aurais une dernière question, quelle modification apportée pour que cette macro marche par exemple sur l'onglet 1 et 3 au lieu de 1,2 et 3 ?
 
Re : Une même macro pour plusieurs feuilles

Bonjour le fil, bonjour le forum,

Essaie comme ça :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim dercel As Range, plage As Range, x As Byte
 
For x = 1 To 3 'boucle sur les trois premiers onglets
    Select Case x
        Case 1, 3
            With Sheets(x) 'prend l'onglet en compte
                Set dercel = .Range("A1:A65536").Find(What:="*", _
                LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 'dernière cellule renseignée
                If dercel Is Nothing Then GoTo suite
                Set plage = Sheets(x).Range("C1:C" & dercel.Row) 'plage obligatoire du tableau
                Sheets(x).Select
                plage.Select
                If Application.CountBlank(plage) Then
                    plage.SpecialCells(xlBlanks).Select 'sélection des cellules vides
                    MsgBox "Renseignez la (les) cellule(s) sélectionnée(s)", 48
                    Cancel = True
                    Exit Sub 'pas sûr que ce soit nécessaire
                End If
            End With 'fin de la prise en compte de l'onglet
    End Select
suite:
Next x 'prochain onglet de la boucle
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
316
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
3
Affichages
835
Retour