Révéler les lignes et colonnes cachées

 

Cette macro révèle les lignes et colonnes cachées dans toutes les feuilles d’un classeur.

L’utilisateur doit indiquer le classeur à traiter.

Sub MontrerTout()
'------------------------------------------------------------------------------------------------
'Procédure pour révéler toutes les lignes et colonnes cachées dans toutes les feuilles d'un classeur
'-l'utilisateur doit choisir le classeur à traiter
'-En fin de traitement le classeur traité reste ouvert
'Auteur : Excellons.org
'Date : juin 2019
'------------------------------------------------------------------------------------------------
Const cFilter = "Classeur EXCEL(*.xls*), *.xls*"
    
    Dim oWB As Workbook
    Dim oSheet As Worksheet
    Dim sWBName As Variant
    Dim sExtension As String
    Dim sDecoupe() As String
    
    'On demande à l'utilisateur d'indiquer le nom du classeur à traiter
    sWBName = Application.GetOpenFilename(cFilter, 1, "Choisissez le classeur à traiter", , False)
      
    'On s'assure que l'utilisateur n'a pas quitté la boite de dialogue sans indiquer de fichier. Sinon on met fin à l'opération.
    If sWBName = False Then
        MsgBox "Aucun classeur indiqué !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On s'assure que l'utilisateur a indiqué un classeur EXCEL
    sDecoupe() = Split(sWBName, ".") 'On découpe le nom en 2 pour récupérer son extension
    'On s'assure que le fichier choisi possède une extension de classeur EXCEL. Sinon on met fin à l'opération.
    If Left(sDecoupe(1), 3) <> "xls" Then
        MsgBox "Le fichier indiqué ne semble pas être un classeur EXCEL !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
        
    'On active la séquence de gestion d'erreurs
    On Error GoTo Gestion_Err
    
    'On affecte l'objet local classeur
    Set oWB = Application.Workbooks.Open(sWBName)
    
    'On boucle sur toutes les feuilles du classeur
    For Each oSheet In oWB.Worksheets
        'On révèle toutes les lignes de la feuille
        oSheet.Rows.EntireRow.Hidden = False
        'On rend visible le contenu de toutes les lignes
        oSheet.Rows.EntireRow.AutoFit
        'On révèle toutes les colonnes de la feuille
        oSheet.Columns.EntireColumn.Hidden = False
        'On rend visible le contenu de toutes les colonnes
        oSheet.Columns.EntireColumn.AutoFit
   Next
    
    'Séquence de fin de traitement
    MsgBox "Les lignes et colonnes du classeur '" & sWBName & "' ont toutes été rélévées.", vbExclamation, "FIN D'OPERATION"
    
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    
    'On fait le ménage
    Set oSheet = Nothing
    Set oWB = Nothing
    Exit Sub
'Séquence de traitement des erreurs
Gestion_Err:
    Select Case Err
        Case Else
            MsgBox "La révélation de toutes les lignes et colonnes du classeur '" & sWBName & "' a rencontré l'erreur suivante :" & vbCrLf _
                    & Err & "-" & Err.Description, vbCritical, "IMPOSSIBLE DE POURSUIVRE LE TRAITEMENT"
    End Select
    
    'On fait le ménage
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    Set oSheet = Nothing
    Set oWB = Nothing
End Sub

Protéger/déprotéger les feuilles

Toutes feuilles d’un classeur sont protégées avec la première macro en leur affectant un mot de passe donné.

La seconde macro déprotège toutes les feuilles d’un classeur précédemment protégées par un mot de passe donné.

Les mots de passe peuvent être modifiés.

Macro de protection des feuilles d'un classeur

