marți, 1 septembrie 2015

Noul blog andreilungu.com

Așa cum am anunțat în acest post blogul s-a mutat pe o nouă platformă. Adresă este: andreilungu.com

În cazul în care doriți să primiți  în continuare email atunci când scriu un articol nou, vă rog să vă abonați pe noul site. Nu voi mai posta articole pe acest blog.

Citește în continuare ->

joi, 16 iulie 2015

Confirmare așteptări acțiune BVB

Salutare ! Scriam în acest articol despre acțiunea ROCE, iar în acesta am selectat-o cu ajutorul aplicației Excel drept prima recomandare pentru cumpărare.

Rezultatele au început deja să apară, creşterea pe această acţiune fiind una considerabilă în doar câteva luni de când am început să acumulez (12.5% profit în aproximativ 2-3 luni):




Nu doresc să mă laud, ci să promovez investițiile pe bursa românească și educația financiară a românilor, mai ales că în prezent volumul tracțiilor de pe bvb este unul extrem de mic comparativ cu ceea ce se întâmplă pe alte burse mai mature.

De asemenea, am observat în ultimul timp inițiative și din partea Bursei de Valori București, cum ar fi spre exemplu, programul "Fluent în Finance" , prin care bursa intenționează să atragă atenția asupra importanței de a gestiona în mod eficient propriile resurse. Pentru cei interesați a fost redactat și un ghid care poate fi descărcat și studiat gratuit aici. 

Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

vineri, 3 iulie 2015

Excel VBA Split Rows Trick and Announcement

Today i have to make an announcement: in the near future I intend to migrate the blog to a new one with a new design and completely in english because I want to develop a better project and reach readers from Romania, but also from other countries. The content will remain the same: finance and accounting, Excel automations and apps, SQL, Access etc.

Now, let's talk about an Excel problem which i recently had to solve. In reality i had a worksheet with thousands of rows (so the manual work which could take days wasn't a solution), but for illustrating purposes i created a file with few rows and no confidential data :)

! Challenge: You have the data from Range("A2:E4"). Split the rows by company codes: for Each Company code separated by a character (; or , or / or -) automatically create a new row. The rest of the data from other columns remains the same for the new rows. Every Company Code string can have different lenght and betwen codes and separators can be spaces.

Initial:







Result:







My code for solving this is the following:

Sub split_rows()

'original code by Andrei Lungu

lr = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row

counter_ch = 0
ismore = False

col_comp_code = "C"

Application.ScreenUpdating = False

For i = lr To 2 Step -1

    Set check_cell0 = ActiveSheet.Range(col_comp_code & i)
    
    check_cell = Replace(check_cell0, " ", "")
    
    counter = 0
        For j = 1 To Len(check_cell)
        
            counter_ch = counter_ch + 1
            activechar = Mid(check_cell, j, 1)
            
            If activechar = "," Or activechar = ";" Or activechar = "/" Or activechar = "-" Then
            ismore = True
                Separator = activechar
                
                counter = counter + 1
                ActiveSheet.Rows(i).Offset(0).EntireRow.Insert
                where_starts = j - (counter_ch - 1)
                company_code = Mid(check_cell, where_starts, counter_ch - 1)
                
    
                ActiveSheet.Range(col_comp_code & i) = company_code
                
            counter_ch = 0
            End If
        
        Next j
                
    'last comp code
    If ismore = True Then
    
    'find out the position of the last separator
                    last_sep = counter
                    char_no = 1
                    counter2 = 0
                    For k = 1 To Len(check_cell)
                    
                        activechar2 = Mid(check_cell, k, 1)
                        char_no = char_no + 1
                        If activechar2 = "," Or activechar2 = ";" Or activechar2 = "/" Or activechar2 = "-" Then
                        counter2 = counter2 + 1
                        If counter2 = last_sep Then
                            last_sep_char_no = char_no
                            'MsgBox last_sep_char_no
                        End If
                        
                        End If
                    
                    Next k
            
    'copy last company code
        last_company_code = Right(check_cell, Len(check_cell) - last_sep_char_no + 1)
        ActiveSheet.Range(col_comp_code & i).Offset(counter) = last_company_code
        
    'copy rest of data
        Do While counter > 0
        
        ActiveSheet.Range("A" & i & ":B" & i).Offset(counter).Copy ActiveSheet.Range("A" & i & ":B" & i).Offset(counter - 1)
        ActiveSheet.Range("D" & i & ":E" & i).Offset(counter).Copy ActiveSheet.Range("D" & i & ":E" & i).Offset(counter - 1)
        counter = counter - 1
        Loop
    
    End If
    
    ismore = False
    
        counter_ch = 0
        counter = 0

