Sammanställa lagerdata
I detta tips visas hur vi på ett smidigt kan sammanställa artiklar och i vilka lager dessa finns i
Utgångspunkten i exemplet är att vi har en serie artikelnummer som förekomster i fyra olika lager. Dessa ska sammanställas och där förekomsten i respektive lager ska redovisas på artikelnummernivå.
Följande bild visas den ursprungliga listan:
När nedanstående procedur har exekverats har, förutom ett nytt arbetsblad, följande sammanställning skapats:
Följande procedur genererar sammanställningen:
Sub Sammanstallning()
'© 2002 Alla rättigheter XL-Dennis
Dim wbLager As Workbook
Dim wsLager As Worksheet
Dim rnArtiklar As Range, rnVarde As Range
Dim Artiklar As New Collection
Dim VaArtiklar As Variant
Dim stAdress As String
Dim i As Long, j As Long, lnAntal As Long, x As Long, y As Long
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
Set wbLager = ThisWorkbook
Set wsLager = wbLager.Worksheets("Blad1")
With wsLager
lnAntal = .Range(.Range("A1"), .Range("A65536").End(xlUp)).Rows.Count
Set rnArtiklar = .Range("A2:A" & lnAntal)
End With
VaArtiklar = rnArtiklar.Value
'Skapar en unik artikelnummerserie.
For i = 1 To UBound(VaArtiklar, 1)
On Error Resume Next
Artiklar.Add VaArtiklar(i, 1), CStr(VaArtiklar(i, 1))
On Error GoTo 0
Next i
On Error Resume Next
ThisWorkbook.Worksheets("Sammanställning").Delete
On Error GoTo 0
'Lägger till ett nytt arbetsblad.
ThisWorkbook.Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Sammanställning"
'Skriver den unika artikelnummerserien till det nya arbetsbladet.
For x = 1 To Artiklar.Count
Cells(1 + x, 1).Value = Artiklar(x)
Next x
'Skriver ut lagerrubrikerna i det nya arbetsbladet.
With Range("A1:E1")
.Value = Array("Artiklar", "Lager 1", "Lager 2", "Lager 3", "Lager 4")
.Font.Bold = True
End With
'Här sker sammanställning per artikelnummer och per lager
With rnArtiklar
For j = 1 To Artiklar.Count
Set rnVarde = .Find(What:=Artiklar(j))
If Not rnVarde Is Nothing Then
stAdress = rnVarde.Address
Do
If Not IsEmpty(rnVarde.Offset(0, 1)) Then
If IsEmpty(Cells(1 + j, 2)) Then
Cells(1 + j, 2).Value = "1"
End If
End If
If Not IsEmpty(rnVarde.Offset(0, 2)) Then
If IsEmpty(Cells(1 + j, 3)) Then
Cells(1 + j, 3).Value = "2"
End If
End If
If Not IsEmpty(rnVarde.Offset(0, 3)) Then
If IsEmpty(Cells(1 + j, 4)) Then
Cells(1 + j, 4).Value = "3"
End If
End If
If Not IsEmpty(rnVarde.Offset(0, 4)) Then
If IsEmpty(Cells(1 + j, 5)) Then
Cells(1 + j, 5).Value = "4"
End If
End If
Set rnVarde = .FindNext(rnVarde)
Loop While Not rnVarde Is Nothing And rnVarde.Address <> stAdress
End If
Next j
End With
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub