Advertisement
Guest User

Untitled

a guest
May 11th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit
  2.  
  3. Sub finnForSisteÅr(skrivtilWB As Workbook, hentfraWB As Workbook)
  4.     Dim ws As Worksheet
  5.     Dim materialNrKost As Dictionary, materialNrAntal As Dictionary, materialnamn As Dictionary
  6.     Dim dicAntal As Dictionary, dicKost As Dictionary
  7.     Dim c As Range, r As Range
  8.     Dim gjeldandeNr As Long, gjeldandeDato As Long, i As Long, j As Long
  9.     Dim startmåned As Long, startår As Long, sluttmåned As Long, sluttår As Long
  10.     Dim antal As Long, kost As Long
  11.     Dim dato As Date
  12.     Dim s As String
  13.     Dim v1 As Variant, v2 As Variant, vArr1 As Variant, vArr2 As Variant
  14.     Dim skrivTilTabell As ListObject
  15.    
  16.     Set materialnamn = New Dictionary
  17.     ' Lista over materialnr me skal hente ut data for
  18.    Set materialNrAntal = New Dictionary: Set materialNrKost = New Dictionary
  19.     Set r = skrivtilWB.Worksheets(Innstillinger.Name).ListObjects(1).ListColumns(1).DataBodyRange
  20.     For Each c In r
  21.         If IsNumeric(c) Then
  22.             If Not materialNrAntal.Exists(CLng(c)) Then
  23.                 Set dicAntal = New Dictionary
  24.                 materialNrAntal.Add Key:=CLng(c), Item:=dicAntal
  25.                 Set dicKost = New Dictionary
  26.                 materialNrKost.Add Key:=CLng(c), Item:=dicKost
  27.             End If
  28.         End If
  29.     Next c
  30.    
  31.     ' Startverdiar
  32.    startmåned = month(Date)
  33.     sluttmåned = month(Date) - 1
  34.     startår = year(Date) - 1
  35.     sluttår = year(Date)
  36.     If sluttmåned = 0 Then
  37.         sluttmåned = 12
  38.         sluttår = sluttår - 1
  39.     End If
  40.    
  41.     ' Skriv datoar til rådataark og initialiser ordbøker
  42.    Set ws = skrivtilWB.Worksheets(Rådata.Name)
  43.     Set c = ws.Range("C2")
  44.     For i = 0 To 11
  45.         dato = DateSerial(startår, startmåned + i, 1)
  46.         c.Offset(0, i) = dato
  47.         c.Offset(0, i).NumberFormat = "mm. yyyy"
  48.         c.Offset(0, 12 + i) = dato
  49.         c.Offset(0, 12 + i).NumberFormat = "mm. yyyy"
  50.         For Each v1 In materialNrAntal
  51.             Set dicAntal = materialNrAntal(v1)
  52.             dicAntal.Add Key:=dato, Item:=0
  53.             Set dicKost = materialNrKost(v1)
  54.             dicKost.Add Key:=dato, Item:=0
  55.         Next v1
  56.     Next i
  57.    
  58.     ' Hent data fra lagra SAP-data
  59.    For i = startår To sluttår
  60.         If SheetExists(CStr(i), hentfraWB) Then
  61.             ' Kolonne A i arket me henter data fra
  62.            Set ws = hentfraWB.Worksheets(CStr(i))
  63.             Set r = ws.Range(ws.Range("A2"), ws.Range("A" & ws.Rows.Count).End(xlUp))
  64.             ' Søk på kvart av materialnummera me skal finne
  65.            For Each c In r
  66.                 ' Sorter ut materialnummeret fra teksten i kolonne A
  67.                s = Trim(Left(c, InStr(1, c, " ", vbBinaryCompare)))
  68.                 If Len(s) = 0 Then
  69.                     s = 0
  70.                 End If
  71.                 gjeldandeNr = CLng(s)
  72.                 ' Samanlikn med materialnummera me søker ettter
  73.                If materialNrAntal.Exists(gjeldandeNr) Then
  74.                     dato = CDate(c.Offset(0, 2))
  75.                     If Not materialnamn.Exists(gjeldandeNr) Then
  76.                         ' Sorter ut materialnamn frå teksten
  77.                        s = Trim(Replace(c, gjeldandeNr, "", 1, -1, vbBinaryCompare))
  78.                         materialnamn.Add Key:=gjeldandeNr, Item:=s
  79.                     End If
  80.                     If dato >= DateSerial(startår, startmåned, 1) And dato <= DateSerial(sluttår, sluttmåned, (days_in_month(sluttmåned, sluttår))) Then
  81.                         antal = CLng(c.Offset(0, 3))
  82.                         kost = CLng(c.Offset(0, 5))
  83.                         Set dicAntal = materialNrAntal(gjeldandeNr)
  84.                         Set dicKost = materialNrKost(gjeldandeNr)
  85.                         If dicAntal.Exists(dato) Then
  86.                             dicAntal(dato) = dicAntal(dato) + antal
  87.                             dicKost(dato) = dicKost(dato) + kost
  88.                         Else
  89.                             MsgBox Prompt:="Fann ikkje datoen i celle " & c.Address(external:=True) & " i ordlista. Kontroller at riktig dato er lagt inn.", _
  90.                                    Title:="Ugyldig dato", Buttons:=vbExclamation
  91.                         End If
  92.                     End If
  93.                 End If
  94.             Next c
  95.         Else
  96.             MsgBox Prompt:="Finn ikkje eit ark ved navn " & CStr(i) & " i Excel-fila " & hentfraWB.FullName & ".", _
  97.                    Title:="Finn ikkje ark", Buttons:=vbExclamation
  98.         End If
  99.     Next i
  100.    
  101.     ' Skriv til rådata-ark
  102.    Set ws = skrivtilWB.Worksheets(Rådata.Name)
  103.     Set skrivTilTabell = ws.ListObjects(1)
  104.     Set r = ws.Range("A4").Resize(materialNrAntal.Count, 1)
  105.     r = Application.WorksheetFunction.Transpose(materialNrAntal.Keys)
  106.     For Each c In r
  107.         If materialnamn.Exists(CLng(c)) Then
  108.             Debug.Print c.Offset(0, 1).Address(external:=True) & " = " & materialnamn(c)
  109.             c.Offset(0, 1) = materialnamn(c)
  110.         End If
  111.     Next c
  112.     For Each v1 In materialnamn
  113.         Debug.Print v1 & " - " & materialnamn.Exists(v1) & " - " & materialnamn(v1)
  114.     Next v1
  115.     ' Ytre loop over materialnr
  116.    i = 0
  117.     For Each v1 In materialNrAntal
  118.         Set dicAntal = materialNrAntal(v1)
  119.         Set dicKost = materialNrKost(v1)
  120.         j = 2
  121.         For Each v2 In dicKost
  122.             'Debug.Print v2 & " - " & r.Offset(i, j).Address
  123.            r.Offset(i, j) = dicKost(v2)
  124.             r.Offset(i, j + 12) = dicAntal(v2)
  125.             j = j + 1
  126.         Next v2
  127.         i = i + 1
  128.     Next v1
  129.    
  130. End Sub
  131. Sub Test()
  132.     Dim wb1 As Workbook, wb2 As Workbook
  133.     Dim StartTime As Double
  134.    
  135.     StartTime = Timer
  136.     Debug.Print "Start"
  137.    
  138.     Call deaktiver
  139.     Set wb1 = ThisWorkbook
  140.     Set wb2 = Application.Workbooks("Lagerforbruk Årdal.xlsx")
  141.    
  142.     Call finnForSisteÅr(wb1, wb2)
  143.     Call reaktiver
  144.    
  145.     Debug.Print "Slutt"
  146.     Debug.Print "Sekunder: " & Round(Timer - StartTime, 2)
  147. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement