Ta fram flera bladflikar samtidigt

Ta fram dolda kalkylblad

Har du någon gång haft behov av att ta fram flera bladflikar samtidigt (som är dolda)? Då har du garanterat märkt att det inte finns något lätt sätt att göra detta i Excel ☹.

För att ta fram dolda kalkylblad högerklickar du på en bladflik och väljer Ta fram… [Unhide].

I dialogrutan som dyker upp kan du – tyvärr – endast ta fram ett kalkylblad i taget. Lite jobbigt om du ska ta fram 12 av 20 dolda kalkylblad i en fil… Däremot kan du enkelt dölja många kalkylblad genom att markera flera bladflikar och högerklicka och välja Dölj [Hide].

Vi rekommenderar dessa Excelkurser:
www.infocell.se – lärarledda kvalitetskurser i Excel
www.officekurs.se – oslagbar e-Learning i Excel & Office-paketet

Vi har tidigare skrivit ett tips om hur du med VBA-kod kan dölja alla bladflikar. Du kan läsa och se den videofilmen här.

Dölja och visa utvalda kalkylblad

I det här tipset går vi lite djupare och visar en lösning som med flexibilitet gör att du kan hanterar stora arbetsböcker med många kalkylblad. Vid behov kan du gömma eller visa flera kalkylblad på en och samma gång. Detta går att ordna med VBA-kod. I dagens VBA-tips skall vi se på hur ett sådant makro kan se ut.

Exempelfilen med VBA-koden hittar du här

Basen för det hela är en tabell som utgör ett register över alla bladflikar, där namnen på bladflikarna visas i kolumn A. Varje kalkylblad i Excel har ett synligt namn och ett kodmässigt namn. Det namn vi ser på bladfliken nederst i Excel är det synliga namnet. Det finns även ett kodmässigt namn, som vi bara ser i kodfönstret i VBA-editorn (öppnas med Alt+F11). I vår tabell använder vi oss av det synliga namnet.

ta fram flera kalkylblad samtidigt

De olika bladen hör till olika grupper. I vårt exempel vill vi ibland visa:

  • bladen med jämna nummer
  • bladen med udda nummer
  • blad 1-3
  • alla bladflikar.

Dessa fyra grupper blir var sin kolumn i tabellen, där vi med ett x markerar att ett visst blad skall visas. (Notera att du behöver ändra i koden om du vill använda ett stort X eller ett annat tecken).

Vi skulle kunna skriva en komplett metod för varje knapp, men det är helt onödigt, eftersom alla knappar i princip ska göra samma sak. Det enda som skiljer knapparna åt är vilken av kolumnerna i tabellen som skall läsas av.

Därför skapar vi en generell metod VisaEfterKolumn() som respektive knapp (makro) anropar. Vid anropet talar vi om vilken kolumn som skall avgöra vad som visas. Metoden som skall visa bladen med jämna nummer anropar VisaEfterKolumn och skickar med en tvåa, eftersom det är kolumn två som skall styra vad som visas.

Public Sub VisaJamna()
    ' Vi anropar en generell metod som skall granska bladregistret och söka efter kryss i
    ' kolumn 2
    Call VisaEfterKolumn(2)
End Sub

Den generella metoden ser vi nedan. Metoden börjar med att gömma alla blad utom bladet BladRegister. Därefter läses tabellen över bladen in till arrData. För att kunna gå igenom hela tabellen måste vi ta reda på sista radens nummer. Därefter går vi igenom tabellen rad för rad. För varje rad granskas om det finns ett kryss i den aktuella kolumnen.

Private Sub VisaEfterKolumn(lColumnToCheck)
    Dim arrData As Variant
    Dim lCurrentRow As Long
    Dim lLastRow As Long
    Dim varSheet As Variant
    Dim shFound As Worksheet

    ' Vi börjar med att gömma alla blad (utom bladet BladRegister)
    Call GomAllaArk

    ' Hämta all data i tabellen (utom rubrikerna) till arrData
    arrData = wsBladRegister.Range("Tabell1").Value
        
    ' Sista raden fås genom
    lLastRow = UBound(arrData)
    
    ' Vi gör en loop som går från rad 1 till sista raden. Rubrikraden kom inte med
    For lCurrentRow = 1 To lLastRow
        If arrData(lCurrentRow, lColumnToCheck) = "x" Then
            ' Namnet finns i kolumn 1
            Set varSheet = GetSheetByVisibleName(arrData(lCurrentRow, 1)) 
            
            ' Om inte arket hittas så blir varSheet satt till false av GetSheetByVisibleName
            If Not IsEmpty(varSheet) Then
                ' Vi har hittat arket
                Set shFound = varSheet
                shFound.Visible = xlSheetVisible
            End If
        End If
    Next

End Sub

Om bladet skall visas måste vi få tag i det. Det är lättare sagt än gjort 😊. Kod skall egentligen arbeta med kodmässiga namn och inte med synliga bladfliksnamnen, men i en praktisk tillämpning så är det ju ofta de synliga namnen som användaren känner till. Därför måste vi ha en metod som tar emot det synliga namnet och letar upp vilket blad som namnet är kopplat till (kodmässigt). Det görs genom att samtliga blad gås igenom tills rätt blad hittas. Metoden returnerar bladet, om den hittar det, annars returneras False. Om metoden inte returnerat false så kommer VisaEfterKolumn() att visa bladet.

Public Function GetSheetByVisibleName(varNameOfSheetToFind As Variant) As Variant
    Dim sh As Worksheet ' sh skall peka på ett blad i taget
    
    ' Vi loopar igenom alla blad
    For Each sh In ThisWorkbook.Sheets
        ' Om bladet vi granskar i loopen har rätt namn returnerar vi bladet och hoppar ur funktionen
        If sh.Name = varNameOfSheetToFind Then
            Set GetSheetByVisibleName = sh ' Låt funktionen returnera det som pekar på rätt ark
            Exit Function ' Hoppa ur funktionen
        End If
    Next
    
    ' om vi inte hittar bladet så returnerar vi false
    GetSheetByVisibleName = False
End Function

Dela gärna detta blogginlägg på LinkedIn eller andra sociala media om du tror att andra kan ha nytta av det.

Associerad e-kurs: VBA och makron på officekurs.se

Du gillar kanske också...

Börja prenumerera på Excelbrevet

Ta del av tips & tricks i Excel och Office en gång i månaden helt kostnadsfritt.

Excelbrevet är ett helt gratis utbildningsbrev från Infocell.

Grattis du kommer nu att få Excelbrevet varje månad helt gratis! Verifiera e-postadressen (kolla eventuellt i skräpkorgen om du inte ser mailet).