Kopiera data från andra arbetsböcker

Nedan visas hur man kan kopiera data från andra arbetsböcker. En förutsättning är att man måste öppna de arbetsböcker man vill hämta data ifrån, vilket exemplet demonstrerar på ett tydligt sätt.

Exemplet visar också på två tekniker för att läsa in data till matriser (arrayer), dynamisk och statiskt samt hur man loopar igenom dessa på ett effektivt sätt.
 

Option Explicit
Option Base 1


Sub Kopiera_Data_Arbetsbocker()
Dim stFil As String, stSokvag As String, _
stFiltyp As String, stFilArray() As String
Dim vaDataArray As Variant
Dim wsDataRange As Worksheet
Dim i As Integer, x As Integer

'
För att slippa att skärmen "fladdrar" när procedurerna körs.
Application.ScreenUpdating = False

'Hämta in sökvägen till önskad mapp från användare.
stSokvag = Application.InputBox _
("Ange sökvägen till önskad mapp (t ex c:\test\)", "Sökväg")

'Felhantering av stSökväg.
If dir(stSokvag) = "" Then
    MsgBox "Kan inte hitta " & stSokvag & "!", vbCritical
    Exit Sub
End If

'Här bestäms vilken filtyp som ska läsas in - filfiltrering

stFiltyp = "*.xls"

'Då vi inte vet på förhand antal filnamn i mappen måste arrayen
'dimensioneras om - dynamisk array, vilket sker mha "Redim".
'För att spara tidigare inlästa filnamn måste "Preserve" anges.
stFil = dir(stSokvag & stFiltyp )
Do Until stFil = ""
        i = i + 1
        ReDim Preserve stFilArray(i)
        stFilArray(i) = stFil
        stFil = dir
Loop

'Anrop  av procedur för att skapa en ny arbetsbok med resultatet
Call Skapa_Ny_Arbetsbok()

'Tilldela variabeln wsDataRange värde
Set wsDataRange = Workbooks("Kunder" & " " _
                                 &Date).Sheets("Data")

'Fyller arrayen med konstanta värden - en mer generell lösning är
'att mha input-box hämta cellområdena från användare.

vaDataArray = Array("C5", "C9:C13", "C24:C28")

'1. Loopar lika många gånger som det finns filnamn för mha '"UBound".
'2. Öppnar XL-fil(x).
'3. Kopierar enbart värden, vilket sker här 3 gånger (=antal 'cellområden)
'4. Till cellreferens (x,i) i den nya arbetsboken.
'5. Stänger källarbetsbok utan att spara.

For x = 1 To UBound(stFilArray) 
    Workbooks.Open (stSokvag & stFilArray(x))
        For i = 1 To 3
            Worksheets("Blad1").Range(vaDataArray(i)).Copy
            wsDataRange.Cells(x, i).PasteSpecial Paste:=xlValues
        Next i
    Workbooks(stFilArray(x)).Close Savechanges:=False
Next x

Application.ScreenUpdating = True


End Sub


Sub Skapa_Ny_Arbetsbok()

Dim wbNew As Workbook
Set wbNew = Workbooks.Add

'Skapar en ny arbetsbok med namnet "Kunder +  åååå-mm-dd", 
't ex "Kunder 2000-08-05". Den nya arbetsboken sparas i den
' aktiva mappen.
wbNew.SaveAs Filename:="Kunder" & " " & Date

With ActiveSheet
    .Name = "Data"
    .Activate
End With


End Sub