Sub ProtegeFeuilles()
'------------------------------------------------------------------------------------------------
'Procédure de protection des feuilles d'un classeur avec le mot de passe générique cPWD
'-l'utilisateur doit choisir le classeur à protéger
'-Le classeur est fermé a l'issue du traitement
'Auteur : Excellons.org
'Date : juin 2019
'------------------------------------------------------------------------------------------------
Const cPWD = "0987654"      'Password à adapter
Const cFilter = "Classeur EXCEL(*.xls*), *.xls*"
    
    Dim oWB As Workbook
    Dim oSheet As Worksheet
    Dim sWBName As Variant
    Dim sExtension As String
    Dim sDecoupe() As String
    
    'On demande à l'utilisateur d'indiquer le nom du classeur à protéger
    sWBName = Application.GetOpenFilename(cFilter, 1, "Choisissez le classeur à protéger", , False)
      
    'On s'assure que l'utilisateur n'a pas quitté la boite de dialogue sans indiquer de fichier. Sinon on met fin à l'opération.
    If sWBName = False Then
        MsgBox "Aucun classeur indiqué !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On s'assure que l'utilisateur a indiqué un classeur EXCEL
    sDecoupe() = Split(sWBName, ".") 'On découpe le nom en 2 pour récupérer son extension
    'On s'assure que le fichier choisi possède une extension de classeur EXCEL. Sinon on met fin à l'opération.
    If Left(sDecoupe(1), 3) <> "xls" Then
        MsgBox "Le fichier indiqué ne semble pas être un classeur EXCEL !" & vbCrLf & vbCrLf & "Opération impossible.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
        
    'On active la séquence de gestion d'erreurs
    On Error GoTo Gestion_Err
    
    'On affecte l'objet local classeur
    Set oWB = Application.Workbooks.Open(sWBName)
    
    'On boucle sur toutes les feuilles du classeur
    For Each oSheet In oWB.Worksheets
        'On protège la feuille avec le mot de passe
        oSheet.Protect cPWD
    Next
    
    'Séquence de fin de traitement
    oWB.Close True   'On ferme le classeur protégé
    MsgBox "Les feuilles du classeur '" & sWBName & "' sont protégées avec le mot de passe générique.", vbExclamation, "FIN D'OPERATION"
    
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    
    'On fait le ménage
    Set oSheet = Nothing
    Set oWB = Nothing
    Exit Sub
'Séquence de traitement des erreurs
Gestion_Err:
    Select Case Err
        Case Else
            MsgBox "L'opération de protection du classeur '" & sWBName & "' a rencontré l'erreur suivante :" & vbCrLf _
                    & Err & "-" & Err.Description, vbCritical, "IMPOSSIBLE DE PROTEGER LE CLASSEUR"
    End Select
    oWB.Close False
    'On fait le ménage
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    Set oSheet = Nothing
    Set oWB = Nothing
End Sub

Macro de déprotection des feuilles d'un classeur

Sub DeprotegeFeuilles()
'------------------------------------------------------------------------------------------------
'Procédure de déprotection des feuilles d'un classeur protégé avec le mot de passe générique
'-l'utilisateur doit choisir le classeur à déprotéger
'-Le classeur est fermé a l'issue du traitement
'Auteur : Excellons.org
'Date : juin 2019
'------------------------------------------------------------------------------------------------
Const cPWD = "0987654"      'Password à adapter
Const cFilter = "Classeur EXCEL(*.xls*), *.xls*"
    
    Dim oWB As Workbook
    Dim oSheet As Worksheet
    Dim sWBName As Variant
    Dim sExtension As String
    Dim sDecoupe() As String
    
    'On demande à l'utilisateur d'indiquer le nom du classeur à déprotéger
    sWBName = Application.GetOpenFilename(cFilter, 1, "Choisissez le classeur à déprotéger", , False)
      
    'On s'assure que l'utilisateur n'a pas quitté la boite de dialogue sans indiquer de fichier. Sinon on met fin à l'opération.
    If sWBName = False Then
        MsgBox "Aucun classeur indiqué !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On s'assure que l'utilisateur a indiqué un classeur EXCEL
    sDecoupe() = Split(sWBName, ".") 'On découpe le nom en 2 pour récupérer son extension
    'On s'assure que le fichier choisi possède une extension de classeur EXCEL. Sinon on met fin à l'opération.
    If Left(sDecoupe(1), 3) <> "xls" Then
        MsgBox "Le fichier indiqué ne semble pas être un classeur EXCEL !" & vbCrLf & vbCrLf & "Opération impossible.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
        
    'On active la séquence de gestion d'erreurs
    On Error GoTo Gestion_Err
    
    'On affecte l'objet local classeur
    Set oWB = Application.Workbooks.Open(sWBName)
    
    'On boucle sur toutes les feuilles du classeur
    For Each oSheet In oWB.Worksheets
         'On déprotège la feuille
        oSheet.Unprotect cPWD
    Next
    
    'Séquence de fin de traitement
    oWB.Close True   'On ferme le classeur
    MsgBox "Les feuilles du classeur '" & sWBName & "' sont déprotégées du mot de passe générique.", vbExclamation, "FIN D'OPERATION"
    
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    
    'On fait le ménage
    Set oSheet = Nothing
    Set oWB = Nothing
    Exit Sub
