=========================================
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.
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.
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.
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... ;-)
--
---------------------------
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.
- posso bloccare spostamento della form?
- posso disabilitare il tasto "X"?
Grazie 1000!
********************************************
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.
Errore di compilazione: Tipo definito dall'utente non definito
Io stò provando su xls 2007... può essere il problema?
Io non so cosa stai facendo tu... ;-)
Guarda qui:
http://www.maurogsc.eu/esemping10/provaformbarra01.zip
--
---------------------------
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 4956 (20100318) __________
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.
- 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!
**********************************+
Do un'occhiatina al tutto lunedì se non lo fa
nessuno prima.
Ciao Aurelio, buon fine settimana.
--
---------------------------
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 4958 (20100319) __________
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
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
> 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.