![]() |
Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Cod VBA Excel - copiere informatii in workbook
Last Updated: Oct 05 2010 20:15, Started by
sandra_m
, Oct 01 2010 14:37
·
0

#1
Posted 01 October 2010 - 14:37

Buna ziua,
Ma poate ajuta cineva cu un cod VBA care sa rezolve urmatoarea problema? Am un workbook cu mai multe pagini (denumite "client 1", "client 2", etc). Fiecare pagina contine 9 coloane cu informatii (A - I). As avea nevoie de un cod care sa imi copieze pe prima pagina a workbook-ului (denumita "scadente") informatii din toate celelalte pagini astfel: vreau sa imi apara in prima coloana numele paginii din care s-a copiat informatia + randurile din toate celelalte pagini care contin in coloana i “factura scadenta”. Exemplu: daca in pagina denumita “client 3” am pe randul 4 in coloana i “factura scadenta” vreau ca pe prima pagina (“scadente”) sa apara: in col. A: client 3 in col. B: informatia din col. A, randul 4 din pagina denumita “client 3” in col C: informatia din col. B, randul 4 din pagina denumita “client 3” etc. ...in col. J: informatia din col. I, randul 4 din pagina denumita “client 3” Multumesc Alexandra |
#2
Posted 02 October 2010 - 11:35

Ce vrei tu se poate face si fara vba, sau cu o singura linie de cod vba. Se pot uni acele tabele din foi diferite de calcul printr-un MS Query, iar acest query sa-l inserezi ca PivotTable. Singurul lucru de facut inainte de a face query-ul e sa adaugi in toate tabelele din foile cu clienti o coloana (inserezi o coloana inainte de coloana A) cu numele clientului (pe toate randurile acestei coloane, mai putin header-ul, evident, scrii "client 1", "client 2" s.a.m.d. - poti completa rapid toate randurile coloanei respective selectand mai intai toate celulele din tabel de pe acea coloana si tastand textul pe care apoi il confirmi cu Ctrl+Enter).
Dupa ce ai adaugat aceste coloane in TOATE tabelele de clienti, IN ALT FISIER faci query-ul prin care unesti cele n tabele de clienti, iar acest query il inserezi ca PivotTable. Poti apoi in acest PivotTable sa filtrezi dupa orice conditii ai nevoie. Pentru informatii despre crearea unui asemenea query, si nu numai, vezi aici. Avantajul unei astfel de solutii e ca poti sa lucrezi mai departe in fisierul in care ai foile pentru fiecare client, iar pentru centralizare, cand deschizi fisierul in care ai query-ul, nu e nevoie decat de un refresh ca toate datele sa fie actualizate, fara sa trebuiasca sa rulezi vreun macro. Acest refresh se poate pune ca o singura linie de cod vba in procedura asociata evenimentului Activate al foii de calcul unde ai query-ul si atunci nici grija refresh-ului n-o mai ai. Ar ramane doar grija de a activa macro-urile la deschiderea fisierului, dar asta oricum ai fi avut-o si in solutia cu macro-ul care copiaza datele, iar daca lucrezi in versiunea 2007 sau mai noua, poti scapa si de asta adaugand folder-ul unde se afla fisierele in lista de la Trusted Locations. |
#3
Posted 04 October 2010 - 09:01

Ce vrei tu se poate face si fara vba, sau cu o singura linie de cod vba. Se pot uni acele tabele din foi diferite de calcul printr-un MS Query, iar acest query sa-l inserezi ca PivotTable. Singurul lucru de facut inainte de a face query-ul e sa adaugi in toate tabelele din foile cu clienti o coloana (inserezi o coloana inainte de coloana A) cu numele clientului (pe toate randurile acestei coloane, mai putin header-ul, evident, scrii "client 1", "client 2" s.a.m.d. - poti completa rapid toate randurile coloanei respective selectand mai intai toate celulele din tabel de pe acea coloana si tastand textul pe care apoi il confirmi cu Ctrl+Enter). Dupa ce ai adaugat aceste coloane in TOATE tabelele de clienti, IN ALT FISIER faci query-ul prin care unesti cele n tabele de clienti, iar acest query il inserezi ca PivotTable. Poti apoi in acest PivotTable sa filtrezi dupa orice conditii ai nevoie. Pentru informatii despre crearea unui asemenea query, si nu numai, vezi aici. Avantajul unei astfel de solutii e ca poti sa lucrezi mai departe in fisierul in care ai foile pentru fiecare client, iar pentru centralizare, cand deschizi fisierul in care ai query-ul, nu e nevoie decat de un refresh ca toate datele sa fie actualizate, fara sa trebuiasca sa rulezi vreun macro. Acest refresh se poate pune ca o singura linie de cod vba in procedura asociata evenimentului Activate al foii de calcul unde ai query-ul si atunci nici grija refresh-ului n-o mai ai. Ar ramane doar grija de a activa macro-urile la deschiderea fisierului, dar asta oricum ai fi avut-o si in solutia cu macro-ul care copiaza datele, iar daca lucrezi in versiunea 2007 sau mai noua, poti scapa si de asta adaugand folder-ul unde se afla fisierele in lista de la Trusted Locations. Buna, Am incercat si varianta aceasta, insa sunt 25 de pagini in fisierul excel din care ar trebui extrase informatiile si la generarea unui query imi apar tot felul de erori si la un moment dat PC-ul se blocheaza (cred ca este prea multa informatie de procesat). |
#4
Posted 04 October 2010 - 09:53