'Séquence de traitement des erreurs
Gestion_Err:
    Select Case Err
        Case Else
            MsgBox "L'opération de déprotection du classeur '" & sWBName & "' a rencontré l'erreur suivante :" & vbCrLf _
                    & Err & "-" & Err.Description, vbCritical, "IMPOSSIBLE DE DEPROTEGER LE CLASSEUR"
    End Select
    
    'On fait le ménage
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    Set oSheet = Nothing
    Set oWB = Nothing
End Sub

Q

Coloriser les cellules suivant leur contenu

La colorisation du texte des cellules suivant leur contenu peut améliorer la lisibilité des tableurs comportant un grand nombre de cellules.

La macro proposée réalise la colorisation de toutes les cellules d’un tableur suivant la charte suivante :

  • le texte des cellules contenant des calculs EXCEL est colorisé en vert
  • le texte des cellules contenant une référence à une autre cellule de la même feuille est colorisé en bleu marine
  • le texte des cellules contenant une référence à une autre cellule dans une autre feuille est colorisé en violet
  • Dans tous ces cas, le corps du texte est mis en gras
  • Le texte de la cellule est colorisé en rouge dans le cas où son contenu est #REF!

Les couleurs peuvent être modifiées pour correspondre à une autre charte de couleurs.

L’utilisateur indique le tableur à coloriser, la macro s’occupe du reste…

 

Sub ColorisationDesCellules()
'------------------------------------------------------------------------------------------------
'Procédure de colorisation des cellules d'un classeur contenant des formules
'-l'utilisateur doit choisir le classeur à traiter
'-Le traitement met évidence par la couleur de certaines cellules du classeur suivant la charte suivante :
'- le texte des cellules contenant des calculs EXCEL est colorisé en vert
'- le texte des cellules contenant une référence à une autre cellule de la même feuille est colorisé en bleu marine
'- le texte des cellules contenant une référence à une autre cellule dans une autre feuille est colorisé en violet
'- Dans tous ces cas, le corps du texte est mis en gras
'- Le texte de la cellule est colorisé en rouge dans le cas où son contenu est #REF!
'Le classeur reste ouvert après le traitement
'Vous pouvez adapter les couleurs à votre propre charte en changeant les valeurs des constantes déclarées en tête:
'  cCouleurCalcul | cCouleurReferenceInterne | cCouleurReferenceExterne | cCouleurErreur.
'Auteur : Excellons.org
'Date : juin 2019
'------------------------------------------------------------------------------------------------
Const cCouleurCalcul = 3506772              'Vert  : A adapter
Const cCouleurReferenceInterne = 9851952    'Bleu  : A adapter
Const cCouleurReferenceExterne = 10498160   'Violet: A adapter
Const cCouleurErreur = vbRed                'Rouge : A adapter
Const cFilter = "Classeur EXCEL(*.xls*), *.xls*"

    Dim oWB As Workbook
    Dim oSheet As Worksheet
    Dim oRangeToScan As Range
    Dim oCell As Range
    Dim sWBName As Variant
    Dim sExtension As String
    Dim sDecoupe() As String
    Dim lErr As Long
    Dim i As Integer
    
    'On demande à l'utilisateur d'indiquer le nom du classeur à traiter
    sWBName = Application.GetOpenFilename(cFilter, 1, "Choisissez le classeur à traiter", , False)
      
    'On s'assure que l'utilisateur n'a pas quitté la boite de dialogue sans indiquer de fichier. Sinon on met fin à l'opération.
    If sWBName = False Then
        MsgBox "Aucun classeur indiqué !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On s'assure que l'utilisateur a indiqué un classeur EXCEL
    sDecoupe() = Split(sWBName, ".") 'On découpe le nom en 2 pour récupérer son extension
    'On s'assure que le fichier choisi possède une extension de classeur EXCEL. Sinon on met fin à l'opération.
    If Left(sDecoupe(1), 3) <> "xls" Then
        MsgBox "Le fichier indiqué ne semble pas être un classeur EXCEL !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
        
    'On active la séquence de gestion d'erreurs
    On Error GoTo Gestion_Err
    
    'On affecte l'objet local classeur
    Set oWB = Application.Workbooks.Open(sWBName)
   
    'On inspecte toutes les feuilles du classeur
    For Each oSheet In oWB.Worksheets
        'On s'assure que la feuille n'est pas protégée
        If Not oSheet.ProtectContents Then
            'On affecte la plage de cellules à inspecter -> seulement les cellules contenant une formule
            On Error Resume Next
            Set oRangeToScan = oSheet.Cells.SpecialCells(xlCellTypeFormulas)
            On Error GoTo Gestion_Err 'On rétablit la gestion des erreurs
            
            'On s'assure que la feuille possède des cellules avec formule
            If Not oRangeToScan Is Nothing Then
                'On inspecte les toutes cellules de la plage
                For Each oCell In oRangeToScan.Cells
                'On s'assure que la cellule ne contient pas d'erreur
                    If Not IsError(oCell.Value) Then
                        'On met en gras le corps du texte de la cellule
                        oCell.Font.Bold = True
                        On Error GoTo 0                     'On doit annuler la séquence de débranchement d'erreur
                        On Error Resume Next                'On poursuit le traitement même en cas d'erreur
                        Application.GoTo oCell.FormulaR1C1  'On tente d'atteindre la cellule référencée dans la formule
                        
                        'On s'assure du numéro de l'erreur générée par l'instruction précédente
                        Select Case Err.Number
                            Case Is = 0                     'La référence a été atteinte -> la cellule contient une référence à une cellule
                                'On teste pour savoir si la cellule contient une référence à une feuille
                                If InStr(1, oCell.Formula, "!") > 0 Then
                                    'Si oui, on colorise le texte avec la couleur affectée aux références externes
                                    oCell.Font.Color = cCouleurReferenceExterne
                                Else
                                    'Sinon on colorise le texte de la cellule avec la couleur affectée aux références internes
                                    oCell.Font.Color = cCouleurReferenceInterne
                                End If
                                On Error GoTo Gestion_Err   'On rétablit la gestion des erreurs
                            Case Is = 1004                  'La référence est incorrecte -> la cellule contient un calcul
                                'On colorise le texte de la cellule avec la couleur affectée aux calculs
                                oCell.Font.Color = cCouleurCalcul
                                Err.Clear
                                On Error GoTo Gestion_Err   'On rétablit la gestion des erreurs
                            Case Else
                                'Si une autre erreur est survenue, on se débranche vers la séquence de gestion des erreurs
                                lErr = Err.Number
                                On Error GoTo Gestion_Err 'On rétablit la gestion des erreurs
                                Err.Raise lErr            'On déclenche l'erreur
                        End Select
                    Else
                        oCell.Font.Color = cCouleurErreur
                    End If
                Next
            End If
            'on fait le ménage
            Set oRangeToScan = Nothing
        End If
    Next
    
    'Séquence de fin de traitement
    MsgBox "Les cellules du classeur :" & vbCrLf & "'" & sWBName & "'" & vbCrLf & "contenant des formules ont été colorisées avec succès.", vbInformation, "FIN D'OPERATION"

    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    
    'On fait le ménage
    Set oRangeToScan = Nothing
    Set oSheet = Nothing
    Set oWB = Nothing
    Exit Sub


