Exporter Feuille visible avec onglet couleur BLEU
Bonjour à tous,
J'ai actuellement un code VBA me permettant d'exporter dans un nouveau classeur xls certaines feuilles.
Je souhaite rajouter la possibilité de pouvoir exporter toutes les Feuilles Visibles dont la couleur d'onglet est BLEU (la couleur BLEU est un exemple), pouvez vous m'aider ? voici le code initial
Sub enregistrer_sous()
On Error GoTo FinEnregistrer
Application.EnableEvents = False
' On vérifie qu'une case au moins est cochée
If Range("sommefeuilles") > 0 Then
CeClasseur = ActiveWorkbook.Name
NomNouvClasseur = Range("titreclasseur")
Set NouvClasseur = Workbooks.Add
NouvClasseur.SaveAs Filename:=ThisWorkbook.Path & "\" & NomNouvClasseur
Workbooks(CeClasseur).Activate
If Feuil27.Range("lot_four") = True Then _
Feuil15.Copy after:=Workbooks(2).Sheets(Workbooks(2).Sheets.Count)
If Feuil27.Range("lot_cuisson") = True Then _
Feuil2.Copy after:=Workbooks(2).Sheets(Workbooks(2).Sheets.Count)
If couleur d'onglet = BLEU alors
copier toutes les feuilles du classeur
Else
MsgBox "Vous n'avez coché aucune feuille"
End If
Application.DisplayAlerts = False
For n = 1 To 3
Sheets("Feuil" & n).Delete
Next
Application.DisplayAlerts = True
FinEnregistrer:
Application.EnableEvents = True
End Sub
précision,
je souhaite uniquement copier les feuilles visible dont la couleur de l'onglet est BLEU.
Salut Babouze,
J’ai enregistré une macro avec l’enregistreur afin de voir quel code était généré si on colorie l’onglet avec une « Couleur du thème ». Ca a donné la macro 1. Puis j’ai essayé avec une « Couleur standard » et ça a donné la macro 2.
Ensuite j’ai repris le code de la macro 2 afin de créé le code « aa » et ça marche.
Est-ce que ça te permets d’avancer ??
Sub Macro1()
Sheets("Feuil1").Select
With ActiveWorkbook.Sheets("Feuil1").Tab
.ThemeColor = xlThemeColorAccent6
.TintAndShade = 0.599993896298105
End With
Range("D36").Select
End SubSub Macro2()
Sheets("Feuil2").Select
With ActiveWorkbook.Sheets("Feuil2").Tab
.Color = 15773696
.TintAndShade = 0
End With
End Sub Sub aa()
Dim i As Integer
For i = 1 To Sheets.Count
If Sheets(i).Tab.Color = 15773696 And Sheets(i).Visible = True Then MsgBox (Sheets(i).Name)
Next
End SubNB : Je ne peux pas savoir quel bleu tu as choisi
Cordialement.
en fait, quand je l'integre dans mon code complet (voir ci dessous) ça ne marche pas completement,
en fait mon code doit faire 2 copie :
- une copie en fonction de la valeur VRAI d'une cellule relié à une Feuille précise (code vert)
- une copie multiple en fonction de la couleur + visibilité de plusieurs feuilles (code rouge)
selon que je place le code vert ou rouge en premier, seul le premier code s'effectue mais pas l'autre, ma copie est incomplète,
De plus lors de mes essai, il y avait un message d'erreur "erreur de compilation Next sans For" ???
Pouvez vous m'aider ?
Sub enregistrer_sous()
Dim i As Integer
On Error GoTo FinEnregistrer
Application.EnableEvents = False
' On vérifie qu'une case au moins est cochée
If Range("sommefeuilles") > 0 Then
CeClasseur = ActiveWorkbook.Name
NomNouvClasseur = Range("titreclasseur")
Set NouvClasseur = Workbooks.Add
NouvClasseur.SaveAs Filename:=ThisWorkbook.Path & "\" & NomNouvClasseur
Workbooks(CeClasseur).Activate
If Feuil27.Range("compte_rendu") = True Then _
Feuil19.Copy after:=Workbooks(2).Sheets(Workbooks(2).Sheets.Count)
If Feuil27.Range("reception_materiel") = True Then _
Feuil30.Copy after:=Workbooks(2).Sheets(Workbooks(2).Sheets.Count)
If Feuil27.Range("lot_rénovation") = True Then _
Feuil48.Copy after:=Workbooks(2).Sheets(Workbooks(2).Sheets.Count)
For i = 1 To Sheets.Count
If Sheets(i).Tab.Color = 10498160 And Sheets(i).Visible = True Then Sheets(i).Copy after:=Workbooks(2).Sheets(Workbooks(2).Sheets.Count)
Next
Else
MsgBox "Vous n'avez coché aucune feuille"
End If
Application.DisplayAlerts = False
For n = 1 To 3
Sheets("Feuil" & n).Delete
Next
Application.DisplayAlerts = True
FinEnregistrer:
Application.EnableEvents = True
End Sub
Salut,
Tout d'abord - afin de respecter la charte du Forum - voici une petite réserve de "bonjour" et de "merci pour ton aide" :
bonjour, bonjour, bonjour, bonjour, bonjour, bonjour, bonjour, bonjour, bonjour, bonjour
merci pour ton aide, merci pour ton aide, merci pour ton aide, merci pour ton aide, merci pour ton aide, merci pour ton aide, merci pour ton aide.
Sans avoir ton fichier à disposition, il est difficile de t'aider mieux. Je veux bien créer un fichier qui peut ressembler au tien - comme je l'ai fait pour ma première réponse - mais le travail qui m'incombe en plus pour le réaliser plus les risques qu'il ne ressemble pas exactement au tien me découragent.
Alors merci d'avance de placer ton fichier sur le fil.
Cordialement.
ok,
j'ai mis le fichier en PJ,
il comporte 6 Feuilles
1 Feuille enregistrer qui permet de choisir les Feuilles à exporter (1 seule dans l'exemple)
1 Feuille TELECOPIE reunion de chantier qui est une Feuille à exporter via case à cocher
1 Feuille 777 visible avec la mauvaise couleur d'onglet
1 Feuille 778 visible avec la bonne couleur d'onglet
1 Feuille 779 masqué avec la bonne couleur d'onglet
1 Feuille 780 masqué avec la mauvaise couleur d'onglet
Le but est de copier les feuilles dont la case à cocher est active + les onglets des feuilles visibles dont la couleur correspond.
Lors de mes essais, constatation :
lorsque le code couleur est en dessous du code case à cocher, seulement la case à cocher est copié
lorsque le code couleur est dessus du code case à cocher, seulement la Feuille 778 (meme si 779 visible) est copié, mais manque case à cocher + suppression des FEUIL 1,2,3 du classeur cible
Bref, j'ai l'impression que la boucle ne s'effectue pas ...
J'espere t'avoir fourni suffisament d'elements.
Cordialement.
Si toutefois vous avez un autre code VBA qui fonctionne, je ne suis pas attaché à celui là.
Bonjour
Un essai
A voir dans le code la modification pour Excel 2003
je teste ...
effectivement, j'ai du remettre mon code couleur d'origine pour que cela fonctionne,
Y a t'il des codes couleurs "communs" entre xls 2003 et 2007 voire 2010 ?
Je crois que je vais etre obligé de trouver un commun pour que cela fonctionne quel que soit la version d'excel !
j'ai modifié ton code pour pouvoir "cocher plusieurs" Feuilles, mais j'ai dut mal m'y prendre car seulement une Feuille sur les "x" apparait.
Serait-ce à cause d'un ecrasement d'une feuille sur l'autre ou autre chose ?
deuxième question, si dans le même style, je souhaite cocher une case pour déclencher la partie copy onglet coloré, comment dois-je mis prendre ? en sachant que le code serait de la forme : If Feuil27.Range("descriptifs") = True Then "déclencher copy onglet visible coloré"
Sub enregistrer_sous()
Dim LesFeuilles()
Dim I As Integer, Indice As Integer
Dim NomNouvClasseur As String
On Error GoTo FinEnregistrer
Application.EnableEvents = False
' On vérifie qu'une case au moins est cochée
If Range("sommefeuilles") > 0 Then
Application.ScreenUpdating = False
ReDim Preserve LesFeuilles(Indice)
If Feuil27.Range("reunion_chantier") = True Then
LesFeuilles(Indice) = Feuil20.Name
End If
If Feuil27.Range("presentation_cctp") = True Then
LesFeuilles(Indice) = Feuil8.Name
End If
If Feuil27.Range("recap_matos") = True Then
LesFeuilles(Indice) = Feuil26.Name
End If
If Feuil27.Range("convocation_ris") = True Then
LesFeuilles(Indice) = Feuil17.Name
End If
If Feuil27.Range("reservation") = True Then
LesFeuilles(Indice) = Feuil1.Name
End If
If Feuil27.Range("transmis") = True Then
LesFeuilles(Indice) = Feuil12.Name
End If
If Feuil27.Range("compte_rendu") = True Then
LesFeuilles(Indice) = Feuil19.Name
End If
If Feuil27.Range("reception_materiel") = True Then
LesFeuilles(Indice) = Feuil30.Name
End If
For I = 1 To Sheets.Count
If Sheets(I).Tab.Color = 10498160 And Sheets(I).Visible = True Then
Indice = Indice + 1
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Sheets(I).Name
End If
Next I
NomNouvClasseur = Range("titreclasseur")
Application.DisplayAlerts = False ' Evite message sur les liens
Sheets(LesFeuilles()).Copy
Application.DisplayAlerts = True ' Remet en service les messages
With ActiveWorkbook
.SaveAs Filename:=ThisWorkbook.Path & "\" & NomNouvClasseur
.Close
End With
Else
MsgBox "Vous n'avez coché aucune feuille"
End If
MsgBox "terminé"
FinEnregistrer:
Application.EnableEvents = True
End Sub
Bonsoir
babouze64 a écrit :Serait-ce à cause d'un ecrasement d'une feuille sur l'autre
Oui si l'indice n'est pas modifié
Sans ton fichier réel (structure) pas évident de simplifier le code (pas sur que l'on y arrive)
Quand tu places du code utilises les balises Code (au dessus à droite de la fenêtre d'édition), la lecture de celui-ci en sera facilitée
Pour la 2ème question tu prépares un fichier dans lequel tu expliques ce que tu veux faire
Option Explicit
Sub enregistrer_sous()
Dim LesFeuilles()
Dim I As Integer, Indice As Integer
Dim NomNouvClasseur As String
On Error GoTo FinEnregistrer
Application.EnableEvents = False
' On vérifie qu'une case au moins est cochée
If Range("sommefeuilles") > 0 Then
Application.ScreenUpdating = False
If Feuil27.Range("reunion_chantier") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil20.Name
Indice = Indice + 1
End If
If Feuil27.Range("presentation_cctp") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil8.Name
Indice = Indice + 1
End If
If Feuil27.Range("recap_matos") = True Then
LesFeuilles(Indice) = Feuil26.Name
Indice = Indice + 1
End If
If Feuil27.Range("convocation_ris") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil17.Name
Indice = Indice + 1
End If
If Feuil27.Range("reservation") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil1.Name
Indice = Indice + 1
End If
If Feuil27.Range("transmis") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil12.Name
Indice = Indice + 1
End If
If Feuil27.Range("compte_rendu") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil19.Name
Indice = Indice + 1
End If
If Feuil27.Range("reception_materiel") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil30.Name
Indice = Indice + 1
End If
For I = 1 To Sheets.Count
If Sheets(I).Tab.Color = 10498160 And Sheets(I).Visible = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Sheets(I).Name
Indice = Indice + 1
End If
Next I
NomNouvClasseur = Range("titreclasseur")
Application.DisplayAlerts = False ' Evite message sur les liens
Sheets(LesFeuilles()).Copy
Application.DisplayAlerts = True ' Remet en service les messages
With ActiveWorkbook
.SaveAs Filename:=ThisWorkbook.Path & "\" & NomNouvClasseur
.Close
End With
Else
MsgBox "Vous n'avez coché aucune feuille"
End If
MsgBox "terminé"
FinEnregistrer:
Application.EnableEvents = True
End SubMerci encore pour ton boulot, rapide et efficace.
Ton code fonctionne à merveille et pour la simplification, pas besoin, ça fonctionne, ça ne ralenti pas, c'est génial.
Pour mon souhait N°2, ça fonctionne, le code est repéré entre commentaires ci-dessous, j'ai réussi à m'en sortir seul (pour une fois !!)
A+
Sub enregistrer_sous()
Dim LesFeuilles()
Dim I As Integer, Indice As Integer
Dim NomNouvClasseur As String
On Error GoTo FinEnregistrer
Application.EnableEvents = False
If Range("sommefeuilles") > 0 Then
Application.ScreenUpdating = False
If Feuil27.Range("reunion_chantier") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil20.Name
Indice = Indice + 1
End If
If Feuil27.Range("presentation_cctp") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil8.Name
Indice = Indice + 1
End If
If Feuil27.Range("recapitulatif") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil26.Name
Indice = Indice + 1
End If
If Feuil27.Range("convocation_ris") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil17.Name
Indice = Indice + 1
End If
If Feuil27.Range("reservation") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil1.Name
Indice = Indice + 1
End If
If Feuil27.Range("transmis") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil12.Name
Indice = Indice + 1
End If
If Feuil27.Range("compte_rendu") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil19.Name
Indice = Indice + 1
End If
If Feuil27.Range("reception_materiel") = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Feuil30.Name
Indice = Indice + 1
End If
'code du souhait N°2
If Feuil27.Range("descriptifs") = True Then
For I = 1 To Sheets.Count
If Sheets(I).Tab.Color = 10498160 And Sheets(I).Visible = True Then
ReDim Preserve LesFeuilles(Indice)
LesFeuilles(Indice) = Sheets(I).Name
Indice = Indice + 1
End If
Next I
End If
'fin code souhait N°2
NomNouvClasseur = Range("titreclasseur")
Application.DisplayAlerts = False ' Evite message sur les liens
Sheets(LesFeuilles()).Copy
Application.DisplayAlerts = True ' Remet en service les messages
With ActiveWorkbook
.SaveAs Filename:=ThisWorkbook.Path & "\" & NomNouvClasseur
.Close
End With
Else
MsgBox "Vous n'avez coché aucune feuille"
End If
MsgBox "terminé"
FinEnregistrer:
Application.EnableEvents = True
End Subje m'en suis rendu compte en éditant mon message précedent.
A+
BonjourR à tous.
Ma question n'est pas en rapport direct avec le post d'origine.
J'ai copié la macro 2 de " Yvouille" qui m'intéresse.
Sub Macro2() ' Change_couleur_2_L_onglet
Sheets("Feuil2").Select
With ActiveWorkbook.Sheets("Feuil2").Tab
.Color = 15773696
.TintAndShade = 0
End With
End Sub
Ma question est la suivante :
est-il possible que lorsque l'on rajoute un onglet, le nouvel onglet change de couleur, pour ne jamais avoir 2 onglet de même couleur qui se suivent.
B.Ap.M à tous Roland