Next i

Application.ScreenUpdating = False

End Sub

If you have other ideas please share them in a comment.

The sample file can be downloaded from this location.

Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

joi, 4 iunie 2015

3 methods to summarize total amounts per users and years in Excel 2013 [Pivot Table, Dictionaries, Arrays]

Suppose that we have some raw data like in the image and we need to summarize it in Excel by Names and Years. Although in most of the cases the easiest way to complete this task is by using an Excel Pivot Table or SUMIF/SUMIFS formulas, there might be cases when we will want/need to use other methods. (especially when creating VBA scripts for process automation).

In this post i will present 2 fast alternatives which i used lately and a comparison regarding the speed. Which method will be the fastest: the Pivot Table, the VBA Dictionaries or the VBA Variant Arrays ? You will  also find the sample file download link at the end of the post.

Method 1: VBA Dictionaries. You can read more about them in this article. The code i used to summarize more than 135.000 rows of data using this method is the following:
Sub test_d()

Dim namesdictionary As Dictionary
Dim yearsdictionary As Dictionary

Set namesdictionary = New Dictionary '-main dictionary with names
Set yearsdictionary = New Dictionary '-secondary dictionary with years
Set ws = ActiveSheet
lr = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

StartTime = Timer

ws.Range("F3:H1000").ClearContents

For i = 2 To lr

dKey = ws.Range("A" & i)
damount = ws.Range("B" & i)
dyear = ws.Range("D" & i)

If namesdictionary.Exists(dKey) Then 'if the name already exists then set yearsdictionary in namesdictionary with the key from the row

    Set yearsdictionary = namesdictionary(dKey)
    If yearsdictionary.Exists(dyear) Then         'check if the year already exists in yearsdictionary and if is true then add the amount from the row to the yearsdictionary amount

        damount = damount + yearsdictionary(dyear)
        yearsdictionary(dyear) = damount
        
    Else
    yearsdictionary.Add dyear, damount     'if it doesn't exist then add new years dictionary with the row amount
    
    End If
    
Else                                'if the name does not exist then add yearsdictionary and namesdictionary for that row

Set yearsdictionary = New Dictionary
yearsdictionary.Add dyear, damount

namesdictionary.Add dKey, yearsdictionary

End If

Next i

'scrie valorile
r = 3
For Each dKey In namesdictionary.Keys

    Set yearsdictionary = namesdictionary(dKey)
    
    For Each dyear In yearsdictionary.Keys
    
    ws.Range("F" & r) = dKey
    ws.Range("G" & r) = dyear
    ws.Range("H" & r) = yearsdictionary(dyear)
    r = r + 1
    
    Next dyear
    
Next dKey

'set dictionaries to nothing to release the memory
Set namesdictionary = Nothing
Set yearsdictionary = Nothing

SecondsElapsed = Round(Timer - StartTime, 2)
ws.Range("F15") = "Time: " & SecondsElapsed & " seconds"
ws.Range("F15").Font.Italic = True
ws.Range("F15:H15").Interior.Color = RGB(255, 128, 128)
ws.Range("F16") = "No of rows: " & lr

End Sub

Method 2: VBA Variant Arrays. More about them in this article. The code for the same data:
Sub test_array()

Set ws = ActiveSheet
lr = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim x() As Variant, y() As Variant

StartTime = Timer

ws.Range("R3:T1000").ClearContents      'clear old data

