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-kurser 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.
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