Filtrera importerad data


I detta tips visas hur vi kan filtrera och delvis transponera importerad data från t ex en databaskälla från ett arbetsblad till ett annat.

Lösningen bygger på att vi nyttjar verktyget Autofilter och dess förmåga att skapa en unika lista.

 

Bilden nedan den ursprungliga importerade datalistan:

 


Följande bild visar utfallet efter det att nedanstående procedur har exekverats:

 

 



Om ett felmeddelande erhålls vid kopiering till VBA-modul så läs mer här»

 

 

(© 2002 - 2004 All rights Colo - Used by permission)

Option Explicit

 

Sub Transformera_Filtrera_Data()

   '© 2004 Alla rättigheter XL-Dennis

   Dim wbBook As Workbook

   Dim wsData As Worksheet, wsTransposed As Worksheet

   Dim rnUnique As Range, rnStart As Range, rnData As Range

   Dim rnFilter As Range, rnFind As Range, rnSource As Range

   Dim vaField As Variant

   Dim i As Long, j As Long

 

   Set wbBook = ThisWorkbook

 

   With wbBook

      Set wsData = .Worksheets("Data")

      Set wsTransposed = .Worksheets("Transposed")

   End With

 

   With wsData

      Set rnUnique = .Range(.Range("C1"), .Range("C65536").End(xlUp))

      Set rnSource = .Range(.Range("C2"), .Range("C65536").End(xlUp))

      Set rnFilter = .Range(.Range("A1"), .Range("D65536").End(xlUp))

      Set rnData = .Range("A1")

   End With

 

   With wsTransposed

      Set rnStart = .Range("A1")

   End With

 

   Application.ScreenUpdating = False

 

   'Först sorterar vi listan.

   rnFilter.Sort Key1:=Range("C2"), _

         Order1:=xlAscending, _

         Header:=xlGuess, _

         Ordercustom:=1, _

         MatchCase:=True, _

         Orientation:=xlTopToBottom

 

   'Därefter skapar vi en unik lista av fältnamn.

   rnUnique.AdvancedFilter _

         Action:=xlFilterCopy, _

         CriteriaRange:=rnUnique, _

         CopyToRange:=Range("J1"), _

         Unique:=True

 

   'Läser in den skapade unika listan av fältnamn till en array.

   With wsData

      vaField = .Range(.Range("J2"), .Range("J65536").End(xlUp))

   End With

 

   With rnStart

      .Value = "ID"

      'Tilldelar rad 1 i målbladet den unika fältnamnslistan.

      .Offset(0, 1).Resize(1, UBound(vaField)).Value = Application.Transpose(vaField)

      'Tilldelar kolumn 1 i målbladet värden från kolumn 1 i källbladet.

      .Offset(1, 0).Resize(rnUnique.Rows.Count, 1).Value = rnUnique.Offset(1, -2).Value

   End With

 

   'Loopar igenom den unika fältnamnslistan, anger utsökningsvillkoren och

   'därefter överför selekterad data till målbladet.

   For i = LBound(vaField) To UBound(vaField)

      rnData.AutoFilter Field:=3, Criteria1:=vaField(i, 1)

      Set rnFind = rnSource.SpecialCells(xlCellTypeVisible)

      j = rnFind.Rows.Count

      rnStart.Offset(1, i).Resize(j, 1).Value = rnFind.Offset(0, 1).Value

   Next i

 

   wsData.AutoFilterMode = False

 

   Application.ScreenUpdating = False

 

   MsgBox "Klart!"

 

End Sub