Nouvelles fonctions (encore en béta)

Bonjour à tous,

Microsoft vient de mettre à disposition d'une partie des utilisateurs béta les fonctions suivantes (en Anglais) :

TEXTBEFORE, TEXTAFTER, TEXTSPLIT, VSTACK, HSTACK, TOROW, TOCOL, WRAPROWS, WRAPCOLS, TAKE, DROP, EXPAND, CHOOSEROWS and CHOOSECOLS

Voici l'article de synthèse de ces nouvelles fonctions :

https://techcommunity.microsoft.com/t5/excel-blog/announcing-new-text-and-array-functions/ba-p/3186066

Voici les liens correspondants dans l'aide d'excel, et je vous ferai des petites vidéos explicatives très prochainement ! J'ai mis les liens en Francais et en Anglais, car la traduction laisse parfois à désirer.

Comme d'habitude, ces fonctions vont être particulièrement puissantes lorsqu'on va les combiner ensemble !

Nouvelles fonctions de texte.

TEXTBEFORE :

https://support.microsoft.com/en-us/office/textbefore-function-d099c28a-dba8-448e-ac6c-f086d0fa1b29

https://support.microsoft.com/fr-fr/office/textbefore-function-d099c28a-dba8-448e-ac6c-f086d0fa1b29

TEXTAFTER :

https://support.microsoft.com/en-us/office/textafter-function-c8db2546-5b51-416a-9690-c7e6722e90b4

https://support.microsoft.com/fr-fr/office/textafter-function-c8db2546-5b51-416a-9690-c7e6722e90b4

TEXTSPLIT

https://support.microsoft.com/en-us/office/textsplit-function-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7

https://support.microsoft.com/fr-fr/office/textsplit-function-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7

Nouvelles fonctions de manipulation de plages

Combiner (empiler ou mettre côte à côte) des plages verticalement ou horizontalement

VSTACK

https://support.microsoft.com/en-us/office/vstack-function-a4b86897-be0f-48fc-adca-fcc10d795a9c

https://support.microsoft.com/fr-fr/office/vstack-function-a4b86897-be0f-48fc-adca-fcc10d795a9c

HSTACK

https://support.microsoft.com/en-us/office/hstack-function-98c4ab76-10fe-4b4f-8d5f-af1c125fe8c2

https://support.microsoft.com/fr-fr/office/hstack-function-98c4ab76-10fe-4b4f-8d5f-af1c125fe8c2

Changer la taille des plages (sans ajout ni retrait de données)

TOROW

https://support.microsoft.com/en-us/office/torow-function-b90d0964-a7d9-44b7-816b-ffa5c2fe2289

https://support.microsoft.com/fr-fr/office/torow-function-b90d0964-a7d9-44b7-816b-ffa5c2fe2289

TOCOL

https://support.microsoft.com/en-us/office/tocol-function-22839d9b-0b55-4fc1-b4e6-2761f8f122ed

https://support.microsoft.com/fr-fr/office/fonction-tocol-22839d9b-0b55-4fc1-b4e6-2761f8f122ed

WRAPROWS

https://support.microsoft.com/en-us/office/wraprows-function-796825f3-975a-4cee-9c84-1bbddf60ade0

https://support.microsoft.com/fr-fr/office/wraprows-function-796825f3-975a-4cee-9c84-1bbddf60ade0

WRAPCOLS

https://support.microsoft.com/en-us/office/wrapcols-function-d038b05a-57b7-4ee0-be94-ded0792511e2

https://support.microsoft.com/fr-fr/office/fonctions-wrapcols-d038b05a-57b7-4ee0-be94-ded0792511e2

Redimensionner des plages (avec retrait de données ou ajout de nouvelles cellules)

TAKE

https://support.microsoft.com/en-us/office/take-function-25382ff1-5da1-4f78-ab43-f33bd2e4e003

https://support.microsoft.com/fr-fr/office/take-function-25382ff1-5da1-4f78-ab43-f33bd2e4e003

DROP

https://support.microsoft.com/en-us/office/drop-function-1cb4e151-9e17-4838-abe5-9ba48d8c6a34

https://support.microsoft.com/fr-fr/office/drop-function-1cb4e151-9e17-4838-abe5-9ba48d8c6a34

EXPAND

https://support.microsoft.com/en-us/office/expand-function-7433fba5-4ad1-41da-a904-d5d95808bc38

https://support.microsoft.com/fr-fr/office/fonction-expand-7433fba5-4ad1-41da-a904-d5d95808bc38

CHOOSEROWS

https://support.microsoft.com/en-us/office/chooserows-function-51ace882-9bab-4a44-9625-7274ef7507a3

https://support.microsoft.com/fr-fr/office/chooserows-function-51ace882-9bab-4a44-9625-7274ef7507a3

CHOOSECOLS

https://support.microsoft.com/en-us/office/choosecols-function-bf117976-2722-4466-9b9a-1c01ed9aebff

https://support.microsoft.com/fr-fr/office/choosecols-function-bf117976-2722-4466-9b9a-1c01ed9aebff

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

Voici une question qui m'a pas mal travaillée et qui demande une compréhension fine de la différence entre msoControlButton et msoControlPopup. Une fois qu'on a compris, c'est "relativement" simple. msoControlButton fait référence à un bouton, alors que msoControlPopup fait référence à un pop-up qui va servir de parent du sous-menu

Vous pouvez télécharger le fichier directement ici.

Explication en vidéo:

Notez que l'on peut utiliser le with et end with, ou alors faire référence directement au nom du sous menu. Je pense que c'est une question de préférence personnelle. With et end with est en principe plus rapide à exécuter, mais dans ce type de situation, je ne pense pas que la différence soit perceptible.

Emplacement du code

Voici le code avec des exemples de sous-menu :

Dans Thisworkbook, on peut mettre ce code :

Private Sub Workbook_Activate()
    Call AddToCellMenu
End Sub

Private Sub Workbook_Deactivate()
    Call DeleteFromCellMenu
End Sub

Dans un nouveau module, on mettra 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