'Séquence de traitement des erreurs
Gestion_Err:
    'On affiche l'erreur et on sort...
    MsgBox "La colorisation des cellules du classeur '" & sWBName & "' a rencontré l'erreur suivante :" & vbCrLf _
            & Err & "-" & Err.Description, vbCritical, "IMPOSSIBLE DE POURSUIVRE LE TRAITEMENT"
    
    'On fait le ménage
    On Error GoTo 0 'On annule le branchement vers de gestion d'erreur
    Set oRangeToScan = Nothing
    Set oSheet = Nothing
    Set oWB = Nothing
End Sub

Q

Reproduire les sauts de page

 

  • L’utilisateur indique le nom de la feuille ‘modèle’
  • L’utilisateur indique le nom de la feuille ‘cible’
  • La macro fait le reste…
Sub DuplicatePageBreaks()
'------------------------------------------------------------------------------------------------
'Macro de reproduction des sauts de page positionnés sur une feuille source
'-l'utilisateur indique le nom de la feuille source et de la feuille cible
'Auteur : Excellons.org
'Date : mai 2019
'------------------------------------------------------------------------------------------------
    Dim aSheetsNames As New Collection
    Dim oFromSheet As Worksheet, oToSheet As Worksheet
    Dim sFromSheetName As String, sToSheetName As String
    Dim i As Integer, iNb As Integer
    Dim oPB As HPageBreak
    Dim booOK As Boolean
    
    'On récupère les noms de feuilles du classeur dans une collection
    For Each oToSheet In ThisWorkbook.Worksheets
        aSheetsNames.Add oToSheet.Name
    Next
    
    'On vérifie qu'il existe plus d'une feuille dans le classeur, sinon on sort
    If aSheetsNames.Count = 1 Then
        MsgBox "Ce classeur ne contient qu'une seule feuille !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On demande à l'utilisateur d'indiquer la feuille source
    sFromSheetName = InputBox("Nom de la feuille source ?", "Feuille source des sauts de page", aSheetsNames.Item(1), 2000, 1000)
    'On vérifie que l'utilisateur a indiqué un nom de feuille valide, sinon sort
    booOK = False
    For i = 1 To aSheetsNames.Count
        If sFromSheetName = aSheetsNames.Item(i) Then
            booOK = True
        End If
    Next
    If Not booOK Then
        MsgBox "Nom de feuille source non indiqué ou invalide !" & vbCrLf & vbCrLf & "Opération impossible.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On référe la feuille source
    Set oFromSheet = ThisWorkbook.Worksheets(sFromSheetName)
    'On récupère le nombre de sauts de page
    iNb = oFromSheet.HPageBreaks.Count
    'S'il n'y a aucun saut de page, on sort
    If iNb = 0 Then
        MsgBox "La feuille source indiquée ne contient aucun saut de page !" & vbCrLf & vbCrLf & "Opération sans objet.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If

    'On demande à l'utilisateur d'indiquer la feuille cible
    sToSheetName = InputBox("Nom de la feuille cible ?", "Feuille cible sur laquelle reproduire les sauts de page", aSheetsNames.Item(2), 3000, 5000)
    'On vérifie que l'utilisateur a indiqué un nom de feuille valide, sinon sort
    booOK = False
    For i = 1 To aSheetsNames.Count
        If sToSheetName = aSheetsNames.Item(i) Then
            booOK = True
        End If
    Next
    If Not booOK Then
        MsgBox "Nom de la feuille cible non indiqué ou invalide !" & vbCrLf & vbCrLf & "Opération impossible.", vbCritical, "FIN D'OPERATION"
        Exit Sub
    End If
    
    'On réfère la feuille devant recevoir les sauts de page
    Set oToSheet = ThisWorkbook.Worksheets(sToSheetName)
    'On efface les sauts de page de la feuille cible
    oToSheet.ResetAllPageBreaks
    'On boucle sur le nombre de sauts de page
    For i = 1 To oFromSheet.HPageBreaks.Count
        'On réfère un saut de page
        Set oPB = oFromSheet.HPageBreaks(i)
        'On réplique ce saut de page dans la feuille destinataire
        oToSheet.HPageBreaks.Add oPB.Location
    Next
    MsgBox "Opération terminée avec succès !", vbExclamation, "FIN D'OPERATION"
    
    'On fait le ménage
    Set oPB = Nothing
    Set oFromSheet = Nothing
    Set oToSheet = Nothing
