Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Barra menu via VBA

1,197 views
Skip to first unread message

Snoopy

unread,
Mar 16, 2010, 9:18:13 AM3/16/10
to
Ciao ragazzi,
questa mattivna ho voluto sperimentare la creazione di una barra
personalizzata via VBA.
Preso il suggerimento ricevuto qualche giorno fa, ho scritto:

=========================================
Sub CreaBarra()

Dim MyBar1 As CommandBar
Dim MyButton As CommandBarControl

On Error Resume Next
Application.CommandBars("mBar").Delete
On Error GoTo 0

Set MyBar1 = Application.CommandBars.Add(Name:="MyBar1",
Position:=msoBarTop, MenuBar:=True, Temporary:=True)

With MyBar1
.Visible = True
Set MyButton = .Controls.Add(Type:=msoControlButton,
Temporary:=True)
With MyButton
.Style = msoButtonIconAndCaption
.Caption = "Codice1"
.OnAction = "'" & ActiveWorkbook.Name & "'!Macro1"
.FaceId = 40
.DescriptionText = "Esegue Macro1"
.Tag = "Mac1"
End With
Set MyButton = .Controls.Add(Type:=msoControlButton,
Temporary:=True)
With MyButton
.Style = msoButtonIconAndCaption
.Caption = "Codice2"
.OnAction = "'" & ActiveWorkbook.Name & "'!Macro2"
.FaceId = 40
.Tag = "Mac2"
.DescriptionText = "Esegue Macro2"
End With
With Application.CommandBars
If .DisableCustomize = True Then
.DisableCustomize = False
Else
.DisableCustomize = True
End If
End With
End With

End Sub
=========================================

Ho qualche domanda:

- coma faccio a creare dei sottomenù (in maniera semplice ed
intuitiva) con 3/4 bottoni?
- dato che questo codice vorrei metterlo nel ThisWorkbook, l'On Action
dei bottoni puù puntare a Private Sub inin moduli?
- al posto di - .OnAction = "'" & ActiveWorkbook.Name & "'!Macro2" -
posso scrivere direttamente il nome della Sub?

Grazie 1000 e buona giornata.

Mauro Gamberini

unread,
Mar 16, 2010, 10:52:19 AM3/16/10
to
> - coma faccio a creare dei sottomenů (in maniera semplice ed
> intuitiva) con 3/4 bottoni?
>

Con una UserForm... ;-)

--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads


__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4949 (20100316) __________

Il messaggio č stato controllato da ESET NOD32 Antivirus.

www.nod32.it

Snoopy

unread,
Mar 16, 2010, 11:22:22 AM3/16/10
to
>
> Con una UserForm... ;-)
>


Ciao Mauro,
la UserForm è un'opzione che non sempre è possibile utilizzare perchè:

- devi richiamarla ogni volta che ti serve
- non la puoi tenere sempre attiva perchè invade l'area di lavoro

Diversamente, una commandbar rimane più intuitiva per l'utente finale
e, rimanendo sempre visibile, non invade l'area di lavoro.
E' vero, però, che la soluzione eliminerebbe il problema
dell'adeguamento per le varie versioni di XLS.
Discorso che abbiamo già fatto ma che non riesco ad applicare ai miei
files.

Mauro Gamberini

unread,
Mar 16, 2010, 11:57:27 AM3/16/10
to
> - devi richiamarla ogni volta che ti serve
>

No.

> - non la puoi tenere sempre attiva perchè invade l'area di lavoro
>

No.

Una UserForm con questo codice:

Private Sub UserForm_Initialize()
With Me
.Height = 100
.Width = Application.Width
End With
End Sub

Questo in un modulo standard:

Public Sub m()
UserForm1.Show vbModeless
End Sub

E questo in ThisWorkbook:

Private Sub Workbook_Open()
Call m
End Sub

Pensa un po' che succede se tolgo la x e la
barra del titolo dalla UserForm... ;-)


__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4949 (20100316) __________

Il messaggio è stato controllato da ESET NOD32 Antivirus.

www.nod32.it

Snoopy

unread,
Mar 17, 2010, 8:55:07 AM3/17/10
to
Ciao Mauro,
mi stai convincendo... io ho solo aggiunto la proprietà
StartUpPosition a "3 - Windows Default" per fare in modo che la barra
compaia in alto, sovrapponendo le CommandBar di Excel.
Premesso che potrei nascondere tutte le barre di Excel con un
semplicissimo codice in avvio e chiusura del file, potrei
automatizzare l'avvio della form in apertura file, ho alcune domande
(e sono sono solo le prime che mi vengono in mente):

