Dölja & Visa verktygsfält

När vi utvecklar egna tillämpningar kan det ibland vara önskvärt att dölja såväl de inbyggda verktygsfälten som de anpassade. 

Här demonstreras två tekniker för att dölja verktygsfält. När ens egna tillämpning stängs kan det vara önskvärt att återställa de dolda verktygsfälten, vilket också demonstreras här.

Tekniken för att dölja / visa verktygsfält kan också tillämpas för menyer och s k pop-up menyer. Dock finns det ett undantag: Arbetsbladmenyn.


Objektet Verktygsfält ingår i CommandBars-samlingen. Det finns tre olika undergrupper, där var och en definierar vilken typ av objekt det är:

Undergrupp Benämning Typvärde
Verktygsfält msoBarTypeNormal 0
Menyer msoBarTypeMenuBar 1
Pop-up menyer msoBarTypePopUp 2

 

Här deklareras publika variabler, som gäller för samtliga procedurer nedan:

Option Explicit
'Här skapar vi den matris som ska lagra namnen på de
'verktygsfält som döljs
Public stDoldaVerktygsfalt() As String
Public cbVFalt As CommandBar
Public i As Long


I det första exemplet visas hur vi kan dölja och spara de dolda verktygsfältens namn i en matris.

Sub Dölj_Verktygsfält_Matris()

Application.ScreenUpdating = False

i = 0

For Each cbVFalt In Application.CommandBars
'Då det bara är de fält som är synliga och som tillhör den
'önskade undergruppen som ska döljas måste vi gå igenom
'hela samlingen
    If cbVFalt.Visible And cbVFalt.Type <> 1 Then

'Matrisen dimensioneras utifrån antal fältnamn
'som ska lagras
       ReDim Preserve stDoldaVerktygsfalt(i)
       stDoldaVerktygsfalt(i) = cbVFalt.Name
       cbVFalt.Visible = False
       i = i + 1
    End If
Next cbVFalt

Application.ScreenUpdating = True

End Sub

Fördelen med denna teknik är att proceduren körs litet snabbare än den nedan. Nackdelen är att informationen kan gå förlorad om XL måste startas om e d innan nedanstående procedur körs.

Sub Visa_Verktygsfält_Matris()
Dim cbVFalt As Variant

Application.ScreenUpdating = False

For Each cbVFalt In stDoldaVerktygsfalt
       Application.CommandBars(cbVFalt).Visible = True
Next cbVFalt


Application.ScreenUpdating = True

End Sub

Den första proceduren ovan kan anropas t ex när arbetsboken öppnas, dvs i Workbook_Open. Återställandet av verktygsfälten kan ske t ex när arbetsboken stängs, dvs i Workbook_BeforeClose.

Ett annat angreppssätt är att dölja verktygsfälten och skriva in verktygsfältens namn i ett kalkylblad.

Sub Dölj_Verktygsfält_Kblad()
Dim rgNamn As Range

Set rgNamn = _ ThisWorkbook.Sheets("Namn").Range("A1:A15")

Application.ScreenUpdating = False

rgNamn.ClearContents

i = 0

For Each cbVfält In Application.CommandBars
    If cbVfält.Visible And cbVfält.Type = 0 Then
        i = i + 1

'Här tilldelas cellerna verktygsfältens namn
        rgNamn.Cells(i, 1) = cbVfält.Name
        cbVfält.Visible = False
    End If
Next cbVfält

Application.ScreenUpdating = True

End Sub

För att återställa verktygsfälten körs följande procedur:

Sub Visa_Verktygsfält_Kblad()
Dim stNamn As String
Application.ScreenUpdating = False


i = 1
stNamn = ThisWorkbook.Sheets("Namn").Cells(i, 1)


'Här sker en looping i de celler som innehåller namn
While stNamn <> ""
   Application.CommandBars(stNamn).Visible = True
   i = i + 1
   stNamn = ThisWorkbook.Sheets("Namn").Cells(i, 1)
Wend

Application.ScreenUpdating = True
End Sub

 

Dölj/Visa Arbetsbladmenyn

Till skillnad mot andra objekt i CommandBar-samlingen så kan inte arbetsbladmenyn döljas genom att ange egenskapen "Visible" till falsk!

Följande kodsnutt döljer menyn:

Application.CommandBars("Worksheet Menu Bar").Enabled = False

För att visa menyn igen:

Application.CommandBars("Worksheet Menu Bar").Enabled = True

För att säkerhetsställa att användaren inte, genom tangentbordskommandot "Alt + -", kan nå  bladmenyn kan följande kod läggas till:

Application.OnKey "%-", ""

För att återställa tangentbordskommandot kan följande kodsnutt användas:

Application.OnKey "%-"

Se också Skapa & Lägga till verktygsfält