'copy data
ws.Range("A2:A" & lr).Copy ws.Range("R3")
ws.Range("D2:D" & lr).Copy ws.Range("S3")
Application.CutCopyMode = False

'remove duplicates
ws.Range("$R$2:$S$" & lr + 1).RemoveDuplicates Columns:=Array(1, 2), Header _
        :=xlYes

x = ws.Range("A2:D" & lr).Value                                         'array with gross data
y = ws.Range("R3:T" & ws.Cells(ws.Rows.Count, "R").End(xlUp).Row).Value      'array with summarized data

'loop through arrays and summarize amounts by names and years
amount = 0
For i = LBound(y) To UBound(y)
    For j = LBound(x) To UBound(x)
    
    If y(i, 1) = x(j, 1) And y(i, 2) = x(j, 4) Then
        amount = amount + x(j, 2)
    End If
    
    Next j
    
    y(i, 3) = amount
    amount = 0
    
Next i

'write array to sheet including the summarized amounts
ws.Range("R3:T" & ws.Cells(ws.Rows.Count, "R").End(xlUp).Row) = y

Erase x()
Erase y()

SecondsElapsed = Round(Timer - StartTime, 2)
ws.Range("R15") = "Time: " & SecondsElapsed & " seconds"
ws.Range("R15").Font.Italic = True
ws.Range("R15:T15").Interior.Color = RGB(255, 128, 128)

End Sub

Method 3: Excel Pivot Table with dynamic source data range. The formula for the source data range is the following:" =OFFSET(Sheet1!$A$1;0;0;COUNTA(Sheet1!$A:$A);4)" . This named range is defined in Excel Formulas --> Name manager and then is set as source data range for the pivot table. After this, when you add more rows in the raw data range and refresh the pivot table, the source will be updated dynamicaly.











 The speed results for more than 135.000 rows of sample data, core i5 laptop with 16 gb RAM (the variances are significant depending on the computer performance):

1) Pivot Table (only refresh): 0.19 seconds.
2) VBA Variant Arrays: 0.81 seconds.
3) VBA Dictionaries: 2.78 seconds. Although this was the slowest method, in other situations it can be very useful and it is also very interesting. 

 Code for using dictionaries to take only unique values:
Sub unique_names()

Dim namesdictionary As Dictionary
Set namesdictionary = New Dictionary
Set ws = ActiveSheet
lr = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

ws.Range("N2:N100").ClearContents

'insert unique values to dictionary
For i = 2 To lr

On Error Resume Next
namesdictionary.Add ws.Range("A" & i).Value, 1
On Error GoTo 0

Next i

'write values to column N
r = 2
For Each dKey In namesdictionary.Keys
ws.Range("N" & r) = dKey
r = r + 1
Next


End Sub

Code to refresh the pivot table in VBA:
Sub refresh_pt()

Set ws = ActiveSheet

StartTime = Timer

'refresh pivot
For Each pt In ws.PivotTables

        pt.RefreshTable

Next pt

SecondsElapsed = Round(Timer - StartTime, 2)
ws.Range("J15") = "Time: " & SecondsElapsed & " seconds"
ws.Range("J15").Font.Italic = True
ws.Range("J15:L15").Interior.Color = RGB(255, 128, 128)


End Sub


Link to download the file with all methods.

Hope it will be useful ;)

Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

joi, 30 aprilie 2015

Aplicatie Import si Analiza date de pe site- Partea 2 [VIDEO]

 Aplicația este realizată în Excel 2013 și oferă următoarele funcții:

1) Import automat al datelor financiare din anul dorit pentru toate companiile cu date pe site-ul bursei de valori Bucuresti.
2)  Calculul unor indicatorii proprii pe baza datelor importate.
3)  Un sistem prin care fiecare indicator calculat al unei companii obține un anumit punctaj în funcție de valorile din fiecare an. Prin însumarea punctajelor pe indicatori, fiecare companie obține un punctaj general, iar în final se genereaza raporte cu datele sortate în funcție de aceste punctaje. Cele cu valorile cele mai mari sunt companiile cele mai recomandate pentru cumpărare din punct de vedere fundamental.
Urmăriți mai jos prezentarea parții 2 a aplicației: Importul unor date de pe site, calcul indicatori, calcul punctaje si generare raport.



Descărcați fișierul generat de aplicație in Video 2
Urmăriți si partea 1 a prezentării aici
 
Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

duminică, 26 aprilie 2015

Aplicatie Import si Analiza date de pe site- Partea 1 [VIDEO]

Aplicația este realizată în Excel 2013 și își propune să ofere următoarele funcții:

1) Import automat al datelor financiare din anul dorit pentru toate companiile cu date pe site-ul bursei de valori Bucuresti.
2)  Calculul unor indicatorii proprii pe baza datelor importate.
3) Crearea unui sistem prin care fiecare indicator calculat al unei companii va obține un anumit punctaj în funcție de valorile din fiecare an. Prin însumarea punctajelor pe indicatori, fiecare companie va obține un punctaj general, iar în final voi sorta companiile în funcție de aceste punctaje. Cele cu valorile cele mai mari vor fi cele mai recomandate pentru cumpărare. 

Urmăriți mai jos prezentarea parții 1 a aplicației: Importul datelor de pe site:


Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

joi, 16 aprilie 2015

Ce "reduceri" mai sunt pe bursa

Pe bursa noastră de valori se pot cumpăra multe acțiuni la prețuri extrem de bune din punctul meu de vedere. De exemplu, când mă uit la tabelul de mai jos, mă simt ca în lunile Februarie sau August în mall când peste tot sunt numai afișe cu Sale 75%.. Numai că la bvb reducerile sunt chiar mai mari.. 

Atenție însă, aceste acțiuni sunt foarte riscante și trebuie cumpărate doar cu bani de care nu avem neapărat nevoie în următorii ani.Cu alte cuvinte, sunt doar pentru cei care rezistă să vadă și pierderi de 50% sau 70% în portofoliu fără să își "smulgă părul din cap".

Ideea mea cu aceste acțiuni este că la un moment dat prețurile lor se vor dubla sau chiar tripla cum se întâmplă deseori pe bursă. Totul depinde însă de performanțele economice pe care le vor realiza în următorii ani. Oricum nu sunt companii care funcționează în pierdere de ani de zile, ca alte exemple.


Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

vineri, 10 aprilie 2015

Despre cumpărarea produselor românești.

Astăzi vreau să vă povestesc o întâmplare legată de "mitul" cumpărării de produse made in Romania. Pasionat fiind de ceasuri, am avut nevoie să cumpăr o curea de piele pentru un Seiko. Cum doream ceva puțin mai deosebit (un model "Aviator"), m-am gândit să apelez la cineva din România care oferă curele de ceas hand-made.

Toate bune și frumoase, îmi trimite persoana respectivă pe e-mail vreo zece modele foarte drăguțe de curele împreună cu descriere și detalii despre preț. Aici apare problema. Cel mai ieftin produs costa 100 lei + 20 de lei transport, iar cel mai scump peste 200 de lei + transport. Destul de mult având în vedere că vorbim doar despre o bucată de piele, ce-i drept lucrată manual. Fiind dispus să cheltui maxim 100 de lei pentru acest "moft",  i-am scris vânzătorului că îi pot oferi 100 lei inclusiv transport pentru modelul de 100 lei + 20 de lei transport. Răspunsul nu a întârziat să apară, vânzătorul spunându-mi că nu negociază prețul.

După cum v-am precizat, îmi plac ceasurile și de aceea m-am mai uitat de o curea cum îmi doream și prin alte părți. Astfel, am reușit să găsesc una la fel ca cea confecționată în România, pe ebay.co.uk la un vânzător din Spania, la prețul de 21 euro + 2 euro transport, adică aproximativ 100 lei inclusiv transport. Prima întrebare pe care mi-am pus-o a fost "de ce transportul de la Oradea la București costă aproape 5 euro, iar cel din Spania la București 2 euro ?", iar a doua întrebare a fost "de ce cureaua confecționată în România unde toate costurile sunt mai mici decât în Spania costă mai mult decât cea confecționată în Spania ?" 

Apoi, am intrat într-un cunoscut magazin de ceasuri din magazinul "Unirea" unde am găsit o curea cum căutam la prețul de 70 lei, iar pe etichetă avea înscripționat prețul de 12 euro (aprox. 55 lei), probabil cu cât se vinde în afară...

Deși inițial am dorit să cumpăr un produs "made in România", în final am cumpărat un produs "de afară" deoarece mi s-a oferit un raport calitate-preț mult mai bun pentru ceea ce am dorit să cumpăr. 

Ceea ce doresc să transmit prin acest articol este faptul că pentru ca economia României să prospere, românii să cumpere produse confecționate de români, iar străinii să importe produse confecționate de români, este necesar ca produsele românești să fie competitive, iar raportul preț-calitate să fie  mai bun decât cel al altor produse. Cât timp acest lucru nu se întâmplă, prefer să cumpăr pâine prăjită din Ungaria (cum am văzut în supermaketuri) și curele de ceas din Spania

Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

sâmbătă, 4 aprilie 2015

Regula lui 72: în câți ani dublăm o sumă la o anumită rată anuală a rentabilității ?

Regula lui 72 este o metodă simplificată de a calcula rapid în câți ani dublăm suma investită considerând o rată de rentabilitate fixă anulă în condițiile capitalizării câștigului anual. Aflăm acest lucru împărțind 72 la rata rentabilității.

De exemplu dacă avem 100 de lei la o rată anuală de 10%, dupa primul an vom avea 100 * 10%= 10 lei câștig, în al doilea an 110 lei * 10% = 11 lei și tot asa. În cât timp vom avea 200 de lei ? Folosind Regula lui 72, calculăm 72 / 10 = 7.2 ani, deci peste aproximativ 7.2 ne dublăm suma la o rată anuală de 10%.

Această metodă oferă valori estimative și se utilizează de către investitori pentru a afla foarte rapid o valoare grosieră. După cum putem vedea, în tabelul de mai jos am calculat numărul de ani necesari pntru dublarea investiției la toate ratele cuprinse intre 1% si 100%, utilizând regula lui 72 și calcul matematic exact. Când avem rate de rentabilitate mici regula lui 72 oferă rezultate destul de apropiate de valorile reale, dar în cazul ratelor mari, diferențele sunt semnificative. În aceste cazuri pentru a afla un răspuns corect este necesar să utilizăm formula matematică:
Logaritm în bază (1 + rata dobanzii) de 2.

Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->

vineri, 6 martie 2015

[VIDEO] Aplicatie Excel pentru Calcul Rate Credite Bancare

Mai jos puteți viziona un tutorial de prezentare a unei mini-aplicatii care calculeaza ratele creditelor bancare (pentru credite cu rate egale sau descrescătoare) precum și o sumă maxim recomandabilă de contractare a unui credit în funcție de venitul net introdus de utilizator. 

Fișierul permite de asemenea printarea rapidă sau salvarea în format *pdf a graficului de rambursare al creditului pe care îl simulați. 

Funcții Excel utilizate în realizarea mini-aplicației:
1) Excel VBA (modificare formule in funcție de tipul creditului ales si de numarul de luni introdus, mesaj sumă maximă recomandabilă în funcție de venit, printare rapidă, salvare rapidă ca pdf, rulare cod recalcul credit la modificare valoare credit, procent dobânda și număr luni etc)
2) Funcția PMT (la calculul creditului cu rate egale)
3) Data Validation (la Input Values- Număr Rate nu pot fi introduse valori <0)
4) Formatare Condiționată (la marginile negre dinamice ale celulelor din graficului de rambursare)
5) Funcția Goal Seek (calcul sumă maximă recomandabilă în funcție de venit)


LINK DOWNLOAD APLICATIE !!!

V-ar putea interesa și:
- Smart Invoicer
- Running App
- Working Days Analyzer
- Calculator on-line pentru bursă
- Calculator Salariu Brut pornind de la Net
- Link Collection Manager

Subscribe to Un mod diferit de a privi Economia by Email
Citește în continuare ->