29 secondes pour XLérer : filtrer sur tout type de format

Ctrl+H, puis for­mat, choix du for­mat, puis for­mat de rem­place­ment, rem­plis­sage, couleur, il ne reste plus qu’à filtrer.

Ajouter un menu contextuel (clic droit) à plusieurs niveaux de sous-menus

Voici une ques­tion qui m’a pas mal tra­vail­lée et qui demande une com­préhen­sion fine de la dif­férence entre mso­Con­trol­But­ton et mso­Con­trolPop­up. Une fois qu’on a com­pris, c’est “rel­a­tive­ment” sim­ple. mso­Con­trol­But­ton fait référence à un bou­ton, alors que mso­Con­trolPop­up fait référence à un pop-up qui va servir de par­ent du sous-menu

Vous pou­vez télécharg­er le fichi­er directe­ment ici.

Expli­ca­tion en vidéo:

Notez que l’on peut utilis­er le with et end with, ou alors faire référence directe­ment au nom du sous menu. Je pense que c’est une ques­tion de préférence per­son­nelle. With et end with est en principe plus rapi­de à exé­cuter, mais dans ce type de sit­u­a­tion, je ne pense pas que la dif­férence soit perceptible.

Emplace­ment du code

Voici le code avec des exem­ples de sous-menu :

Dans This­work­book, on peut met­tre ce code : 

Private Sub Workbook_Activate()
    Call AddToCellMenu
End Sub

Private Sub Workbook_Deactivate()
    Call DeleteFromCellMenu
End Sub

Dans un nou­veau mod­ule, on met­tra ce code : 

Option Explicit

Sub AddToCellMenu()
    Dim ContextMenu As CommandBar
    Dim MyMenu As CommandBarControl
    Dim MySubMenu_Niv1 As CommandBarControl
    Dim MySubMenu_Niv2 As CommandBarControl

    'On supprime le menu s'il existe
    Call DeleteFromCellMenu

    'ContextMenu est lié au clic droit sur une cellule
    Set ContextMenu = Application.CommandBars("Cell")

    'TRES IMPORTANT, il faut utiliser un msoControlPopup pour le sous menu, sinon ca ne fonctionnera pas.
    Set MyMenu = ContextMenu.Controls.Add(Type:=msoControlPopup, before:=1)
    With MyMenu
        .Caption = "Menu-Cartes"
        .Tag = "My_Cell_Control_Tag" 'on utilise ce tag par la suite pour supprimer le menu

        'TRES IMPORTANT, il faut utiliser un msoControlPopup pour le sous menu, sinon ca ne fonctionnera pas.
        Set MySubMenu_Niv1 = .Controls.Add(Type:=msoControlPopup)
        MySubMenu_Niv1.Caption = "SousMenu1"
       
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "NomMacro1"
            .FaceId = 481
            .Caption = "Bouton1"
        End With
    End With
    
    'creation du sous menu 2, a l'interieur du sous menu 1
    Set MySubMenu_Niv2 = MySubMenu_Niv1.Controls.Add(msoControlPopup)
    MySubMenu_Niv2.Caption = "SousMenu2"
    
    With MySubMenu_Niv1
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "NomMacro2"
            .FaceId = 482
            .Caption = "Bouton2"
        End With
    End With
        
    'creation du sous menu 3, a l'interieur du sous menu2
    With MySubMenu_Niv2
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "NomMacro3"
            .FaceId = 483
            .Caption = "Bouton3"
        End With
    End With
    
    'Add seperator to the Cell menu
    ContextMenu.Controls(2).BeginGroup = True
End Sub
Sub DeleteFromCellMenu()
    Dim ContextMenu As CommandBar
    Dim ctrl As CommandBarControl

    'ContextMenu est lié au clic droit sur une cellule
    Set ContextMenu = Application.CommandBars("Cell")

    'Delete custom controls with the Tag : My_Cell_Control_Tag
    For Each ctrl In ContextMenu.Controls
        If ctrl.Tag = "My_Cell_Control_Tag" Then
            ctrl.Delete
        End If
    Next ctrl
End Sub
Sub NomMacro1()
    MsgBox "Coeur", vbOKOnly
End Sub
Sub NomMacro2()
    MsgBox "Carreaux", vbOKOnly
End Sub
Sub NomMacro3()
    MsgBox "Trèfle", vbOKOnly
End Sub

Sources :

https://www.rondebruin.nl/win/s6/win001.htm

https://docs.microsoft.com/en-us/office/vba/api/office.commandbarpopup

29 secondes pour XLérer : comment vérifier qu’une liste de clefs est dans le bon ordre et ne saute pas d’éléments ?

La for­mule ultra simple

=SEQUENCE(4)=A2:A5

La for­mule “sim­ple” :

=LET(p;A2:A5;SEQUENCE(LIGNES℗)=p)

La for­mule “com­plexe” :

=LET(p;A2:A5;
         SI(SOMME((SEQUENCE(LIGNES℗)=p)*1)=LIGNES℗;
              “Aucun prob­lème”;
              “Erreur(s) : ” &
                   JOINDRE.TEXTE(“ ; “;VRAI;“Ligne ” & FILTRE(
                               LIGNE℗;
                               NON(SEQUENCE(LIGNES℗)=p)*LIGNE℗<>0))
             )
         )
Voili, voilou, toute prête pour Lamb­da si vous êtes avec insider 🙂

A bien­tôt
#Sequence #excel