Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Option Explicit
- Sub finnForSisteÅr(skrivtilWB As Workbook, hentfraWB As Workbook)
- Dim ws As Worksheet
- Dim materialNrKost As Dictionary, materialNrAntal As Dictionary, materialnamn As Dictionary
- Dim dicAntal As Dictionary, dicKost As Dictionary
- Dim c As Range, r As Range
- Dim gjeldandeNr As Long, gjeldandeDato As Long, i As Long, j As Long
- Dim startmåned As Long, startår As Long, sluttmåned As Long, sluttår As Long
- Dim antal As Long, kost As Long
- Dim dato As Date
- Dim s As String
- Dim v1 As Variant, v2 As Variant, vArr1 As Variant, vArr2 As Variant
- Dim skrivTilTabell As ListObject
- Set materialnamn = New Dictionary
- ' Lista over materialnr me skal hente ut data for
- Set materialNrAntal = New Dictionary: Set materialNrKost = New Dictionary
- Set r = skrivtilWB.Worksheets(Innstillinger.Name).ListObjects(1).ListColumns(1).DataBodyRange
- For Each c In r
- If IsNumeric(c) Then
- If Not materialNrAntal.Exists(CLng(c)) Then
- Set dicAntal = New Dictionary
- materialNrAntal.Add Key:=CLng(c), Item:=dicAntal
- Set dicKost = New Dictionary
- materialNrKost.Add Key:=CLng(c), Item:=dicKost
- End If
- End If
- Next c
- ' Startverdiar
- startmåned = month(Date)
- sluttmåned = month(Date) - 1
- startår = year(Date) - 1
- sluttår = year(Date)
- If sluttmåned = 0 Then
- sluttmåned = 12
- sluttår = sluttår - 1
- End If
- ' Skriv datoar til rådataark og initialiser ordbøker
- Set ws = skrivtilWB.Worksheets(Rådata.Name)
- Set c = ws.Range("C2")
- For i = 0 To 11
- dato = DateSerial(startår, startmåned + i, 1)
- c.Offset(0, i) = dato
- c.Offset(0, i).NumberFormat = "mm. yyyy"
- c.Offset(0, 12 + i) = dato
- c.Offset(0, 12 + i).NumberFormat = "mm. yyyy"
- For Each v1 In materialNrAntal
- Set dicAntal = materialNrAntal(v1)
- dicAntal.Add Key:=dato, Item:=0
- Set dicKost = materialNrKost(v1)
- dicKost.Add Key:=dato, Item:=0
- Next v1
- Next i
- ' Hent data fra lagra SAP-data
- For i = startår To sluttår
- If SheetExists(CStr(i), hentfraWB) Then
- ' Kolonne A i arket me henter data fra
- Set ws = hentfraWB.Worksheets(CStr(i))
- Set r = ws.Range(ws.Range("A2"), ws.Range("A" & ws.Rows.Count).End(xlUp))
- ' Søk på kvart av materialnummera me skal finne
- For Each c In r
- ' Sorter ut materialnummeret fra teksten i kolonne A
- s = Trim(Left(c, InStr(1, c, " ", vbBinaryCompare)))
- If Len(s) = 0 Then
- s = 0
- End If
- gjeldandeNr = CLng(s)
- ' Samanlikn med materialnummera me søker ettter
- If materialNrAntal.Exists(gjeldandeNr) Then
- dato = CDate(c.Offset(0, 2))
- If Not materialnamn.Exists(gjeldandeNr) Then
- ' Sorter ut materialnamn frå teksten
- s = Trim(Replace(c, gjeldandeNr, "", 1, -1, vbBinaryCompare))
- materialnamn.Add Key:=gjeldandeNr, Item:=s
- End If
- If dato >= DateSerial(startår, startmåned, 1) And dato <= DateSerial(sluttår, sluttmåned, (days_in_month(sluttmåned, sluttår))) Then
- antal = CLng(c.Offset(0, 3))
- kost = CLng(c.Offset(0, 5))
- Set dicAntal = materialNrAntal(gjeldandeNr)
- Set dicKost = materialNrKost(gjeldandeNr)
- If dicAntal.Exists(dato) Then
- dicAntal(dato) = dicAntal(dato) + antal
- dicKost(dato) = dicKost(dato) + kost
- Else
- MsgBox Prompt:="Fann ikkje datoen i celle " & c.Address(external:=True) & " i ordlista. Kontroller at riktig dato er lagt inn.", _
- Title:="Ugyldig dato", Buttons:=vbExclamation
- End If
- End If
- End If
- Next c
- Else
- MsgBox Prompt:="Finn ikkje eit ark ved navn " & CStr(i) & " i Excel-fila " & hentfraWB.FullName & ".", _
- Title:="Finn ikkje ark", Buttons:=vbExclamation
- End If
- Next i
- ' Skriv til rådata-ark
- Set ws = skrivtilWB.Worksheets(Rådata.Name)
- Set skrivTilTabell = ws.ListObjects(1)
- Set r = ws.Range("A4").Resize(materialNrAntal.Count, 1)
- r = Application.WorksheetFunction.Transpose(materialNrAntal.Keys)
- For Each c In r
- If materialnamn.Exists(CLng(c)) Then
- Debug.Print c.Offset(0, 1).Address(external:=True) & " = " & materialnamn(c)
- c.Offset(0, 1) = materialnamn(c)
- End If
- Next c
- For Each v1 In materialnamn
- Debug.Print v1 & " - " & materialnamn.Exists(v1) & " - " & materialnamn(v1)
- Next v1
- ' Ytre loop over materialnr
- i = 0
- For Each v1 In materialNrAntal
- Set dicAntal = materialNrAntal(v1)
- Set dicKost = materialNrKost(v1)
- j = 2
- For Each v2 In dicKost
- 'Debug.Print v2 & " - " & r.Offset(i, j).Address
- r.Offset(i, j) = dicKost(v2)
- r.Offset(i, j + 12) = dicAntal(v2)
- j = j + 1
- Next v2
- i = i + 1
- Next v1
- End Sub
- Sub Test()
- Dim wb1 As Workbook, wb2 As Workbook
- Dim StartTime As Double
- StartTime = Timer
- Debug.Print "Start"
- Call deaktiver
- Set wb1 = ThisWorkbook
- Set wb2 = Application.Workbooks("Lagerforbruk Årdal.xlsx")
- Call finnForSisteÅr(wb1, wb2)
- Call reaktiver
- Debug.Print "Slutt"
- Debug.Print "Sekunder: " & Round(Timer - StartTime, 2)
- End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement