cod vba de copiere conditionata

Informatii despre cum se utilizeaza Microsoft Excel 2007. Calcule, Formule, Functii, Tabele pivot, Analiza datelor, etc
Închis
utudan
Mesaje: 67
Membru din: Vin Noi 08, 2013 6:55 pm

cod vba de copiere conditionata

Mesaj de utudan » Sâm Mai 06, 2017 9:41 pm

Buna ziua
Momentan lucrezcu un cod vba ce selecteaza datele dintr un tabel si le copiaza undeva departe in celalalt tabel si apoi le sorteaza dupa data. functioneaza e ok dar taabelul s a cam marit si se v a mari in continuare iar sortarea dureaza 1 min acuma. E cam mult. problema e ca datele care le copiaza sant cu spatii intre ele iar aceste spatii trebuie sa dispara. Pentru a intelege mai bine problema o sa atasez si un fisier.
Cu speranta ca ma v eti ajuta cum a ti facut o si pana acum v a multumesc anticipat.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

TudyBTH
Moderator
Moderator
Mesaje: 993
Membru din: Joi Feb 11, 2016 2:12 pm
Localitate: Cluj Napoca

Re: cod vba de copiere conditionata

Mesaj de TudyBTH » Sâm Mai 06, 2017 10:14 pm

Buna,

Nu inteleg prea bine ce doriti.

1. Doriti un alt cod care sa copieze datele in al doilea tabel fara liniile "goale"?
Aveti in exemplul atasat linia 4
Capture.JPG
o astfel de linie se copiaza? Sau doar liniile cu data? Sau doar liniile cu valori in toate campurile?

2. Doriti o solutie care sa "se miste" mai cu spor cand sorteaza datele?
In acest caz, avand in vedere ca dimensiunea tabelului va creste in continuare, cred ca ar fi bine sa luati in calcul si varianta copierii datelor intr-o baza de date.
Daca doriti ca datele sa ramana in Excel ar fi bine de cunoscut toate datele problemei pentru a vedea ce posibilitati sunt de fragmentare a acelui tabel.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.
Am invatat sa inotam in apa, ca pestii
Am invatat sa zburam in aer, ca pasarile
A ramas doar sa invatam sa traim pe Pamant, ca Oamenii.

utudan
Mesaje: 67
Membru din: Vin Noi 08, 2013 6:55 pm

Re: cod vba de copiere conditionata

Mesaj de utudan » Dum Mai 07, 2017 8:05 am

Multumesc pentru promtitudine.
Da aveti dreptate. Acolo in poza e o gresala. Randul trebuie sa fie complect si nu doar o pozitie sau doua. Am gresit eu cand am schimbat literele sa nu fie identice. Practic un rand contine: data, denumirea, destinatia,cantitatea, tipul produsului si lotul. Cand am deschis acest topic m am gandit la un alt cod de copiere care sa caute daca pe coloana M exista date si apoi sa copie randul in celalalt tabel iar daca nu gaseste sa treaca la urmatorul rand pana termina (practic in tabelul de copiat sant aprocsimativ 150 randuri), asa eliminand sortarea (unde sta prea mult). Tabelul in care se copiaza il folosesc ca si baza de date. In felul acesta dupa fiecare copiere imi arata cat a iesit din produs, cat mai am pe stoc, ce loturi si ce cantitati.... etc.
Daca exista o posibilitate ca sortarea sa se faca mai rapid si sa ramana asa e ok, practic trebuie sa castig timp.

TudyBTH
Moderator
Moderator
Mesaje: 993
Membru din: Joi Feb 11, 2016 2:12 pm
Localitate: Cluj Napoca

Re: cod vba de copiere conditionata

Mesaj de TudyBTH » Dum Mai 07, 2017 9:07 am

Buna,

Aveti un exemplu de cod care copiaza doar liniile care au valoare in prima coloana (data). Puteti adapta conditia din IF pentru alta varianta.
Ati spus ca datele sursa sunt rezultatul unor formule, deci datele sursa nu pot fi sterse odata cu copierea lor. In acest caz trebuie sa aveti in vedere si gasirea unei solutii de a nu copia aceleasi date in mod repetat.

Cod: Selectaţi tot

Sub SalvareDate()
    Dim rSursa As Range, rDestinatie As Range
    Dim nrCol As Integer

    Dim ultimaLinie As Long
    Dim i As Long, j As Long
    Dim wsS As Worksheet, wsD As Worksheet
    
    '---- setare parametrii --------------------------
    'prima celula stg-sus din datele sursa
    Set rSursa = ThisWorkbook.Sheets("Sheet1").Range("M1")
    'prima celula stg-sus din datele destinatie
    Set rDestinatie = ThisWorkbook.Sheets("Sheet1").Range("B1")
    nrCol = 6 'numar coloane
    '-------------------------------------------------
    
    Set wsS = rSursa.Parent
    Set wsD = rDestinatie.Parent
    Application.ScreenUpdating = False
    i = wsD.Cells(wsD.Rows.Count, rDestinatie.Column).End(xlUp).Row + 1
    For j = rSursa.Row To wsS.Cells(wsS.Rows.Count, rSursa.Column).End(xlUp).Row
        If Len(wsS.Cells(j, rSursa.Column).Value) > 0 Then
            wsS.Cells(j, rSursa.Column).Resize(1, nrCol).Copy
            wsD.Cells(i, rDestinatie.Column).PasteSpecial (xlPasteValues)
            i = i + 1
        End If
    Next j
    
    Application.CutCopyMode = False
    Set wsS = Nothing
    Set wsD = Nothing
    Set rSursa = Nothing
    Set rDestinatie = Nothing
End Sub
In ceea ce priveste viteza de sortare, nu exista solutie mai rapida decat functia de sortare a Excelului.
Cred ca singura solutie (daca nu doriti sa folositi Access) este fragmentarea datelor in fisiere separate pe fiecare luna.
Am invatat sa inotam in apa, ca pestii
Am invatat sa zburam in aer, ca pasarile
A ramas doar sa invatam sa traim pe Pamant, ca Oamenii.

utudan
Mesaje: 67
Membru din: Vin Noi 08, 2013 6:55 pm

Re: cod vba de copiere conditionata

Mesaj de utudan » Lun Mai 08, 2017 6:58 am

Multumesc mult
L am adaprat cerintelor mele si functioneaza. Am castigat cateva secunde bune si cred ca sant sanse mari sa nu creasca secundele fiind ca e eliminata sortarea si chear daca baza de date creste timpul banuiesc ca v a ramane acelasi. Daca v a merge tot asa este foarte bine.
Inca o data va multumesc.

Închis

Înapoi la “Intrebari despre Excel 2007”