MastenMedlem sedan feb. 20079 inlägg 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 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
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 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?
Borde räcka att ändra:
Set firstSheet = importFile.Worksheets(1)
till
Set firstSheet = importFile.ActiveSheet
Testa och se