Just nu i M3-nätverket
Gå till innehåll

Hämta bestämt område från stängda arbetsböcker till arbetsbok


majjsan2010

Rekommendera Poster

Hej!

 

Jag har ett delikat problem som jag skulle behöva hjälp med.

 

En gång i månaden får jag in ca 50 filer = workbooks där ett specifikt område ska aggregeras in i en workbook där själva analysen ska genomföras. De 50 filerna har samma struktur på namnet, där endast månaden ändras för var månad. Detta resulterar då i att jag har 50 gånger 12 olika filer under ett år som ska hittas i en mapp, och data ska aggregeras upp i samma workbook som heter OUTPUT.

 

Jag har lyckats att skriva att makro som öppnar en stängd arbetsbok INPUT, letar reda på sista raden, kopierar önskat område och klistrar in det i aggregerings workbook OUTPUT, sparar och stänger arbetsbok INPUT.

 

Så, min fråga är, kan man göra detta på ett effektivare sätt om man har många filer som ska öppnas varje gång. Eller är enda möjligheten att copypaste in all data varje månad arbetsboken OUTPUT.

 

Bifogar min kod som lyckats, ni får ha överseende med koden, har bara 1 veckas erfarenhet av VBA...

 

tacksam för hjälp!

 

ha en fin dag!

 

majjsan2010

 

kod

Sub EndPeriod()

Dim NumRowsIN As Integer 'antal rader i INPUT 

Dim NumRowsOUT As Integer 'antal rader i output

Dim ActIN As String 'aktuell INPUT
Dim ActOUT As String 'aktuell OUTPUT

ActOUT = ActiveWorkbook.Name

NumRowsOUT = WorksheetFunction.CountA(Sheets("Database entity").Range("A7:A65000"))

Workbooks.Open Filename:="sökväg INPUT.xls" 
'Det är här som jag skulle vilja kunna söka på alla arbetsböcker för period och inte en och en
'Öppnar arbetsboken INPUT

ActIN = ActiveWorkbook.Name

NumRowsIN = WorksheetFunction.CountA(Sheets("Reporting template").Range("A23:A301"))

'Windows(ActIN).Activate
With Worksheets("Reporting template")

With Worksheets("Reporting template")
If NumRowsIN > "0" Then

		.Range(.Cells(24, 1), .Cells(22 + NumRowsIN, 40)).Copy
End If
End With

Windows(ActOUT).Activate
With Worksheets("Database entity")


.Cells(7 + NumRowsOUT, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
	:=False, Transpose:=False

End With

osv....


End Sub 

Länk till kommentar
Dela på andra webbplatser

Tack för förslagetm men jag har redan varit inne på xldennis och har tittat på koden. Men det som jag behöver är en funktion som går in i en specifik mapp och går igenom alla arbestböcker och blad och hämtar data som jag vill ha. Håller på med en sådan kod just nu, återkommer om jag hittar en lösning.

 

Men om du har andra förslag så tas de gärna emot:)

Länk till kommentar
Dela på andra webbplatser

finns även exempel med filhantering på hans sidor.

http://xldennis.se/filmappar%28vba%29.htm

 

Är osäker på exakt vad du vill ha, är svårt att svara på generella frågor så att säga...

 

Länken i tidigare inlägg visar alltså hur du kan accessa data i en bok utan att öppna den. Att öppna massa böcker tar givetvis tid.

 

Vill du kopiera in data till en bok finns det tre sätt

1: Öppna boken, leta reda på området och kopiera

2: Skippa att öppna boken, accessa en stängd bok och vet vad du ska kopiera

3: Ha formler i din bok som plockar data ur annan bok men enbart applicerbart om enstaka bok, sedan omständligt.

Länk till kommentar
Dela på andra webbplatser

Hej,

 

Prova att stega dig igenom och pussla ihop den här koden med din.

Den tar första filen (i detta fallet med filändelsen .csv) och kopierar enligt din kod. när det är klart så ska vi flytta aktiv fil till en arkivmapp innan vi tar fil 2, osv. På detta sättet slipper du ta hänsyn till filnamnet i foldern.

 

