macro -copiere date din mai multe fisiere

Informatii despre cum se utilizeaza Microsoft Excel 2003. Calcule, Formule, Functii, Tabele pivot, Analiza datelor, etc
florinsrb
Mesaje: 18
Membru din: Mar Mar 27, 2012 11:36 am

macro -copiere date din mai multe fisiere

Mesaj de florinsrb » Vin Apr 20, 2012 4:02 pm

Cum as putea sa copiez intr-o foaie(intr-un fel de centralizator), date din mai multe celule din mai multe fisiere care au nume diferite!??
Daca s-ar putea sa fie total automat , ar fi ideal, dar nu vad cum.
M-am gandit la ceva de genul:
- deschid fisierul in care vreau sa centralizez datele
- am un buton, sa zicem "Import"
- se deschide fereastra explorer de unde aleg fisierul sursa
- dupa ce selectez numele fisierului sursa, se deschide un InputBox unde trebuie sa introduc randul destinatie
- aleg randul destinatie -> se completeaza automat in InputBox coordonatele randului unde vreau sa aduc datele
- click ok in Inputbox
.................................
Precizez ca fisierele sursa sunt deja create de altcineva si eu trebuie sa extrag date din acestea, respectiv ma intereseaza
datele din anumite celule din fisierele sursa.

Ms pentru orice sugestii

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: macro -copiere date din mai multe fisiere

Mesaj de Dr.Windows » Vin Apr 20, 2012 9:15 pm

Vezi in prima faza daca te poti "inspira" de aici: Re: unire foi calcul

florinsrb
Mesaje: 18
Membru din: Mar Mar 27, 2012 11:36 am

Re: macro -copiere date din mai multe fisiere

Mesaj de florinsrb » Dum Apr 22, 2012 11:56 pm

Multumesc pentru raspuns
Este foarte util exemplul, dar sunt incepator in VBA si as dori foarte mult sa stiu
cum s-ar putea ca centralizarea datelor sa se faca din TOATE fisierele gasite intr-un folder (fara nici o conditie legata de nume sau altceva) .
De asemenea, datele din fisierele sursa sunt in celule care sunt asezate pe diferite randuri si coloane, iar in sheet-ul centralizator ar
trebui sa fie asezate pe randuri (setul de date dintr-un fisier sursa = un rand )

florinsrb
Mesaje: 18
Membru din: Mar Mar 27, 2012 11:36 am

Re: macro -copiere date din mai multe fisiere

Mesaj de florinsrb » Lun Apr 23, 2012 10:42 am

O precizare foarte importanta: datele din fisierele sursa sunt structurate identic. Este vorba despre un fel de fisa de produs ceva mai complexa

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: macro -copiere date din mai multe fisiere

Mesaj de Dr.Windows » Lun Apr 23, 2012 9:21 pm

Pai nu ai decat 2 variante:

1. Te apuci usor-usor de VBA cat sa intelegi ce se intampla in subiectul recomandat care ti se aplica mai putin faptul ca acolo se cauta un anumit nume de fisier.

2. Atasezi o mostra exact pe modelul tau si in limita timpului disponibil poate cineva iti va face codul potrivit numai pentru situatia ta.

Oricum avand in vedere ca vrei TOATE fisierele dintr-un folder nu inteleg de ce mai trebuie sa te intrebe ce fisier vrei dupa ce l-ai importat pe primul si de ce mai trebuie sa selectezi randul unde trebuie sa le puna atata timp cat trebuie sa fie in continuarea celuilalt...

florinsrb
Mesaje: 18
Membru din: Mar Mar 27, 2012 11:36 am

Re: macro -copiere date din mai multe fisiere

Mesaj de florinsrb » Mie Apr 25, 2012 8:19 am

Am optat pentru varianta acestui forum datorita nevoii urgente de a gasi o solutie la problema descrisa.
Am mai lucrat cu VBA in access, si stiu foarte bine ca nu se invata de pe o zi pe alta.

Am realizat cat de cat ce mi-am propus, dar , ma repet, o solutie de copiere automata din toate fisierele gasite intr-un folder
ar fi ideala. Dupa cum se poate observa, informatia din anumite celule din fisierul sursa trebuie copiata si organizata pe randuri in
foaia centralizatoare. Iata codul:

Cod: Selectaţi tot

Sub import()
Dim Fname As Variant
Dim WB As Workbook
Dim Rw As Integer

ChDrive "c:\" 
ChDir "c:\path..." 
Rw = Application.InputBox("Selectati randul unde se vor exporta datele", Type:=8).Row

Fname = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
If Fname = False Then
 Exit Sub  
End If

Set WB = Workbooks.Open(filename:=Fname)

WB.Worksheets("Fisa").Range("D7").Copy _
Destination:=ThisWorkbook.Worksheets("Foaie1").Range("B" & Rw)
 
WB.Worksheets("Fisa").Range("D8").Copy _
Destination:=ThisWorkbook.Worksheets("Foaie1").Range("C" & Rw) 

WB.Worksheets("Fisa").Range("D12").Copy _
Destination:=ThisWorkbook.Worksheets("Foaie1").Range("G" & Rw) 

WB.Close SaveChanges:=False

End Sub
Multumesc pentru timpul acordat

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: macro -copiere date din mai multe fisiere

Mesaj de Dr.Windows » Mie Apr 25, 2012 10:29 am

Vezi exemplul atasat:

