Sortera arbetsblad 

I detta tips belyses ett flertal tekniker för att sortera arbetsbladen i en arbetsbok.


I första exemplet visas hur vi på ett okomplicerat sätt kan sortera arbetsbladen efter våra egna önskemål.

Option Explicit
Option Base 1
Sub Blad_Sortering_Enkel()
   Worksheets("Test").Move After:=Worksheets("Tabeller")
   Worksheets("Statistik").Move After:=Worksheets("Resultat")
End Sub

I nästa exempel belyses hur vi kan ta hjälp av cellvärden vid egen sortering, där respektive cell håller ett arbetsbladnamn. M a o, listan i arbetsbladet styr sorteringsordningen.

Sub Blad_Sortering_CellOmrade()
Dim rnOmrade As Range
Dim rnBladNamn As Range

Set rnOmrade = Worksheets("Startsida").Range("F3:F7")

For Each rnBladNamn In rnOmrade
        Worksheets(rnBladNamn.Value).Move _
        After:=Worksheets(Worksheets.Count)
Next rnBladNamn
End Sub

I vissa sammanhang kan det vara önskvärt att skapa en egen sorteringsordning mha en VBA-matris, där matrisen håller samtliga arbetsbladnamn. Exemplet nedan visar hur det kan ske på ett enkelt sätt.

Sub Blad_Sortering_Matris()
Dim vBladNamn As Variant
Dim i As Integer

vBladNamn = Array("Resultat", "Statistik", "Tabeller", "Test")

For i = 1 To UBound(vBladNamn)
       Worksheets(vBladNamn(i)).Move After:=Worksheets(4)
Next i
End Sub
'Noterbart: Arbetsblad som finns i arbetsboken men som inte ingår i
'VBA-matrisen placeras före alla andra blad.

Har vi stora arbetsböcker och där arbetsblad läggs till löpande måste en annan lösning till. Här kan vi dra nytta av att både skapa en lista i ett kalkylblad och skapa en VBA-matris.

Sub Blad_Sortering_Celler_Matris()
Dim vBladNamn As Variant
Dim rnOmrade As Range
Dim i As Integer

Set rnOmrade = Worksheets("Startsida"). _
Range("F3", Range("F3").End(xlDown))

'En en-dimensionell kalkylbladsmatris som är vertikal måste
'omvandlas till horisontell innan värdena kan läsas in
' i en VBA-matris.
vBladNamn = Application.WorksheetFunction.Transpose(rnOmrade)

For i = 1 To UBound(vBladNamn)
      Worksheets(vBladNamn(i)).Move After:=Worksheets(5)
Next i
End Sub


I nästa exempel demonstreras hur arbetsblad kan sorteras stigande. Vill vi sortera åt andra hållet , dvs fallande sortering byter vi bara ut tecknet "<" mot ">".

Sub Sortera_Blad_Stigande()
Dim iAntalBlad As Integer
Dim i As Integer
Dim j As Integer

iAntalBlad = ActiveWorkbook.Worksheets.Count

For i = 1 To iAntalBlad
     For j = i To iAntalBlad
        If LCase(Worksheets(j).Name) < LCase(Worksheets(i).Name) Then_
            Worksheets(j).Move before:=Worksheets(i)
        End If
     Next j
Next i

End Sub


Har vi både arbetsblad och t ex diagramblad i en arbetsbok, vilka vi vill sortera, måste en annan lösning till. Exemplet nedan visar en teknik för att sortera alla typer av blad i stigande ordning.

Sub Sortera_Alla_Bladtyper_Stigande()
Dim i As Integer
Dim j As Integer

For i = 1 To ActiveWorkbook.Sheets.Count
  Sheets(i).Visible = True
  For j = 1 To i - 1
    If LCase(Sheets(j).Name) > LCase(Sheets(i).Name) Then
          ActiveWorkbook.Sheets(i).Move _
          Before:=ActiveWorkbook.Sheets(j)
          Exit For
    End If
  Next j
Next i
End Sub