Excelar Hardcore

Un tip cu skillsetul si ocupatiunile mele probabil ca nu s-ar recomanda ca un excelar. Orice tip care poate programa in ceva limbaje ar zice ca excelul e de cacat ca pentru analiza/prelucrarea de date ar trebui sa folosim alte tooluri mai bune, macar access, MySQL, daca nu matlabă si alte figuri .

Din experienta mea, proramatorii urasc excelul si powerpointu’.

Eu sunt un excelar hardcore. Pentru ca daca e vorba de analiza de date , corectie and sheet excelul e cel mai rapid, cel mai flexibil, cel mai vizual si sa imi bag pula in de ce nu exista alte tool-uri la fel de bune . Exista, fac parte din pachete de softuri pentru Business Intelligence sau Business Warehouse. Sau chestii gen Dataiku.

Weekendul asta am inregistrat recordul de rulare pentru un excel 26 de ore. Da, mi-am dat seama ca nu rulez optim niste scripturi de calcul de distante Levenshtein pe niste dictionare care duceau la calculul a vreo 350 milioane de distante pentru 70 000 de cuvinte, chestie nu chiar necesara. Pe care am optiizat-o cand s-a terminat scriptul si mi-am dat seama ca am uitat sa fac un cacat de conversie catre upper si toate concluziile mele erau oarecum gresite, cu circa 50% .

Gen – asta e distanta, copiata de pe ceva sourceforge, nu mai stiu exact.

Iar asta-i contextul .

[code language=”vb”]
Function Levenshtein(ByVal string1 As String, ByVal string2 As String) As Long

Dim i As Long, j As Long
Dim string1_length As Long
Dim string2_length As Long
Dim distance() As Long

string1_length = Len(string1)
string2_length = Len(string2)
ReDim distance(string1_length, string2_length)

For i = 0 To string1_length
distance(i, 0) = i
Next

For j = 0 To string2_length
distance(0, j) = j
Next

For i = 1 To string1_length
For j = 1 To string2_length
If Asc(Mid$(string1, i, 1)) = Asc(Mid$(string2, j, 1)) Then
distance(i, j) = distance(i – 1, j – 1)
Else
distance(i, j) = Application.WorksheetFunction.Min _
(distance(i – 1, j) + 1, _
distance(i, j – 1) + 1, _
distance(i – 1, j – 1) + 1)
End If
Next
Next

Levenshtein = distance(string1_length, string2_length)

End Function
[/code]

[code language=”vb”]
Function BestMatch(region As String) As String

Dim wb As Workbook
Dim sstart As String
Dim send As String

Set wb = ThisWorkbook

‘define your sheets
Dim ws_data As Worksheet
Dim ws_iso As Worksheet
Dim ws_found As Worksheet
Dim vfound As Range
Dim vsearch As Range
Dim vdist As Range
Set ws_data = wb.Sheets(“DATA”)
Set ws_iso = wb.Sheets(“ISO”)
Set ws_found = wb.Sheets(“ISOFOUND”)
sstart = “”
Dim lastRow As Long
BestMatch = “Not Found”
lastRow = ws_iso.Range(“A” & Rows.Count).End(xlUp).Row + 1
lastFound = ws_found.Range(“A” & Rows.Count).End(xlUp).Row + 1
Dim isodict(1 To 32000) As String
Dim isosearch(1 To 70000) As String
Dim isofound(1 To 70000) As String
Dim isofounddist(1 To 70000) As String
Dim xfound As Boolean
For i = 1 To lastRow

n isodict(i) = ws_iso.Cells(i, 4)
Next i

For j = 1 To lastFound
isosearch(j) = ws_found.Cells(j, 1)
isofound(j) = ws_found.Cells(j, 2)
isofounddist(j) = ws_found.Cells(j, 3)
Next j

mindist = 10000
For i = 1 To lastRow
‘meaninful test check if we already distanced that value
For j = 1 To lastFound
If UCase(region) = UCase(isosearch(j)) Then
BestMatch = isofound(j)
j = lastFound
i = lastRow
‘exit this loop and the above one
xfound = True
End If

Next j
‘ means we don’t have an already mapped best match
‘ looping through dictionary
If xfound = False Then
testword = isodict(i)
distance = Levenshtein(UCase(region), UCase(testword))
If distance = 0 Then
BestMatch = testword
i = lastRow

Else
If distance < mindist Then BestMatch = testword mindist = distance End If End If End If Next i ' write the value of best match in the found dictionary End Function [/code]

Tre’ sa ma modernizez.

Si codul asta apare asa pentru ca sa imi bag pula in “Blocks”

0 0 votes
Article Rating
Subscribe
Notify of
guest
20 Comments
Inline Feedbacks
View all comments
filip pacurar
5 years ago

Ontopic: ceva nu merge la code highlighter, nu se vede bine pe site.

Offtopic: tu ai avut copil mic cand ai lucrat de acasa? Mic gen bebe plangacios cu colici. Nu stiu cum sa mai ma concentrez la munca… si clientii nu inteleg 100% ca eu is in perioada asta si asteapta acelasi randament frate… greu!

filip pacurar
5 years ago

