webForumDet fria alternativet

Excel: Kopiera innehåll från en fil till en annan med makro?

4 svar · 2 308 visningar · startad av Masten

MastenMedlem sedan feb. 20079 inlägg
#1

Hej!

För att göra en lång historia kort: Jag och en klasskompis håller på med ett projektarbete där vi ska göra en modell för planering och leveranser på ett företag i Excel. Det jag skulle vilja ha är en knapp i ett Excel-ark som man kan trycka på och då få upp ett "bläddra"-fönster där man letar upp filen man vill importera. Det är endast det blad som öppnas först i detta Excel-ark som jag vill ha in på ett specifikt blad i mitt gamla Excel-ark. En kompis på KTH har skrivit följande makro:

Sub ImportFirstSheet() 
    Dim dialog As FileDialog 
    Set dialog = Application.FileDialog(msoFileDialogFilePicker) 
    
    Application.ScreenUpdating = False 
    
    With dialog 
        'Inställningar för dialogrutan 
        .AllowMultiSelect = False 
        .Title = "Välj fil att importera" 
        .Filters.Clear 
        .Filters.Add "Excel-filer", "*.xls" 
        .FilterIndex = 1 
        
        'Visa dialogrutan 
        .Show 
        
        Dim i As Integer 
        If .SelectedItems.Count > 0 Then 
            Dim importFile As Workbook 
            Dim firstSheet As Worksheet 
            
            'Öppna filen som ska importeras 
            Set importFile = Workbooks.Open(.SelectedItems.Item(1)) 
            
            'Välj ut första bladet i den importerade filen 
            Set firstSheet = importFile.Worksheets(1) 
            
            'Kopiera första bladet i den valda filen och lägg kopian först i den arbetsboken som det här makrot ligger i 
            firstSheet.Copy ThisWorkbook.Worksheets(1) 
            
            'Stäng import-filen 
            importFile.Close 
        End If 
    End With 
    
    Application.ScreenUpdating = True 
    
End Sub

Det detta gör är att lägga in det kopierade bladet som ett nytt blad i mitt Excel-ark, men jag vill ha det i ett befintligt som heter Leveransplan.
Det blad som ska kopieras in får företaget vi gör projektet åt mailat till sig en gång om dagen, och innehållet varierar - ibland är vissa artiklar med, ibland andra. Namnet på bladet varierar också, liksom filnamnet (fråga mig inte varför! ). Att just filnamnet varierar gör ju tyvärr att all form av länkning tyvärr är utesluten.
Så, allt innehåll i det befintliga bladet "Leveransplan" ska bytas ut mot allt innehåll från det blad som kommer på mailen en gång om dagen.
Om man gör ett makro som tar bort "Leveransplan", kopierar det nya bladet och byter namn på detta, så kommer det bli referensfel i alla celler som hämtar data från "Leveransplan".

Kan någon hjälpa mig? Tusen tack på förhand! :bire

solbulleMedlem sedan mars 20015 287 inlägg
#2

Lite snabbt fulhack, men jag tycker det borde fungera.
Som alltid finns det säkerligen bättre lösningar.

Sub CopyFirstSheet()
    Dim dialog As FileDialog
    Set dialog = Application.FileDialog(msoFileDialogFilePicker)
    
    Application.ScreenUpdating = False
    
    With dialog
        'Inställningar för dialogrutan
        .AllowMultiSelect = False
        .Title = "Välj fil att importera"
        .Filters.Clear
        .Filters.Add "Excel-filer", "*.xls"
        .FilterIndex = 1
        
        'Visa dialogrutan
        .Show
        
        Dim i As Integer
        If .SelectedItems.Count > 0 Then
            Dim importFile As Workbook
            Dim firstSheet As Worksheet
            Dim startSheet As Worksheet
            
            'Utgångsläget
            Set startSheet = ActiveSheet
            
            'Öppna filen som ska importeras
            Set importFile = Workbooks.Open(.SelectedItems.Item(1))
            
            'Välj ut första bladet i den importerade filen
            Set firstSheet = importFile.Worksheets(1)
            
            'Kopiera alla celler i första bladet i den valda filen
            firstSheet.Range("A1:IV65536").Copy
            
            'Aktivera andra arbetsboken med detta makro i
            ThisWorkbook.Activate
            
            'Aktivera första arket
            'Här kan du namnge ditt blad om du visste namnet på det.
            'ThisWorkbook.Sheets("Leveransplan").Select
            ThisWorkbook.Sheets(1).Select
            
            'Aktivera cell A1
            ActiveSheet.Range("A1").Select
            
            'Klistra in alla data
            ActiveSheet.Paste
            
            'Töm urklippet
            Application.CutCopyMode = False
            
            'Aktivera utgångsarket
            startSheet.Activate
            
            'Stäng import-filen
            importFile.Close
        End If
    End With
    
    Application.ScreenUpdating = True
    
End Sub
MindreVetandeMedlem sedan okt. 2005371 inlägg
#3

Jag tycker om meningslösa förkortningar, och det här är. Tja samma sak som Solbulles, fast marginellt kortare... :e

Sub ImportFirstSheet()
Dim ImporteraFilnamn As Variant

Application.ScreenUpdating = False

' Använder "GetOpenFilename" istället. Den blir kompaktare
   ImporteraFilnamn = Application.GetOpenFilename( _
    "Excel-filer, *.xls", Title:="Välj fil att importera", MultiSelect:=False)

' Fångar upp cancle/avbryt. Då avslutas makrot
    If ImporteraFilnamn = False Then Exit Sub
            
' samma som tidigare, fast med sträng istället 
   Dim importFile As Workbook
    Dim firstSheet As Worksheet
    
    'Öppna filen som ska importeras
    Set importFile = Workbooks.Open(Filename:=CStr(ImporteraFilnamn))
    
    'Välj ut första bladet i den importerade filen
    Set firstSheet = importFile.Worksheets(1)
    
'Kopiera och klistra in i ett steg :-)
    firstSheet.Cells.Copy (ThisWorkbook.Worksheets("Leveransplan").Cells)

    'Stäng import-filen
    importFile.Close
        

    
    Application.ScreenUpdating = True
    
End Sub

Rackarns. Missade Solbulles klippbordstömning, men det kan du sno från Lussekattens kod

MastenMedlem sedan feb. 20079 inlägg
#4

Tack för er hjälp! :)

Det finns ett litet fel med det hela dock som jag inte upptäckte tidigare, nämligen att det inte är det första bladet (Worksheets(1)) som ska kopieras, utan det blad som är aktivt när man öppnar filen vars innehåll ska kopieras. Hur skriver man om koden för det?

MindreVetandeMedlem sedan okt. 2005371 inlägg
#5

Borde räcka att ändra:
Set firstSheet = importFile.Worksheets(1)
till
Set firstSheet = importFile.ActiveSheet
Testa och se

137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)