1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| Option Explicit
Public gw_menu_bar As CommandBar
Public saisie As Variant
' Macro de lancement des differents choix des menus
Sub LanceMacro()
saisie = Split(Application.CommandBars.ActionControl.Tag, "/") ' Eclatement de l'arborescence
End Sub
' Initialication du menu
Sub init_menu()
Dim sm(300, 100) As Variant ' Dimentionnement des lignes et sous menus
Dim tablo As Variant ' declaration d'un tableau pour les valeurs de chaque ligne
Dim i As Integer ' pointeur de boucle
Dim colonne As Integer ' Declaration des niveaux de sous menus
Dim ligne(100) As Integer ' Memoire du n° de ligne en fonction des sousmenus
Dim drapeau As Boolean ' Variable pour sortir de la boucle while wend
On Error Resume Next
Application.CommandBars("Gw_menu_bar").Delete ' Destruction de la barre de menu popup
On Error GoTo 0
Set gw_menu_bar = Application.CommandBars.Add("Gw_menu_bar", msoBarPopup) ' Initialisation du menu popup
colonne = 1 ' Initialisation de la colonne
ligne(colonne) = 1 ' Initialisation de la ligne où commence le menu
drapeau = True ' Initialisation du drapeau pour la boucle
While drapeau = True
' ******************************************************************************************************************************
' permet d'eclater la commande dans un tablo : 2 parametres pour un Menu, 3 pour une ligne
' acutellement : tablo(0) : Libelle
' tablo(1) : code B pour bouton, M pour Menu
' tablo(2) : arborescence de l'élément par ex :DGA/PIL/DQP
' tablo(3) : code O pour insérer un séparateur de groupe avant
'
tablo = Split(Sheets("Menu").Cells(ligne(colonne), colonne), ",") ' Eclatement de la ligne
'
'********************************************************************************************************************************
If UCase(tablo(1)) = "B" Then ' Si c'est un bouton
With gw_menu_bar
If colonne = 1 Then ' C'est un bouton dans le menu de base, on traite alors par rapport à la barre de menu
Set sm(ligne(colonne), colonne) = .Controls.Add(msoControlButton, 1, , , True)
sm(ligne(colonne), colonne).Caption = tablo(0) ' Mise en place du titre
sm(ligne(colonne), colonne).Tag = tablo(2) ' Pareil, mais sur Tag
If UBound(tablo) > 2 Then
If tablo(3) = "O" Then sm(ligne(colonne), colonne).BeginGroup = True
End If
' ******************************************************************************************************************************
' LA macro lancée est actuellement la meme partout
sm(ligne(colonne), colonne).OnAction = "LanceMacro" ' Lance cette Maco si click
' Attention, 5 lignes au dessous, il y a le meme Code pour des lignes appartenant aux sous niveaux des menus
' ******************************************************************************************************************************
Else
Set sm(ligne(colonne), colonne) = sm(ligne(colonne - 1), colonne - 1).Controls.Add(msoControlButton, 1, , , True)
sm(ligne(colonne), colonne).Caption = tablo(0)
sm(ligne(colonne), colonne).Tag = tablo(2)
sm(ligne(colonne), colonne).OnAction = "LanceMacro"
If UBound(tablo) > 2 Then
If tablo(3) = "O" Then sm(ligne(colonne), colonne).BeginGroup = True
End If
End If
End With
End If
If UCase(tablo(1)) = "M" Then ' C'est un Menu, (Sous menu)
' Si la colonne = 2 alors je suis dans l'arborescence du menu (commandbar) sinon je suis dans un arborescence inferieure
' Le controle n'est plus gw_menu_bar, mais le controle du niveau superieur (sm(x,y) gardé dans une table)
If colonne = 1 Then ' 1er niveau
Set sm(ligne(colonne), colonne) = gw_menu_bar.Controls.Add(msoControlPopup, , , , True) ' Creation d'un type sous menu
Else ' Niveaux inferieurs
Set sm(ligne(colonne), colonne) = sm(ligne(colonne - 1), colonne - 1).Controls.Add(msoControlPopup, , , , True) ' Creation d'un type sous menu
End If
sm(ligne(colonne), colonne).Caption = tablo(0) ' Mise en place du titre
If UBound(tablo) > 2 Then
If tablo(3) = "O" Then sm(ligne(colonne), colonne).BeginGroup = True
End If
colonne = colonne + 1 ' Avancer dans la colonne
' Recherche du sousmenu dans la colonne suivante
For ligne(colonne) = 1 To Sheets("Menu").Cells(65536, colonne).End(xlUp).Row
If tablo(0) = Sheets("Menu").Cells(ligne(colonne), colonne) Then
Exit For ' Oui j'ai trouvé
End If
Next
If ligne(colonne) > Sheets("Menu").Cells(65536, colonne).End(xlUp).Row Then ' Je n'ai pas trouvé
colonne = colonne - 1 ' Retour à la colonne précédente
MsgBox "Sous menu : " & tablo(0) & " Non trouvé" ' Message d'erreur
End If
End If
recompte:
ligne(colonne) = ligne(colonne) + 1 ' Avancer d'une ligne
If Sheets("Menu").Cells(ligne(colonne), colonne) = "//" Then ' Je teste si je suis en fin de menu
If colonne = 1 Then ' Si c'est le menu de base, fin de la boucle
drapeau = False ' Pointeur de fin de boucle
Else
colonne = colonne - 1 ' Je recule d'une colonne
GoTo recompte ' Je retourne pour ajouter une ligne et je recontrole
End If
End If
Wend
gw_menu_bar.ShowPopup
End Sub |
Partager