Da, stiu, ca celalalt copil are 2 ani jumate. Au trecut colicii, a inceput joaca si sa vorbeasca :)). In vara vrem sa ne mutam la casa, atunci poate o sa fie mai usor ca am o camera numai pentru lucru. Si acum la bloc cu 3 camere am una doar pentru lucru, dar e mai diferit, poate oricand sa vina copilul aici si se aude si cand te pisi la baie :)). Abia astept sa vad atunci cum o fi.

Stropic
Stropic
5 years ago

@filip: izoleaza si tu fonic camera daca tot te muti. Nici macar nu glumesc, stiu pe cineva de a facut asta si e in al 9-lea cer. Nici nu costa imens, insa iti ia din spatiu, asta da.

Alin
5 years ago

@Catalin – încearcă și PowerBi – e free pt desktop.
https://powerbi.microsoft.com/en-us/desktop/
@Filip – aceeași situație, așa că mi-am închiriat un birou mic și mă duc acolo când e nevoie. Asta mai aduce un avantaj – nu mă mai bate nevasta la cap in timpul zilei – sunt la muncă și aia e.

ala
ala
5 years ago

Singura problema pe care o vad la Excel e VBA-aul, care e o mizerie odioasa din alt mileniu. Daca ar pune un plug-in nativ de Python, cred ca i-as da si limbi in pizda.Dar cu acelasi usability ca VBA-ul, nu prin xll sau alte cacaturi.

ala
ala
5 years ago

Ma indoiesc ca VBA-ul e mai usor de invatat decat Python, chiar si pentru secretare sau contopisti. Gen Sub, DIM, Var si tot boilerplate-ul aferent.

pipzn
pipzn
5 years ago

Acum nu stiu daca ati pus codul respectiv doar partial sau nu am vazut eu bine (caz in care imi cer scuze) dar in mod normal se mai pun niste instructiuni care incadreaza un cod si care au impact uneori major in viteza de executie a unui macro. ex. Application.Calculation = xlCalculationManual (si comutat pe Application.Calculation = xlCalculationAutomatic la sfarsitul codului) Application.ScreenUpdating = False (si comutat pe True la sfarsitul codului) pana si blocarea provizorie a afisarii page breaks poate avea impact asupra vitezei de rulare a codului. (ActiveSheet.DisplayPageBreaks = False, comutat apoi pe True) O incetinire sensibila a rularii… Read more »

Catalinx
Catalinx
5 years ago

Da, am pus Screen updating pe off si am castigat intradevar ceva timp, 30-50% la seturi de date mici, dar la tot fisierul nu prea conteaza cand dureaza peste noapte calculul.
Calculul l-am setat de tot pe manual din optiuni, ca ma lua capul cand faceam o modificare si se apuca iarasi de rontait.
La display page breaks n-am umblat, e oricum off, ca nu printez si nu imi pasa.

pipzn
pipzn
5 years ago

Eu recunosc ca desi aveti un cod aerisit in general am nevoie sa vad concret si ce se intampla (ce si cum se scrie in foaie). Insa, daca aveti situatii in care ceva s-a gasit si implicit nu mai e nevoie sa se faca o testare pana la capat, nu am observat o instructiune clara de Exit For (ci doar un comentariu de exit) Apoi, daca chiar aveti o instructiune de genul: BestMatch = testword mindist = distance va intreb daca intr-adevar functioneaza. cum ar trebui. La un moment dat cand am incercat intr-un proiect propriu ceva asemanator am constat… Read more »

Catalinx
Catalinx
5 years ago

Nu folosesc exit for . j = lastFound i = lastRow De functionat functioneaza, oricum nu mai conteaza aveam nevoie de o singura rulare finalizata, daca dura juma de saptamana era ok, ca faceam altceva intre timp. Functioneaza pentru ca initializez distanta minima cu ceva oribil de mare ( oricum am ignorat orice rezultate cu distanta > 2 ca s-au dovedit irelevante, chit ca aveau forma apropiata ) iar in “for”-ul ala este o secventa Else If distance < mindist Then adica calculez toate distantele si initializez rezultatul doar atunci cand dau peste ceva cu distanta mai mica decat cea… Read more »

Fery
Fery
5 years ago

Ai setat numarul de core-uri pe care sa le foloseasca din options? Ca asa si io ma uitam cum statea global procul la 25% pana i-am zis sa foloseasca toate 4 nucleele.

catalinx
catalinx
5 years ago

Cred ca da.


I-am crescut si prioritatea din Task manager, ca sa ajung la 30%. Altfel 18-20.

pipzn
pipzn
5 years ago

Daca aveti versiunea de office pe 32 de bits, nu prea aveti ce face nimic in plus pentru ca “by design” Excel nu va putea folosi mai mult de 4 Gb de memorie RAM. Si de fapt cei 4 sunt rezervati pentru intregul pachet Office. Adica, daca de exemplu mai aveti deschis Outlook, Word etc. si aceste aplicatii iau tot din aceeasi 4 Gb chiar daca dvs. aveti instalati (mult) mai multi.

pipzn
pipzn
5 years ago

De fapt 2Gb “Although improvements in Office 2013/2016 did not significantly affect system requirements, Office 2013/2016 does use more available system resources than Office 2010 did. The limit of virtual address space for 32-bit editions of Windows-based applications is 2 gigabytes (GB). For Excel, this space is shared by the Excel application itself together with any add-ins that run in the same process. The size of the worksheet itself also affects the usage of virtual address space. Because Excel loads the worksheet into addressable memory, some worksheets that have a file size of less than 2 GB may still require… Read more »