- posso bloccare spostamento della form?
- posso disabilitare il tasto "X"?

Grazie 1000!

Mauro Gamberini

unread,
Mar 17, 2010, 9:05:00 AM3/17/10
to

********************************************

Crea un modulo di classe
(inserisci-->Modulo di classe)
Rinominalo: clsForm

Metti questo codice nel modulo di classe:

Private Declare Function FindWindow Lib "USER32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long


Private Declare Function GetWindowLong Lib "USER32" _
Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long


Private Declare Function SetWindowLong Lib "USER32" _
Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) _
As Long


Private Declare Function DrawMenuBar Lib "USER32" _
(ByVal hWnd As Long) As Long


Private Const GWL_STYLE As Long = (-16)
Private Const WS_CAPTION As Long = &HC00000


Public Property Set Form(oForm As Object)


Dim lStyle As Long
Dim hWndForm As Long


If Val(Application.Version) < 9 Then
hWndForm = FindWindow( _
"ThunderXFrame", oForm.Caption)
Else
hWndForm = FindWindow( _
"ThunderDFrame", oForm.Caption)
End If


lStyle = GetWindowLong(hWndForm, GWL_STYLE)


lStyle = lStyle And Not WS_CAPTION
SetWindowLong hWndForm, GWL_STYLE, lStyle
DrawMenuBar hWndForm


End Property


E metti questo nel modulo di codice della UserForm:


Dim objForm As New clsForm


Private Sub UserForm_Initialize()

Set objForm.Form = UserForm1


With Me
.BorderStyle = fmBorderStyleSingle
End With


End Sub


Private Sub UserForm_Terminate()
Set objForm = Nothing
End Sub


Esempio di chiamata da una Sub:


Public Sub m()
UserForm1.Show vbModeless
End Sub

NOTA.
Crea un modo di chiudere il file se
nascondi la barra del titolo di Excel.

Snoopy

unread,
Mar 18, 2010, 7:32:55 AM3/18/10
to
Ciao Mauro,
quando lancio la userform, mi restituisce il seguente errore:

Errore di compilazione: Tipo definito dall'utente non definito

Io stò provando su xls 2007... può essere il problema?

Mauro Gamberini

unread,
Mar 19, 2010, 3:54:40 AM3/19/10
to
> quando lancio la userform, mi restituisce il seguente errore:
>
> Errore di compilazione: Tipo definito dall'utente non definito
>

Io non so cosa stai facendo tu... ;-)
Guarda qui:

http://www.maurogsc.eu/esemping10/provaformbarra01.zip

__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4956 (20100318) __________

Snoopy

unread,
Mar 19, 2010, 6:16:48 AM3/19/10
to
Ciao Mauro e grazie 1000,
adesso funziona tutto... probabilmente avevo fatto qualche errore in
fase di copiatura del codice nel mio file.
Ti spiego... in questa fase stò solo valutando il tuo suggerimento di
mettere tutti i miei comandi in una userform anzicchè in un ribbon o
in una barra degli strumenti.
Fermo restando che la cosa mi piace ed anche molto, adesso devo
decidere cosa fare dei ribbon e delle barre degli strumenti di Excel
che, di fatto, sarebbero coperti dalla userform ma comunque
disponibili utilizzando i comandi da tastiera (es. ALT+.... oppure CTRL
+...).
L'ideale sarebbe disabilitare qualsiasi comando e combinazione di
tasti da tastiera quando il file è attivo, eccetto in sessioni
differenti di XLS.
Se riuscissi a fare questo avrei un ottima base di partenza per
abbandonare il macchinoso sistema di associare le mie macro a barre
degli stumenti e/o ribbon che non fanno altro che alimentare problemi
di gestione.
Secondo te è una cosa fattibile o mi ficco in un vicolo cieco?

Mauro Gamberini

unread,
Mar 19, 2010, 7:00:15 AM3/19/10
to
> Fermo restando che la cosa mi piace ed anche molto, adesso devo
> decidere cosa fare dei ribbon e delle barre degli strumenti di Excel
> che, di fatto, sarebbero coperti dalla userform ma comunque
> disponibili utilizzando i comandi da tastiera (es. ALT+.... oppure CTRL
> +...).
> L'ideale sarebbe disabilitare qualsiasi comando e combinazione di
> tasti da tastiera quando il file è attivo, eccetto in sessioni
> differenti di XLS.
>

Ci penso su.
Potresti all'avvio del file disabilitare ALT e CTRL.
Vedi qui:
http://www.rondebruin.nl/key.htm

Un esempio potrebbe essere questo da mettere
nel file che hai scaricato, modificando il codice
di ThisWorkbook(ho semplificato la masco
di Ron per renderla più chiara, non intercetto tutto):

Private Sub Workbook_Open()
UserForm1.Show vbModeless
Call Disable_Keys
End Sub

Private Sub Disable_Keys()

Dim StartKeyCombination As Variant
Dim I As Long

On Error Resume Next

For Each StartKeyCombination In Array("+", _
"^", "%", "+^", "+%", "^%", "+^%")
For I = 0 To 255
Application.OnKey StartKeyCombination & Chr$(I), ""
Next I
Next

End Sub

Il tutto ha effetto *solo* sul file dove si trova il codice,
non alteri le impostazioni sugli altri files.

Snoopy

unread,
Mar 19, 2010, 10:21:43 AM3/19/10
to
No no...
ho trasferito il tuo codice nel ThisWorkbook e riavviato il file ma
non succede nulla.
Se provo a Fare ALT+F e poi FRECCIA-GIU'... compare la tendina File,
stessa cosa per le altre tendine.
Ho provato anche:

- il codice di Ron ma migliori risultati
- a lanciare la macro mettendola in un semplice modulo

Strano! Perchè da quello che ho letto sul sito di Ron, sembra un
codice già testato!

Mauro Gamberini

unread,
Mar 19, 2010, 12:33:30 PM3/19/10
to

**********************************+

Do un'occhiatina al tutto lunedì se non lo fa
nessuno prima.

Ciao Aurelio, buon fine settimana.

__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4958 (20100319) __________

Snoopy

unread,
Mar 19, 2010, 4:56:05 PM3/19/10
to
Ciao Mauro...
buon fine settimana a te e grazie 1000 ancora!!!

il picchio

unread,
Mar 23, 2010, 9:06:01 PM3/23/10
to

"Snoopy" ha scritto:

Copia in un modulo della cartella in cui vuoi utilizzare le funzionalità
della barra personalizzata

Public Slaghè As Boolean
----------------------------------
Sub BarraFsco()
'
' MBarraFsco Macro
' Macro modificata il 11/01/2010 da Fsco
'

'Variabili
Dim i As Integer, j As Integer, VettMenu, VettVoci, VettMacro, _
MyBar As Object
Application.ScreenUpdating = False
If Slaghè Then
MsgBox "La barra c'è già"
Exit Sub
End If
‘Creazione di nr. 3 pulsanti da modificare a piacimento
VettMenu = Array("Cont1", "Cont2", "Cont3")
‘Creazione di sottomenu per ciascun pulsante da modificare a piacimento
VettVoci = Array(Array("Vai a ", _
"Termina", "Conta"), Array("Controllo", _
"Carica", "Carica1"), _
Array("Chiude", "Cancella"))
‘Nomi di macro associate ai sottomenu
VettMacro = Array(Array("VaiAA", _
"Termina", "Registra"), Array("Controllo", "CopiaDa", _
"Mostra"), Array("Chiude", "CancellaDati"))

'Imposta la barra
'Set MyBar = Application.CommandBars.Add(Name:="Barra di Fsco", _
'Position:=msoBarFloating, Temporary:=True)
Set MyBar = Application.CommandBars.Add(Name:="Barra di Fsco", _
Position:=msoBarTop, Temporary:=True)
MyBar.Visible = True

'Crea i menu principali
For i = 0 To UBound(VettMenu)
MyBar.Controls.Add Type:=msoControlPopup
With MyBar.Controls(i + 1)
.Caption = VettMenu(i)
End With
Next

'Crea le voci di menu e assegna le relative macro
For i = 0 To UBound(VettVoci)
With MyBar.Controls(i + 1)
For j = 0 To UBound(VettVoci(i))
With .Controls
.Add
.Item(j + 1).Caption = VettVoci(i)(j)
.Item(j + 1).OnAction = VettMacro(i)(j)
End With
Next
End With
Next
Slaghè = True
-------------------------------------------------------

End Sub
Sub EliminaLaMiaBarra()
'
' EliminaLaMiaBarra Macro
' Macro registrata il 21/01/2010 da Fsco
'
'
Dim Cmbar As Object
Application.ScreenUpdating = False
For Each Cmbar In Application.CommandBars
If Left(Cmbar.Name, 5) = "Barra" Then
Application.CommandBars("Barra di Fsco").Delete
End If
Next
End Sub