Behöver du kolla filnamn så får du köra en case select på 50 poster.

jag skulle kunna gissa att filnamn är bolagsnummer eller avdelningsnummer & filnamn & datum? alla 50 filer heter väl knappast samma sak? återkom gärna med exempel på filnamn här.

 

 

din sub()
On Error GoTo FileCopyError

   sSourceDir = "\\dinsökväg till dom 50 INPUT\"
   sBackDir = "\\sökväg för arkivering\"
   sNewDir = "\\sökväg till OUTPUT\"
   sUtfil = "filnamn på OUTPUT"
   sNextFile = Dir$(sSourceDir & "*.csv") 'filändelse xls eller csv?

   If sNextFile = "" Then  'om ingen fil hittas
       MsgBox "Ingen mer fil hittades"
       Shell "explorer.exe """ & sSourceDir & "", vbNormalFocus
       Exit Sub
   End If

   Workbooks.Open Filename:="sSourcedir\" & filnamn & ".CSV" ' kolla filändelsen igen
    While sNextFile <> ""

   ' här stoppar du in din copy kod
'"Jag har lyckats att skriva att makro som öppnar en stängd arbetsbok INPUT, letar _ reda på sista raden, kopierar önskat område och klistrar in det i aggregerings _ workbook OUTPUT, sparar och stänger arbetsbok INPUT. "

'flytta den filen vi är klara med
    FileCopy sSourceDir & sNextFile, sBackDir & sNextFile
   'gå till nästa fil
    sNextFile = Dir$
Wend

   MsgBox "Klart!"
Exit Sub

FileCopyError:     MsgBox "Det var ett problem att köra makrot"
End

End Sub


Länk till kommentar
Dela på andra webbplatser

tack för hjälpen, ska prova denna kod. Har tänkt på en liknande lösning, ska bli spännande att se om det fungerar:)

 

 

/majjsan

 

 

Länk till kommentar
Dela på andra webbplatser

  • 2 veckor senare...
majjsan2010

Hej ZebulonM!

 

Tack för hjälpen med koden! Jag stöter dock på lite probelm med

Workbooks.Open Filename:="sSourceDir.... då jag stegar igenom makrot stannar den på "filnamn". Vad ska stå i filnamn och behöver jag def det?

 

Fråga två, jag har xls och inte cvc, spelar det någon roll ang koden, kan jag bara ändra denna till xls?

 

Uppskattar verkligen om du har möjlighet att hjälpa mig:)

 

/Majjsan

Länk till kommentar
Dela på andra webbplatser

Du behöver hela sökvägen till filen.

 

fast det borde stå

Workbooks.Open Filename:=sSourcedir & "\" & filnamn & ".xls"

om nu inte sSourcedir innehåller \ och inte filnamnet innehåller ändelsen redan dvs. Resultatet av sSourcedir & "\" & filnamn & ".xls" ska alltså vara i stil med "d:\Filer\MinFil.xls".

Du kan med fördel skapa hela sökvägen innan anropet, den blir då enklare att kontrollera:

strPath = sSourcedir & "\" & filnamn & ".xls" 

Länk till kommentar
Dela på andra webbplatser

Hejsan,

Vilket nb fel, jag har skrivit fel i koden (började med vba i december).

Vi ville ju slippa ta hänsyn till filnamn. Ta bort filnamn alltså.

Nu öppnar vi hela filen i Excel för att kopiera, men gör det under testfasen så du ser i vilken ordning saker händer när du stegar igenom. Din kod gör väl inte det om jag minns rätt?

Hur som helst så efter detta vill du köra din kopieringskod.

När du vet att allt funkar kan du stänga av screenupdating och köra från stängda böcker istället.

 


    Workbooks.Open Filename:=sSourceDir & sNextFile

 

och visst ska du ändra alla ändelser till den som passar, i detta fallet xls.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...