Buna, Am incercat si varianta aceasta, insa sunt 25 de pagini in fisierul excel din care ar trebui extrase informatiile si la generarea unui query imi apar tot felul de erori si la un moment dat PC-ul se blocheaza (cred ca este prea multa informatie de procesat). Comanda SQL pe care ai folosit-o (mai putin calea si numele fisierului) difera de cea de mai jos? SELECT * FROM `D:\Clienti\Clienti.xlsx`.`'client 1$'` `'client 1$'` UNION SELECT * FROM `D:\Clienti\Clienti.xlsx`.`'client 2$'` `'client 2$'` UNION SELECT * FROM `D:\Clienti\Clienti.xlsx`.`'client 3$'` `'client 3$'`(bineinteles ca trebuie sa contina 25 de selecturi si 24 de clauze UNION) |
#5
Posted 04 October 2010 - 11:56

Ai dreptate, la un numar mare de inregistrari, query-ul dureaza niste minute (vreo 3 la o medie de 20.000 de inregistrari/foaie client).
Un macro care face centralizarea respectiva pe acelasi numar de inregistrari dureaza mult mai putin: Option Explicit Option Base 1 Public Const fact_s = "factura scadenta", cli_txt = "client " Sub Actualizeaza_Scadente() Dim rg_cl, rg_scad, cl, rand_cl As Range Dim i, j, k As Long Application.ScreenUpdating = False With ActiveSheet .Range("A2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Clear .Range("A2").Select End With j = 2 For i = 1 To 25 Application.StatusBar = cli_txt & i ThisWorkbook.Worksheets(cli_txt & i).Activate With ActiveSheet .Range("A2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Set rg_cl = Selection For k = 1 To rg_cl.Rows.Count Set rand_cl = rg_cl.Rows(k) If rand_cl.Cells(9).Value = fact_s Then rand_cl.Copy ThisWorkbook.Worksheets("scadente").Activate With ActiveSheet .Range("A" & j).Select Selection.Value = cli_txt & i .Range("B" & j).Select .Paste j = j + 1 End With ThisWorkbook.Worksheets(cli_txt & i).Activate End If Next k .Range("A2").Select End With Next i ThisWorkbook.Worksheets("scadente").Activate Range("A2").Select Application.SendKeys ("{ESC}") Application.StatusBar = False Application.ScreenUpdating = True End Sub Conditia e ca foaia unde faci centralizarea sa se numeasca "scadente", tabelul din foaia respectiva sa aiba 10 coloane, cu header-ul pe randul 1, iar tabelele din foile "client 1", "client 2",... "client 25" sa aiba 9 coloane (asa cum ai descris initial aceste tabele), sa inceapa TOATE din A1, sa aiba header-e pe randul 1 (datele sa inceapa din A2) si sa nu mai existe alte date in foile respective. Dupa ce copiezi codul de mai sus intr-un modul, inserezi un buton in foaia "scadente" caruia ii asociezi macro-ul Actualizeaza_Scadente. Macro-ul va sterge mai intai toate inregistrarile existente in foaia "scadente" si va repopula tabelul cu inregistrarile din foile "client 1" - "client 25" care corespund conditiei ca pe coloana 9 sa fie inscris textul "factura scadenta". Edited by gecs, 04 October 2010 - 11:58. |
#6
Posted 04 October 2010 - 13:16

Ai dreptate, la un numar mare de inregistrari, query-ul dureaza niste minute (vreo 3 la o medie de 20.000 de inregistrari/foaie client). Un macro care face centralizarea respectiva pe acelasi numar de inregistrari dureaza mult mai putin: Option Explicit Option Base 1 Public Const fact_s = "factura scadenta", cli_txt = "client " Sub Actualizeaza_Scadente() Dim rg_cl, rg_scad, cl, rand_cl As Range Dim i, j, k As Long Application.ScreenUpdating = False With ActiveSheet .Range("A2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Clear .Range("A2").Select End With j = 2 For i = 1 To 25 Application.StatusBar = cli_txt & i ThisWorkbook.Worksheets(cli_txt & i).Activate With ActiveSheet .Range("A2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Set rg_cl = Selection For k = 1 To rg_cl.Rows.Count Set rand_cl = rg_cl.Rows(k) If rand_cl.Cells(9).Value = fact_s Then rand_cl.Copy ThisWorkbook.Worksheets("scadente").Activate With ActiveSheet .Range("A" & j).Select Selection.Value = cli_txt & i .Range("B" & j).Select .Paste j = j + 1 End With ThisWorkbook.Worksheets(cli_txt & i).Activate End If Next k .Range("A2").Select End With Next i ThisWorkbook.Worksheets("scadente").Activate Range("A2").Select Application.SendKeys ("{ESC}") Application.StatusBar = False Application.ScreenUpdating = True End Sub Conditia e ca foaia unde faci centralizarea sa se numeasca "scadente", tabelul din foaia respectiva sa aiba 10 coloane, cu header-ul pe randul 1, iar tabelele din foile "client 1", "client 2",... "client 25" sa aiba 9 coloane (asa cum ai descris initial aceste tabele), sa inceapa TOATE din A1, sa aiba header-e pe randul 1 (datele sa inceapa din A2) si sa nu mai existe alte date in foile respective. Dupa ce copiezi codul de mai sus intr-un modul, inserezi un buton in foaia "scadente" caruia ii asociezi macro-ul Actualizeaza_Scadente. Macro-ul va sterge mai intai toate inregistrarile existente in foaia "scadente" si va repopula tabelul cu inregistrarile din foile "client 1" - "client 25" care corespund conditiei ca pe coloana 9 sa fie inscris textul "factura scadenta". Am inserat o foaie noua, pentru care am copiat codul si imi da urmatoarea eroarea: compile error: constants, fixed-length strings, arrays, user-defined types and Declare statements not allowed as Public members of object modules. Este ceva ce nu am facut bine? |
#7
Posted 04 October 2010 - 14:37

Este posibil ca eroarea sa apara deoarece "factura scadenta" este rezultatul aplicarii unei formule? Mai exact, in coloana I am o formula (=IF(TODAY()=E2; "factura scadenta";"")) iar rezultatul acesteia este "factura scadenta" (care in cod este private const).
|
#8
Posted 04 October 2010 - 14:56

Codul trebuie copiat intr-un modul, nu intr-o foaie noua de calcul.
In arhiva atasata e un fisier .xls care contine un exemplu cu situatia din fisierul tau, asa cum am inteles-o din explicatiile de la primul mesaj: - o foaie denumita scadente in care se face centralizarea; - 25 de foi denumite client 1, client 2,... client 25 in care exista cate un tabel identic cu 9 coloane, iar pe ultima coloana pentru cateva inregistrari apare textul "factura scadenta". In foaia scadente, langa tabelul de 10 coloane exista un buton cu textul Actualizeaza - daca apesi pe acel buton tabelul din acea foaie e refacut si cuprinde numai inregistrarile din celelalte 25 de foi care pe ultima coloana au inscris textul "factura scadenta". Functionarea acestei proceduri poti s-o verifici modificand in oricare din cele 25 de tabele valorile din ultima coloana si apasand din nou pe butonul cu pricina. Valorile numerice care apar in cele 25 de tabele sunt aleatoare. Daca dupa verificare ai constatat ca procedura functioneaza corect, poti sa copiezi tabelele tale peste cele 25 de tabele din fisierul meu si vei avea un fisier functional cu datele reale. Cu un Save As cu alt nume decat cel al fisierului tau de date pastrezi si datele originale si poti sa testezi in continuare. Daca e vreo problema cu functionarea macro-ului, imi spui si o corectam. Nu uita sa permiti activarea macro-ului la deschiderea fisierului. ![]() |
#9
Posted 05 October 2010 - 07:56

Codul trebuie copiat intr-un modul, nu intr-o foaie noua de calcul. In arhiva atasata e un fisier .xls care contine un exemplu cu situatia din fisierul tau, asa cum am inteles-o din explicatiile de la primul mesaj: - o foaie denumita scadente in care se face centralizarea; - 25 de foi denumite client 1, client 2,... client 25 in care exista cate un tabel identic cu 9 coloane, iar pe ultima coloana pentru cateva inregistrari apare textul "factura scadenta". In foaia scadente, langa tabelul de 10 coloane exista un buton cu textul Actualizeaza - daca apesi pe acel buton tabelul din acea foaie e refacut si cuprinde numai inregistrarile din celelalte 25 de foi care pe ultima coloana au inscris textul "factura scadenta". Functionarea acestei proceduri poti s-o verifici modificand in oricare din cele 25 de tabele valorile din ultima coloana si apasand din nou pe butonul cu pricina. Valorile numerice care apar in cele 25 de tabele sunt aleatoare. Daca dupa verificare ai constatat ca procedura functioneaza corect, poti sa copiezi tabelele tale peste cele 25 de tabele din fisierul meu si vei avea un fisier functional cu datele reale. Cu un Save As cu alt nume decat cel al fisierului tau de date pastrezi si datele originale si poti sa testezi in continuare. Daca e vreo problema cu functionarea macro-ului, imi spui si o corectam. Nu uita sa permiti activarea macro-ului la deschiderea fisierului. ![]() Buna, Am incercat sa modific fisierul din arhiva (am copiat in sheet client 1 informatiile din fisierul meu) si imi da eroare. Am atasat fisierul modificat, poate reusesti sa-ti dai seama de unde provine. Si multumesc frumos pentru ajutor. Alexandra Attached Files |
#10
Posted 05 October 2010 - 08:42

Buna, Am incercat sa modific fisierul din arhiva (am copiat in sheet client 1 informatiile din fisierul meu) si imi da eroare. Am atasat fisierul modificat, poate reusesti sa-ti dai seama de unde provine. Si multumesc frumos pentru ajutor. Alexandra |
#11
Posted 05 October 2010 - 08:51

Eroarea provine de la faptul ca in tabelul pe care l-ai pus nu sunt date. La scrierea macro-ului am plecat de la ideea ca in toate cele 25 de tabele sunt date. Daca ai si tabele in care nu sunt date, pot sa modific, sa-l fac sa verifice daca sunt sau nu date in foaia respectiva. Populeaza tabelul din foaia "client 1" cu date (in toate celulele tabelului) si o sa vezi ca functioneaza. |
|
#12
Posted 05 October 2010 - 09:19

L-am modificat, astfel incat daca in foile de clienti nu exista decat header-ul tabelului (ala e musai sa fie), nu se mai supara ca nu are date in rest si trece mai departe.
Verifica si cu date si fara date (doar header) si spune-mi, te rog, daca functioneaza cum trebuie. ![]() Edited by gecs, 05 October 2010 - 09:19. |
#13
Posted 05 October 2010 - 09:40

L-am modificat, astfel incat daca in foile de clienti nu exista decat header-ul tabelului (ala e musai sa fie), nu se mai supara ca nu are date in rest si trece mai departe. Verifica si cu date si fara date (doar header) si spune-mi, te rog, daca functioneaza cum trebuie. ![]() Tot da eroare (poate pentru ca in col. E, H si I sunt informatii). Cel mai bine ar fi sa verifice daca sunt informatii in col. A si daca nu sunt sa ignore pagina respectiva in rularea macro-ului. |
#14
Posted 05 October 2010 - 09:45

Tot da eroare (poate pentru ca in col. E, H si I sunt informatii). Cel mai bine ar fi sa verifice daca sunt informatii in col. A si daca nu sunt sa ignore pagina respectiva in rularea macro-ului. ![]() Poti sa atasezi fisierul in care a dat eroare? |
#15
Posted 05 October 2010 - 09:55

#16
Posted 05 October 2010 - 12:39

Am modificat codul, dar eroarea era de la valoarea formulei folosite pe coloana I, pe care o mai si formatasesi sa foloseasca font de culoare alba daca formula returneaza eroare !!!
![]() In foaia client 1 am modificat formulele - daca iti convine cum sunt acum, le pastrezi si le poti folosi si in celelalte tabele, daca nu - nu. Te rog testeaza functionarea macro-ului si spune-mi daca mai face figuri. Am mai adaugat 2 foi in fisier: Banci si Valute. In foile alea poti sa intretii listele de banci si de valute (fiecare scrisa o singura data pe coloana A; pot fi pana la 100 de banci si 20 de valute) astfel incat sa le folosesti si in tabelele din foile pentru clienti. Header-ul si primul rand (inclusiv formulele si celulele cu drop-down combo facute cu Data Validation) din tabelul din foaia client 1 l-am copiat si in foile 'client 5':'client 25'. Daca nu-ti place asa, le inlocuiesti cu formatul de tabel care-ti convine. Poti sa le inlocuiesti pe toate dintr-un foc cu o selectie 3d: click pe eticheta foii (tab-ul) client 5 -> mergi la sfarsitul listei de foi -> apesi si tii apasata tasta Shift -> click pe eticheta foii client 25 - scum toate aceste foi sunt selectate si ce modifici intr-una se va modifica in toate. Ca sa dezactivezi selectia 3d dai un click pe tab-ul unei foi care nu face parte din selectie. ![]() Edited by gecs, 05 October 2010 - 12:40. |
|
#17
Posted 05 October 2010 - 13:08

Am modificat codul, dar eroarea era de la valoarea formulei folosite pe coloana I, pe care o mai si formatasesi sa foloseasca font de culoare alba daca formula returneaza eroare !!! ![]() In foaia client 1 am modificat formulele - daca iti convine cum sunt acum, le pastrezi si le poti folosi si in celelalte tabele, daca nu - nu. Te rog testeaza functionarea macro-ului si spune-mi daca mai face figuri. Am mai adaugat 2 foi in fisier: Banci si Valute. In foile alea poti sa intretii listele de banci si de valute (fiecare scrisa o singura data pe coloana A; pot fi pana la 100 de banci si 20 de valute) astfel incat sa le folosesti si in tabelele din foile pentru clienti. Header-ul si primul rand (inclusiv formulele si celulele cu drop-down combo facute cu Data Validation) din tabelul din foaia client 1 l-am copiat si in foile 'client 5':'client 25'. Daca nu-ti place asa, le inlocuiesti cu formatul de tabel care-ti convine. Poti sa le inlocuiesti pe toate dintr-un foc cu o selectie 3d: click pe eticheta foii (tab-ul) client 5 -> mergi la sfarsitul listei de foi -> apesi si tii apasata tasta Shift -> click pe eticheta foii client 25 - scum toate aceste foi sunt selectate si ce modifici intr-una se va modifica in toate. Ca sa dezactivezi selectia 3d dai un click pe tab-ul unei foi care nu face parte din selectie. ![]() Super, acum vad ca functioneaza fara erori. As mai vrea sa stiu (in cazul in care ma hotarasc sa mai introduc o formula si pentru facturi cu scadenta depasita, tinand cont de coloana "scadenta" si "incasare", va putea rula macro-ul daca coloana a 10-a va contine formula aceasta:=IF(AND(A2>0;F2<=0;E2<TODAY());"scadenta depasita";"")? |
#18
Posted 05 October 2010 - 14:18

Super, acum vad ca functioneaza fara erori. As mai vrea sa stiu (in cazul in care ma hotarasc sa mai introduc o formula si pentru facturi cu scadenta depasita, tinand cont de coloana "scadenta" si "incasare", va putea rula macro-ul daca coloana a 10-a va contine formula aceasta:=IF(AND(A2>0;F2<=0;E2<TODAY());"scadenta depasita";"")? Ai vrea sa-ti centralizeze si inregistrarile unde apare sirul "scadenta depasita"? Daca asta e ideea, au as face o formula care sa afiseze un sir de caractere care contine cuvantul "scadenta" pentru orice inregistrare o vrei centralizata. Macro-ul din fisierul atasat asta face. In plus, formula despre care vorbeai mai sus am adaptat-o sub forma: =IF(LEN($E2)=0,"",IF(LEN($F2)=0,IF(TODAY()=$E2,"factura scadenta",IF(TODAY()<$E2,"","scadenta depasita")),IF(ISNUMBER($F2),IF($F2>$E2,"scadenta depasita",""),"")))si am copiat-o in toate tabelele. ![]() |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users