Help! Excel VBA

Deci dupa multe saptamani de lipsa de chef, am reusit weekendul trecut sa termin programul.
Proceseaza in 3 pasi: 1=importa coloanele interesante din CSV-ul ala oribil scos de analizor in doua foi temporare, 2=sorteaza, alege randurile interesante si face o sinteza cu datele posibil utilizabile, 3=sorteaza iar, alege datele finale si, pentru fiecare set de date, face copie a template-ului si il umple cu date.
E scris exclusiv in VBA. Are vreo 5 pagini de cod si cam o pagina si jumatate de explicatii (la inceput) si comentarii (printre randurile de cod) despre ce am vrut sa fac acolo, ca altfel dracu' il mai descifreaza cand va trebui modificat template-ul formularului final.
Oribil.
Da' merge...
... dupa vreo 15 minute de rumegat la un export de 5 MB.
:facepalm:
 
Pune cate un checkpoint din loc in loc, vezi la ce timp ajunge acolo si ce dureaza atat de mult. Din ce spui nu exista justificare sa mearga atat de incet chiar si pe un RPi.
 
Stiu deja ce merge greu: importul. Importa cam 5-10 linii/s si nu am cum sa-l simplific mai mult la partea asta. Bine ca merge. Asa ramane!
 
Si eu ma plangeam de performanta cand importam dintr-un CSV vreo 4,000,000 de linii in aproape 30 de secunde. HDD, nu SSD, in masina virtuala cu 2 procesoare pe la 2 GHz.
 
Vin si eu cu o problema care ma seaca.

Am un VBA apelat dintr-un fisier. Unul din lucrurile pe care vreau sa le obtin este sa copieze un worksheet (copy range din worksheet initial, creare worksheet nou, redenumire, paste in worksheet nou) din fisierul din care ruleaza VBA intr-un fisier nou creat prin VBA (intr-un pas anterior).

Folosesc urmatoarea secventa:
Code:
Private Sub cmdNewFTS_Click()
Dim path As String
Dim newfilename As String
Dim ws_old, ws_new, ws_activities As Worksheet
Dim range1 As Range
Dim wbt, newbook As Workbook
Dim size, lRow, i, z As Integer

'generate new file name
newfilename = cboCustomers.Value & " - " & txtInvoiceDate.Value & " - " & _
txtInvoiceNo.Value & ".xlsx"
path = ThisWorkbook.path & "\" & newfilename
Set newbook = Workbooks(newfilename)
Set wbt = ThisWorkbook

With wbt
    'Populate Activity array & cbo
    Set ws_activities = wbt.Worksheets("contract")
    'define activities array
    size = ws_activities.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    size = size - 1
    ReDim FixActivities(size, 6)
    lRow = ws_activities.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    For i = 1 To (lRow - 2)
         For z = 1 To 6
         FixActivities(i - 1, z) = ws_activities.Cells(i + 1, z)
         Next z
         With cboFixDescription
         .AddItem ws_activities.Cells(i + 1, 3).Value
         End With
    Next i
'end init Activity array & cbo

    Set ws_old = wbt.Worksheets("TS_fixed")
    Set range1 = ws_old.Range("A:F")
    range1.Copy
End With
With newbook
    Set ws_new = Sheets.Add(After:=Sheets(Sheets.Count))
    ws_new.Name = "FT " & Customers(cboCustomers.ListIndex, 1) & " - " & txtInvoiceDate.Value
    ActiveCell.PasteSpecial Paste:=xlPasteAll
    Range("B6").Value = "APPENDIX TO INVOICE NO. " & txtInvoiceNo.Value & "/" & txtInvoiceDate.Value
    Range("B2").Value = "CLIENT: " & Customers(cboCustomers.ListIndex, 1) & "; PROJECT: " & txtProjectName.Text
    Range("C9").Value = Customers(cboCustomers.ListIndex, 5)
End With
   
 
End Sub

Problema este desi sunt in bucla de "with" worksheetul nou este creat in fisierul de unde rulez VBA, nu in fisierul nou creat. Ce fac gresit?
 
Ciudat, dupa o inchidere & deschidere a proiectului lucrurile functioneaza conform dorintelor :goofy:
 
Deci dupa multe saptamani de lipsa de chef, am reusit weekendul trecut sa termin programul.
Proceseaza in 3 pasi: 1=importa coloanele interesante din CSV-ul ala oribil scos de analizor in doua foi temporare, 2=sorteaza, alege randurile interesante si face o sinteza cu datele posibil utilizabile, 3=sorteaza iar, alege datele finale si, pentru fiecare set de date, face copie a template-ului si il umple cu date.
E scris exclusiv in VBA. Are vreo 5 pagini de cod si cam o pagina si jumatate de explicatii (la inceput) si comentarii (printre randurile de cod) despre ce am vrut sa fac acolo, ca altfel dracu' il mai descifreaza cand va trebui modificat template-ul formularului final.
Oribil.
Da' merge...
... dupa vreo 15 minute de rumegat la un export de 5 MB.
:facepalm:
A venit vremea sa modific programul pentru alt analizor si alt formular final. Sunt absolut fericit ca am scris comentarii chiar si pentru cele mai simple chestii!

Problema:
Analizorul nu scoate coloanele tot timpul in aceeasi ordine. Trebuie sa le caut dupa numele coloanei (primul rand din tabel).
Deci am facut un array cu numerele de ordine a coloanelor interesante. Ex: index 0 e numarul coloanei cu numele testului, index 1 e nr. coloanei cu unitatea de masura, etc.
Cum fac sa sortez tabelul dupa indecsii astia? Acum folosesc ImportSheet.UsedRange.Sort Key1: =ImportSheet.Range("E1"), dar acel E1 a devenit variabil si trebuie inlocuit cu ceva din array, adica va fi un numar de coloana, nu litera.
Help?
 
Adica sa fac o conversie de genul: vreau sa sortez dupa unitatea de masura (index 2) si gasesc in array column(2)=67, atunci scriu "BO" si adaug "1"?
Da' ce am innebunit?:zbang:

PS: Mi-ai dat o idee.
A mers cu ImportSheet.UsedRange.Sort Key1: =ImportSheet.Columns(column(2)) ... cred...
 
Back
Top