il picchio

unread,
Mar 24, 2010, 5:45:02 AM3/24/10
to
"Snoopy" ha scritto:

Mi scuso per l'invasione e proporrei
Copia questo codice in un modulo della cartella in cui, all’apertura, vuoi
fare apparire i menu

Public Slaghè As Boolean
-------------------------------------
Sub BarraFo()
'
' MBarraFo Macro


' Macro modificata il 11/01/2010 da F

'

'Variabili
Dim i As Integer, j As Integer, VettMenu, VettVoci, VettMacro, _
MyBar As Object
Application.ScreenUpdating = False
If Slaghè Then
MsgBox "La barra c'è già"
Exit Sub
End If

‘Descrizione dei 3 menu da modificare a piacimento in quantità e descrizione
VettMenu = Array("Con1t", "Con2", "Cont3")
‘Descrizione dei sottomenu


VettVoci = Array(Array("Vai a ", _

"Termina", "Contabilizza"), Array("Controllo", _


"Carica", "Carica1"), _
Array("Chiude", "Cancella"))

‘Descrizione delle routine che saranno presenti in un altro modulo
VettMacro = Array(Array("VaiA", _
"Termina", "Registra"), Array("Controllo", "Copia", _
"Mostra"), Array("ChiudeIl", "CancellaDati"))

'Imposta la barra
'Set MyBar = Application.CommandBars.Add(Name:="Barra di F", _
'Position:=msoBarFloating, Temporary:=True)
Set MyBar = Application.CommandBars.Add(Name:="Barra di F", _


Position:=msoBarTop, Temporary:=True)
MyBar.Visible = True

'Crea i menu principali
For i = 0 To UBound(VettMenu)
MyBar.Controls.Add Type:=msoControlPopup
With MyBar.Controls(i + 1)
.Caption = VettMenu(i)
End With
Next

'Crea le voci di menu e assegna le relative macro
For i = 0 To UBound(VettVoci)
With MyBar.Controls(i + 1)
For j = 0 To UBound(VettVoci(i))
With .Controls
.Add
.Item(j + 1).Caption = VettVoci(i)(j)
.Item(j + 1).OnAction = VettMacro(i)(j)
End With
Next
End With
Next
Slaghè = True

End Sub
----------------------------------------------------
Sub EliminaLaMiaBarra()
'
' EliminaLaMiaBarra Macro
' Macro registrata il 21/01/2001 da F


'
'
Dim Cmbar As Object
Application.ScreenUpdating = False
For Each Cmbar In Application.CommandBars
If Left(Cmbar.Name, 5) = "Barra" Then

Application.CommandBars("Barra di Francesco").Delete

Snoopy

unread,
Mar 24, 2010, 11:48:20 AM3/24/10
to
Ciao Francesco,
ti ringrazio per la risposta che conserverò gelosamente per futuri
file da creare.
L'ho provata e funziona... ti segnalo che ho dovuto prima modificare
il riferiemtno alla barra nel codice di eliminazione perchè il nome è
"Barra di F"
In questa fase però, ho la necessità di capire come migrare sulla
soluzione della userform di Mauro.
Grazie ancora e buona serata.

il picchio

unread,
Mar 24, 2010, 6:01:02 PM3/24/10
to
"Snoopy" ha scritto:

> Ciao Francesco,
> ti ringrazio per la risposta che conserverò gelosamente per futuri
> file da creare.
> L'ho provata e funziona... ti segnalo che ho dovuto prima modificare
> il riferiemtno alla barra nel codice di eliminazione perchè il nome è
> "Barra di F"

Infatti mi ero accorto immediatamente, dopo il clic di invio, che non avevo
modificato il nome per esteso della barra in chiusura
Come già accennato il codice che ho incollato prevede una barra
personalizzata con tre menu. Nel I e II menu vi sono tre sottomenu e nel III
ve ne sono due. E' chiaro che opportunamente modificato il codice si presta
per i più svariati usi personali. Il codice deve essere ricompreso in un
modulo e in un altro debbono essere "alloggiate" le macro richiamate con
assegnazione alla variabile "VettMacro".
Io utilizzo questo codice solo in fase di apertura e gestione della più
importante cartella di Excel mentre per gli altri e svariati file utilizzo i
menu di default e uno personalizzato che ho creato per velocizzare alcune
operazioni che manualmente richiederebbero molto più tempo.


> Grazie ancora e buona serata.

Di nulla e contraccambio.

0 new messages