- Fisierul "principal" - ColectareSimpla.xls este cel unde se vor aduna datele - in foaia COLECTARE (poate fi oriunde pe disc)
- In Subfolder sunt 2 fisiere - pot fi oricate ideea este sa NU fie in acelasi folder cu fisierul principal

La lansarea procesului de "colectare" iti va cere doar folderul de unde vrei sa selectezi fisierele si va "varsa" datele mai putin capul de tabel care am presupus ca este pe linia 1 fara sa te mai intrebe pe ce rand... ci le va pune pe primul rand disponibil astfel ca datele vor veni in continuarea fisierului importat anterior.

Functia "principala" este Start_Collect care va folosi o functie GetFileList (aici nu ai nimic de modificat pentru ca doar intoarce un array cu numele fisierelor gasite in folderul trimis ca parametru) pe care o poti ignora, iar o a 3-a functie face copierea efectiva - LK_Collector.

Se poate spune ca este o varianta "light" a exemplului indicat de mine anterior.

Cred ca singurele modificari sau "customizari" necesare in cazul tau ar fi doar in:

1. Procedura Start_Collect() - in linia

Cod: Selectaţi tot

lcFile = "*.xls"

...daca vrei sa incluzi alt tip de fisiere - de ex. "*.xls?"

2. Functia LK_Collector in linia

Cod: Selectaţi tot

SrcWs.Range("A2:C" & nSrcLastRow).Copy Destination:=TgtWs.Range("A" & nTgtLastRow + 1)
... daca vrei sa modifici range-ul sursa cu o alta celula de start [SrcWs.Range("A2:] si coloana destinatiei de lipit [TgtWs.Range("A"].

Sper sa-ti fie de folos.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

florinsrb
Mesaje: 18
Membru din: Mar Mar 27, 2012 11:36 am

Re: macro -copiere date din mai multe fisiere

Mesaj de florinsrb » Mie Apr 25, 2012 12:27 pm

Multumesc pentru promtitudine si efort !
Exemplul tau functioneaza ireprosabil.

Am schimbat denumirea constantei cu denumirea foilor mele sursa :
Const lcImpSheet = "Fisa"
si am schimbat sursa (nu este un camp, sunt celule puse aleator in foaie), si am scris asa:

SrcWs.Range("d7").Copy Destination:=TgtWs.Range("B" & nTgtLastRow + 1)
SrcWs.Range("d10").Copy Destination:=TgtWs.Range("C" & nTgtLastRow + 1)
samd...
Problema este ca scrie in colector un singur rand, cu toate ca stiu ca deschide toate fisierele sursa.
Care sa fie problema?
De asemenea, precizez:
- foile sursa sunt protejate. Sa fie un impediment?
- in celulele sursa sunt formule. Cum as putea sa copiez doar valorile?
- foile sursa sunt legate cu alte foi din fisiere de unde culeg date. Ce se poate face in VBA ca, la copierea de
date din aceste foi, sa nu mai apara mesajul acela de actualizare a legaturilor?

Merci inca odata pentru suport.

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: macro -copiere date din mai multe fisiere

Mesaj de Dr.Windows » Mie Apr 25, 2012 2:01 pm

Exact pentru motivul asta cerusem o "mostra" exact pe modelul tau... ca sa nu mai ai si alte surprize (mai ales ca ziceai ca ai nevoie de un raspuns rapid).

Problema poate fi si din cauza faptului ca foaia este protejata - daca nu poti sa faci operatiunile "manual" (cu foaia protejata) inseamna ca nici acel macro nu va putea sa o faca.

Pentru partea de copiere doar valori va trebui sa inlocuiesti linia

Cod: Selectaţi tot

SrcWs.Range("A3").Copy Destination:=TgtWs.Range("A" & nTgtLastRow + 1)
cu ceva mai "complex":

Cod: Selectaţi tot

    SrcWs.Range("A3").Select
    Selection.Copy
    TgtWs.Activate
    TgtWs.Range("A" & nTgtLastRow + 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues
Iar pentru actualizarea automata a legaturilor ar trebui sa modifici linia care deschide fisierele cu:

Cod: Selectaţi tot

Set SrcWbk = Workbooks.Open(FileName:=SrcFolder & "\" & SrcName, ReadOnly:=True, UpdateLinks:=xlUpdateLinksAlways)
Daca mai ai si alte probleme atasaza te rog 3 fisiere dupa modelul facut anterior de mine (un colector si 2 fisiere de importat) ca sa putem lucra pe un exemplu concret.

florinsrb
Mesaje: 18
Membru din: Mar Mar 27, 2012 11:36 am

Re: macro -copiere date din mai multe fisiere

Mesaj de florinsrb » Mar Mai 01, 2012 11:08 pm

In primul rand multumesc pentru raspuns !

Chiar daca raspusnsul meu vine mai tarziu, nu inseamna ca problema nu este de actualitate. Intre timp au aparut urgentele urgentelor care au avut prioritate. :D
Gasesti mai jos o arhiva cu fisiere excel unde am incercat sa surprind cat mai fidel situatia mea.
Dupa cum observi, in foaia colector se scrie un singur rand cu datele dintr-un singur fisier, nu se trece la un alt rand (cu toate ca se trece la un alt fisier sursa).
Foile sursa sunt protejate, iar parola este "123".
Referitor la actualizarea automata a datelor, ideal ar fi sa nu mai apara fereasta aceea de atentionare ca fisierul contine legaturi. De asemenea, precizez ca nu
trebuie facuta actualizarea datelor.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Închis

Înapoi la “Intrebari despre Excel 2003”