End Sub

Q

Mise en page 1/1

Pour ne plus à avoir à répéter les mêmes clics, une macro d’automatisation de la mise en page de l’impression de la feuille active avec les caractéristiques suivantes :

  • Format paysage
  • Marge étroite
  • Une seule page
  • Contenu centré horizontalement et verticalement 
Sub ImprimerFeuilleSurPage()
'----------------------------------------------------------------------------------
'Macro d'automatisation de l'impression de la feuille active sur une seule page :
'-Format portrait
'-Marge étroite
'-Une seule page
'-Contenu centré horizontalement et verticalement
'Auteur : Excellons.org
'Date : mai 2015
'----------------------------------------------------------------------------------
    With ActiveSheet.PageSetup              'On pointe sur la mise en page de la feuille active
        'On définit les marges étroites
        .LeftMargin = Application.InchesToPoints(0.236220472440945)
        .RightMargin = Application.InchesToPoints(0.236220472440945)
        .TopMargin = Application.InchesToPoints(0.748031496062992)
        .BottomMargin = Application.InchesToPoints(0.748031496062992)
        .HeaderMargin = Application.InchesToPoints(0.31496062992126)
        .FooterMargin = Application.InchesToPoints(0.31496062992126)
        'On positionne la feuille dans la page
        .CenterHorizontally = True          'On centre horizontalement
        .CenterVertically = True            'On centre verticalement
        .Orientation = xlLandscape          'On passe au format portrait
        'On spécifie l'impression sur une page unique
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
End Sub

Q