Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Predlog - korisna funkcija za kursnu listu NBS

[es] :: Office :: Excel :: Predlog - korisna funkcija za kursnu listu NBS

Strane: 1 2

[ Pregleda: 2153 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Predlog - korisna funkcija za kursnu listu NBS12.07.2017. u 17:55 - pre 4 meseca
Hteo bih da predlozim naprednim korisnicima foruma, da naprave nesto sto svima u poslovnom svetu veoma treba a ne mogu da verujem da niko nije napravio.

Naime, pretpostavljam da nije preterano tesko da se napravi VBA funkcija koja ocitava sa NBS-a prodajni, kupovni i srednji kurs na odredjeni dan. Funkcija bi trebala da vraca vrednost prodajnog, kupovnog ili srednjeg kursa neke od valuta (bilo bi super ako se moze uneti naziv valute pa da funkcija u zavisnosti od naziva vraca odredjenu vrednost).

Npr. =NBS("srednji";"EUR";A1)
U polju A1 je datum za koji trazimo kurs

To se lako resava kod vecih tabela tako sto skinemo sa NBS-a kurseve EUR za odredjeni vremenski period pa se preko Vlookup-a povezuje sa potrebnom tabelom. Medjutim kada bi postojala jednostavna funkcija (kao gore navedena), pretpostavljam da bi bila pravi hit.

Naravno, pitanje je i koliko brzo bi ta funkcija mogla da radi ukoliko je koristimo u nekoj velikoj tabeli pa je potrebno puno puta da skine kurs za kratko vreme, ali za manje tabele za cega se cesto koristi, verujem da bi bila pravi hit, jer jednostavnije je upisati =NBS("srednji";"EUR";A1) nego otvarati Chrome, pa NBS, pa kursna lista, pa datum... da se dodje do trazenog podatka.

Eto, ako neko ima vremena i zeli malo da se razonodi, kontam da bi to bila super ideja.
P.S. Postoji dosta resenja koja prikazuju te kurseve u tabelarnim oblicima i sl, ali nikada nisam video funkciju kao gore navedenu.
 
Odgovor na temu

Jpeca
Predrag Jovanović
poslovni analitičar
Gowi
Pančevo

Moderator
Član broj: 25683
Poruke: 1979
89.216.49.*

Sajt: www.gowi.rs


Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 09:33 - pre 4 meseca
Evo jedna varijanta u prilogu.

Iskoristio sam postojeći api sa sajta kursna-lista i pozvao ga iz Excela. Rezultat je XML sa kursevima za zadati datum. Onda se XML parsira za valutu i tip kursa i dobije rezultat preko funkicija KursNBS. Upakovao sam to u add-in Kursnalista.

Sačuvati ovaj add-in iz priloga kod sebe - najbolje u folder za add-in %appdata%\Roaming\Microsoft\AddIns.
Nakon toga dodati ovaj add-in iz priloga u Excel - File > Options > Add > Add-Ins
Izabrati Manage: Excel Add-ins, Go...pa uključiti Add-in Kursanlista


Na taj način funkcija KursNBS biće dostupna u svim radnim sveskam. Postavio sam je u kategoriju Financial i u dijalogu Insert Function trebalo bi da dobiješ objašnjenje i argumente. OznakaValute i Tip su opcioni argumenti .


Neki primeri korišćenja su - ćelija A1 je datum:
Code:
=KursNBS(A1) 
=KursNBS(A1, "USD", "pro") 


AddIn nije zaštićen, pa može da se gleda i menja kod.



[Ovu poruku je menjao Jpeca dana 14.07.2017. u 11:09 GMT+1]
Nije to loše Rembrante, samo što ne bi dodao još malo boje?
Prikačeni fajlovi
 
Odgovor na temu

ib.kroki
Beograd

Član broj: 188338
Poruke: 755
*.adsl.verat.net.

Sajt: www.e-oglasi.rs


Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 12:30 - pre 4 meseca
Ave, Cesare!

P.S.
Možda bi bilo korisno preimenovati temu (Kursna lista NBS) zarad budućih pretraga i pokoljenja.

Zvoni, kucanje ne radi ...
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.static.isp.telekom.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 15:04 - pre 4 meseca
Još nisam probao, ali nema razloga da verujem da ne radi.
Sjajno rešenje. hvala ti mnogo, ovo će biti jedna od korišćenijih funkcija.


Mogući problemi:
- Kao što rekoh nisam koristio ali, da li je predviđeno i kako se manifestuje ukoliko iz nekog razloga funkcija ne uspe da skine kursnu listu ili se unese pogrešan datum npr. 31.02.2017. godine?
- Primetio sam prilikom svakodnevnog posećivanja NBS-a da nekada prikazuju kurs sa decimalnom tačkom a nekada sa decimalnim zarezom što bi možda moglo da napravi problem?


EDIT: Sada vidim da se kursna lista ne preuzima sa NBS-a već sa nekog drugog sajta. To može biti opasno, pošto se mora verovati nekom trećem da je uneo tačan kurs, pa tema postaje malo škakljiva za ozbiljni posao.
 
Odgovor na temu

mjanjic
Mladen Janjić
Čačak

Član broj: 187539
Poruke: 220
91.187.132.*



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 15:51 - pre 4 meseca
Sajt traži registraciju za pristup API-ju, inače podržava XML, JSON, HTML i PHP serialize, za PHP je naveden primer:
Code:
$api_id = 'f53ec1381124cf3ac11a0ac413c7ee76'; // Vaš API ID
$url = 'https://api.kursna-lista.info/'.$api_id.'/konvertor/eur/usd/20';


"Pribavite" sadržaj linka "https://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat" i 'odaberete' vrednost koja vam je potrebna.

Drugi način, preko sledeće forme: http://www.nbs.rs/export/sites...t/latinica/scripts/ondate.html
U ovoj stranici je u stvari forma ubačena kao iFrame sa ovde adrese: http://www.nbs.rs/kursnaListaModul/naZeljeniDan.faces?lang=lat

U JavaScript-u na kraju stranice imate funkciju Otvori() pa vidite može li se nabudžiti da radi direktno iz neke aplikacije.
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 17:57 - pre 4 meseca
Testirao sam funkciju i na malom uzorku potvrdio da ne radi kako treba.
Izvukao sam kursnu listu sa NBS-a za period od 01.01.2017-14.07.2017. godine.
To je kolona "SREDNJI KURS".
Pored sam otvorio kolonu "Funkcija NBS" i tu sam od datuma iz tabele zatrazio od funkcije da mi vrati srednji kurs EUR.
Poslednja kolona "Razlika" pokazuje odstupanja od stvarnog kursa, sto znaci da je funkcija nepouzdana.

Dakle, funkcija je savrseno zamisljena sto se funkcionalnosti tice. Nista vise od ulaznih parametara nije potrebno. Ali je potrebno da se uradi preuzimanje podataka sa sajta NBS-a jer tu su jedini relevantni podaci. Preuzimanje sa bilo kog drugog sajta dovodi do toga da se sve mora jos i rucno pregledati cime se gubi smisao funkcije.

Prikačeni fajlovi
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 20:49 - pre 4 meseca
Ne znam nista na temu parsiranja html-a ali evo nije me mrzelo da napravim svoj doprinos istom.

Napravio sam code koji ocitava sa NBS-a srednji kurs eur. Posto se ja amaterski bavim programiranjem, zeleo bih da code sredi neko kome je to struka kako bi bio optimizovan za brzi rad, jer kada je pretvorimo u funkciju, ona se moze u jednom dokumentu koristiti na hiljade puta pa je bitno da se code brzo izvrsava.

Problemi mog code-a:
- ocitava se stranica https://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat koja daje samo srednji kurs EUR na dan kada se stranica otvara
- ne postoji nacin biranja datuma za koji se prikazuje kurs EUR

Zamolio bih ko se razume u web programiranje da pronadje na koji nacin se generise adresa u zavisnosti od datuma koji se izabere na stranici http://www.nbs.rs/export/sites...t/latinica/scripts/ondate.html

Mislim da je mnogo bolje da se shvati kako se generise http adresa liste na odredneni dan, nego da se simulira upis datuma, pa klik na dugme prikazi, sto bi sigurno usporilo rad funkcije.

Code:


Sub kursNBS()
    Dim oDom As Object: Set oDom = CreateObject("htmlFile")
    Dim oRow As Object, oCell As Object
    
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "https://www.nbs.rs/kursnaListaModul/srednjiKurs.faces?lang=lat", False
        .Send
        oDom.body.innerHtml = .responseText
    End With
    
    With oDom.getelementsbytagname("TABLE")(1)

        ReDim data(.Rows.Length, .Rows(1).Cells.Length)
        
        For Each oRow In .Rows 'prolazim kroz sve redove u tabeli 1
                    'u 2. redu trazim oznaku za valutu             'ocitavam kurs iz 4. reda
            If oRow.Cells(2).innerText = "EUR" Then MsgBox (oRow.Cells(4).innerText)
        Next oRow
  
End Sub

 
Odgovor na temu

Jpeca
Predrag Jovanović
poslovni analitičar
Gowi
Pančevo

Moderator
Član broj: 25683
Poruke: 1979
*.dynamic.vipmobile.rs.

Sajt: www.gowi.rs


Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 20:53 - pre 4 meseca
Naravno da ne mogu da garantujem da ovo radi i za neke ozbiljne primene ne mogu ni da preporučim. Verujem da na sajtu kursna-lista ne unose podatke ručno, da bi došlo do greške nego dobijaju na neki način podatke od NBS. Međutim, svaki proces je podložan greškama. I ja sam ovaj program uradio na brzinu kao primer, i bez detaljnog testiranja. Uostalom, ubrzo sam uvideo sam da je bio problem oko kupovnog i prodajnog kursa pa sam ispravio i zamenio add-in.
Hvala na testiranju. Za greške koje si primetio izgleda da imaju neke veze sa državnim praznicima, pa sam uputio pitanje na sajtu - videćemo da li će stići odgovor.

Ja kao fizčko lice imam samo pristup stranci https://www.nbs.rs/export/site...t/cirilica/scripts/ondate.html, ali ona zahteva interakciju sa korisnikom - izbor datum -pa nije baš najzgodnija da se koristi - ne kažem da nije moguće, ali zahtevalo bi malo više rada - možda C# sa Selenium bibliotekom od onog što ja znam
Parsiranje html nije problem (uostalom ima drugih formata) - problem je potreba za interakcijom na stranici. Za pravna lica NBS ima web servis pa se tako može pristupiti kursnoj listi - to je mnogo pogodnije za automatizaciju nego programiranje interakcje.

[Ovu poruku je menjao Jpeca dana 14.07.2017. u 22:07 GMT+1]
Nije to loše Rembrante, samo što ne bi dodao još malo boje?
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 708
*.bvcom.net.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 21:22 - pre 4 meseca
Evo ti link gde se jasno vidi stranica. Ako pogodis form parametre i posaljes pravi post request dobices sta zelis . Vracaju u vise formata, cak i u excel tako da nema potrebe za parsovanjem.
https://www.nbs.rs/kursnaListaModul/naZeljeniDan.faces?lang=lat
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS14.07.2017. u 21:51 - pre 4 meseca
Evo je i sama funkcija. Resio sam gore pomenute probleme.

E sada bi bilo dobro da neko optimizuje code, i da obradi greske, jer nemam nikakvu rutinu ukoliko ne uspe da ocita stranicu i sl.

EDIT. Testirao sam funkciju i daje sve tacne podatke. Trebace jos ispraviti samo kada se racuna srednji kurs, NBS ga racuna na 4 decimale ali ako se pojavi 5. decimala, cetvrtu nece zaokruziti nego odseci. Npr kurs 121.12425 za njih nije 121.1243 vec samo odseku peticu 121.1242

Code:

Public Function kursNBS(datum As Date, Optional kojaValuta, Optional kojiKurs) As Double
    Dim oDom As Object: Set oDom = CreateObject("htmlFile")
    Dim oRow As Object, oCell As Object
    Dim kupovni As Double
    Dim prodajni As Double
    Dim srednji As Double
    
    If datum = "00:00:00" Then kursNBS = "": Exit Function 'ako nije unet datum, on ima vrednost "00:00:00" i vracam gresku #VALUE!
    If IsMissing(kojaValuta) = True Then kojaValuta = "EUR"
    If IsMissing(kojiKurs) = True Then kojiKurs = "sre"
   
   ' pretvaram kojiKurs u mala slova
   kojiKurs = LCase(Left(Trim(kojiKurs), 3))
   kojaValuta = Trim(kojaValuta)
    
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "http://www.nbs.rs/kursnaListaModul/zaDevize.faces?date=" & datum & ".&listno=&year=" & Year(datum) & "&listtype=html&lang=lat", False
        .Send
        oDom.body.innerHtml = .responseText
    End With
    
    With oDom.getelementsbytagname("TABLE")(1)
     
        For Each oRow In .Rows 'prolazim kroz sve redove u tabeli 1
                    'u 2. koloni trazim oznaku za valutu
            If oRow.Cells(2).innerText = kojaValuta Then
                kupovni = Val(oRow.Cells(4).innerText) 'u 4. koloni trazim kupovni
                prodajni = Val(oRow.Cells(5).innerText) 'u 5. koloni trazim prodajni
                srednji = (kupovni + prodajni) / 2
                
                If kojiKurs = "sre" Then kursNBS = srednji: Exit Function
                If kojiKurs = "kup" Then kursNBS = kupovni: Exit Function
                If kojiKurs = "pro" Then kursNBS = prodajni: Exit Function
            End If
        Next oRow
    End With
End Function


Sub RegisterUDF()
   Dim FuncName As String
   Dim FuncDesc As String
   Dim Category As String
   Dim ArgDesc(1 To 3) As String
   
   FuncName = "KursNBS"
   FuncDesc = "Kurs odredjene valute na dan preko api poziva NBS.com"
   Category = 1 'Financial Category
   ArgDesc(1) = "Dan za koji se traži kursna lista"
   ArgDesc(2) = "eur, usd, gbp, chf - videti na sajtu kursna lista. Defult je eur"
   ArgDesc(3) = "Tip Kursakupovni, srednji ili prodajni. Default je srednji"
   
   Application.MacroOptions _
      Macro:=FuncName, _
      Description:=FuncDesc, _
      Category:=Category, _
      ArgumentDescriptions:=ArgDesc
End Sub

Sub UnregisterUDF()
    Application.MacroOptions Macro:="KursNBS", Description:=Empty, Category:=Empty
End Sub



Koliko sam uspeo do sada primetiti funkcija ima samo jedan problem. Nacin na koji formiram http link za odredjeni datum radi dobro u svim slucajevima, osim u slucaju da korisnik zatrazi neki datum unapred. Npr. ukoliko je danas 15.07.2017. a ja zatrazim kurs na dan 20.07.2017. godine, otvorice se stranica sa kursom na dan 15.07.2017. godine, dakle sa kursom na poslednji poznati datum.

To se moze izbeci tako sto cu ubaciti da izbaci gresku ukoliko je ulazni datum veci od danasnjeg ali ne znam koliko je to pametno jer primera radi neko moze traziti upit 15.07.2017. godine za dan 15.07.2017. godine ujutru u 7h kada kursna lista za taj dan jos nije fomirana, pa moze doi do greske posto se kursna lista formira oko 8h ujutru. To je jedini problem koji mi trenutno pada na pamet.


[Ovu poruku je menjao Blue82 dana 16.07.2017. u 09:35 GMT+1]
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 708
*.bvcom.net.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS15.07.2017. u 02:54 - pre 4 meseca
Lepo si to izveo. Bilo bi cool da moze lako da se izvuce i csv ili excel file ali izgleda da ~/naZeljeniDan.facet stranica trazi jsessionid cookie i mora da se povuce i javax.faces.viewState sakriveno polje.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12220



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS15.07.2017. u 09:55 - pre 4 meseca
Citat:
Jpeca: možda C# sa Selenium bibliotekom od onog što ja znam
Parsiranje html nije problem (uostalom ima drugih formata) - problem je potreba za interakcijom na stranici.

Interakcija na stranici nije problem. Sve to sto ti popunis na stranici se salje u jednom request-u kada kliknes na dugme na kraju. Ti taj isti request mozes napraviti bez ikakve prethodne klik-klik interakcije.
No, postoji tu jos nesto sto se ne vidi a to je da NBS koristi sesiju. Interakcija nije potrebna i taj deo mozes odraditi kao sto sam prethodno rekao ali NBS takodje proverava i cookie tako da moras prvo ucitati stranicu sa formularom i zapamtiti cookie koji ti je poslat pa ga posle koristiti (sam formular je nebitan).

Ah da, Selenium ti za sve to nimalo nije potreban. Cist C# sa onim sto se dobija u .NET Framework-u je dovoljan.
There is no cloud; just someone else's computer.
 
Odgovor na temu

Jpeca
Predrag Jovanović
poslovni analitičar
Gowi
Pančevo

Moderator
Član broj: 25683
Poruke: 1979
77.243.25.*

Sajt: www.gowi.rs


Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS16.07.2017. u 11:02 - pre 4 meseca
Sa kodom od gore, ja dobijam rezultat 0 za prazanu ćeliju kao referencu, a koliko sam razumeo komentar, namera je bila da se vrati greška #VALUE!. Ubacio sapomoćnu funkciju koja provareva datum - da li je trenutak poziva funkcije > zadati datum u 8 h, pa tu proveravam i da li je datum prazan i u tom slučaju funkcija vraća #VALUE! - CVErr(xlErrValue). Odvojio sam proveru datuma zbog nekih budućih dodatnih provera - od kog datuma postoji kursna lista u ovom obliku?

Code:
Public Function kursNBS(datum As Date, Optional kojaValuta, Optional kojiKurs) As Double
    Dim oDom As Object: Set oDom = CreateObject("htmlFile")
    Dim oRow As Object, oCell As Object
    Dim kupovni As Double
    Dim prodajni As Double
    Dim srednji As Double
    ' Provera datuma
    ' ako nije unet datum, on ima vrednost "00:00:00" i vracam gresku #VALUE!
    If Not (CheckDate(datum)) Then
        kursNBS1 = CVErr(xlErrValue)
        Exit Function
    End If
    ' Default parametri
    If IsMissing(kojaValuta) = True Then kojaValuta = "EUR"
    If IsMissing(kojiKurs) = True Then kojiKurs = "sre"
   
   ' Pretvaram kojiKurs u mala slova
    kojiKurs = LCase(Left(Trim(kojiKurs), 3))
    kojaValuta = Trim(kojaValuta)
     
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "http://www.nbs.rs/kursnaListaModul/zaDevize.faces?date=" & datum & ".&listno=&year=" & Year(datum) & "&listtype=html&lang=lat", False
        .Send
        oDom.body.innerHtml = .responseText
    End With
    
    With oDom.getelementsbytagname("TABLE")(1)
     
        For Each oRow In .Rows 'prolazim kroz sve redove u tabeli 1
                    'u 2. koloni trazim oznaku za valutu
            If oRow.Cells(2).innerText = kojaValuta Then
                kupovni = Val(oRow.Cells(4).innerText) 'u 4. koloni trazim kupovni
                prodajni = Val(oRow.Cells(5).innerText) 'u 5. koloni trazim prodajni
                srednji = (kupovni + prodajni) / 2                
                If kojiKurs = "sre" Then kursNBS = srednji: Exit Function
                If kojiKurs = "kup" Then kursNBS = kupovni: Exit Function
                If kojiKurs = "pro" Then kursNBS = prodajni: Exit Function
            End If
        Next oRow
    End With
End Function

Private Function CheckDate(dat As Date) As Boolean
' Pomocna funkcija za proveru zadataog datuma
'
    If dat <= 0 Then ' Provera da li je unesen datum
        CheckDate = False
        Exit Function
    End If           'Provera da li je datum u budućnosti
    If dat + 8 / 24 > Now() Then
        CheckDate = False
        Exit Function
    End If
    CheckDate = True
    
End Function


Ako postoji problem sa zaoukruživanjem javi da i to rešimo.

Samo napomena za RegisterUDF - to nema suštinski značaj nego je način da se dobije opis za korisničku funkciju i parametre (pomoć) u dijalogu Insert function. Startuje se samo jednom i u toj radnoj svesci će biti opis za funkciju. Ako je potrebno da funkcija bute raspoloživa u svim radnim sveskama, onda je staviti u add in i tamo startovati RegisterUDF. UnregisterUDF je (koristan) višak, tu je ako zatreba da se nešto menja u opisu funkcije i parametara

@Shadowed:
Sigurno postoji mnogo načina da se to uradi, ali ja ih ne znam. Pre negog vremena sam radio automatske testove za web stranice - a ovo mi ličilo na to - pa su me uputili (ne znam da li je tačno) da je lakše sa bibliotekom Selenium WebDriver. U svakom slučaju Branimir Maksimovic je dao drugo rešenje, tako da nije bitno za ovu temu.
Nije to loše Rembrante, samo što ne bi dodao još malo boje?
 
Odgovor na temu

Brodoplovac
Beograd

Član broj: 171299
Poruke: 778
..252.195.adsl.dyn.beotel.net.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS16.07.2017. u 12:41 - pre 4 meseca
Ovo je fajl koji sam napravio za sebe na poslu. Podaci se uzimaju sa domaceg sajta http://www.icbbg.rs/ser/berza/kurs.php?smb=EUR. Na ovom sajtu su podaci za poslednjih mesec dana. Podaci se preuzimaju preko Power Querija.

Svrha ovog fajla je da imam sve kurseve od 2012. do danas. u jednoj tabeli.

U fajlu je makro koji u sporednom sheetu čuva stare kurseve i kada se fajl osveži on doda i te poslednje kurseve. Fajl se treba osvažavati barem jednom mesečno kako se ne bi javljale praznine u datumima. Makro se pokreće dugmetom u vrhu sheeta. Kada se pojavi msgbox da su podaci osveženi, zatvorite msgbox i sačekajte još malo jer je potrebno da Power Query dodatno još obavi sređivanje podataka.

Fajl popunjava dane do kraja godine sa poslednjim kursom. To je korisno ako imate neke podatke sa budućim datumima.

Fajl preuzima i USD kurs.

[Ovu poruku je menjao Brodoplovac dana 16.07.2017. u 14:03 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS16.07.2017. u 14:55 - pre 4 meseca
Kursna lista postoji od datuma 15. maja 2002. godine, pa nadalje.
Sto se tice RegisterUDF jasno mi je cemu sluzi, ali mi nije jasno zasto on radi u Excel 2013 a ne radi u Excel 2007.

Ubacio sam i da izbaci gresku za datume starije od 15.05.2002. godine.

Sto se tice zaokruzivanja nisam jos siguran sta tacno rade posto sam naleteo samo na jedan slucaj. To je slucaj kada je poslednja cifra 5, a znamo i matematicki da je tada dozvoljeno da se zaokruzi na cifru vise ili ostavi bez zaokruzivanja, zavisno od metode koja se koristi.

Code:

Public Function kursNBS(datum As Date, Optional kojaValuta, Optional kojiKurs) As Double
    Dim oDom As Object: Set oDom = CreateObject("htmlFile")
    Dim oRow As Object, oCell As Object
    Dim kupovni As Double
    Dim prodajni As Double
    Dim srednji As Double
    
    ' Provera datuma
    If Not (CheckDate(datum)) Then
        kursNBS = CVErr(xlErrValue) 'vraca #VALUE!
        Exit Function
    End If
    ' Default parametri
    If IsMissing(kojaValuta) = True Then kojaValuta = "EUR"
    If IsMissing(kojiKurs) = True Then kojiKurs = "sre"
      
    kojiKurs = LCase(Left(Trim(kojiKurs), 3)) ' Pretvaram kojiKurs u mala slova
    kojaValuta = UCase(Trim(kojaValuta)) 'pretvaram valutu (npr EUR) u velika slova.
     
    With CreateObject("msxml2.xmlhttp")
        .Open "GET", "http://www.nbs.rs/kursnaListaModul/zaDevize.faces?date=" & datum & ".&listno=&year=" & Year(datum) & "&listtype=html&lang=lat", False
        .Send
        oDom.body.innerHtml = .responseText
    End With
    
    With oDom.getelementsbytagname("TABLE")(1)
     
        For Each oRow In .Rows 'prolazim kroz sve redove u tabeli 1
                    'u 2. koloni trazim oznaku za valutu
            If oRow.Cells(2).innerText = kojaValuta Then
                kupovni = Val(oRow.Cells(4).innerText) 'u 4. koloni trazim kupovni
                prodajni = Val(oRow.Cells(5).innerText) 'u 5. koloni trazim prodajni
                srednji = (kupovni + prodajni) / 2
                If kojiKurs = "sre" Then kursNBS = srednji: Exit Function
                If kojiKurs = "kup" Then kursNBS = kupovni: Exit Function
                If kojiKurs = "pro" Then kursNBS = prodajni: Exit Function
            End If
        Next oRow
    End With
End Function

Private Function CheckDate(dat As Date) As Boolean
' Pomocna funkcija za proveru ispravnosti zadatog datuma
    If dat <= 0 Then ' Provera da li je unesen datum
        CheckDate = False
        Exit Function
    End If           'Provera da li je datum u buducnosti. Kursna lista se formira tek u 8h svakog dana
    If dat + 8 / 24 > Now() Then
        CheckDate = False
        Exit Function
    End If     'na sajtu NBS ne postoje datumi pre 15.05.2002. godine
    If dat < "15.05.2002" Then
        CheckDate = False
        Exit Function
    End If
    CheckDate = True
End Function

Sub RegisterUDF()
   Dim FuncName As String
   Dim FuncDesc As String
   Dim Category As String
   Dim ArgDesc(1 To 3) As String
   
   FuncName = "KursNBS"
   FuncDesc = "Kurs odredjene valute na dan preko api poziva NBS.com"
   Category = 1 'Financial Category
   ArgDesc(1) = "Dan za koji se traži kursna lista"
   ArgDesc(2) = "eur, usd, gbp, chf - videti na sajtu kursna lista. Defult je eur"
   ArgDesc(3) = "Tip Kursakupovni, srednji ili prodajni. Default je srednji"
   
   Application.MacroOptions _
      Macro:=FuncName, _
      Description:=FuncDesc, _
      Category:=Category, _
      ArgumentDescriptions:=ArgDesc
End Sub

Sub UnregisterUDF()
    Application.MacroOptions Macro:="KursNBS", Description:=Empty, Category:=Empty
End Sub



Primetio sam jedan "problem" koji se manifestuje samo kod tabela sa velikim brojem upita za neki od kurseva.
Naime, kada postoji puno upita za kurs, u zavisnosti od brzine Interneta, potrebno je odredjeno vreme da se kursevi skinu, sto nije problematicno. Eventualni problem je sto ukoliko se npr u tabeli koristi filter, kada filtliramo neku vrednost, Excel ponovo osvezava sve unose cini mi se da ponovo skida sve podatke sa sajta. Moze se to resiti tako sto kad se prvi put ocitaju kursevi, sve prelepimo sa paste values, jer jednom ocitan kurs se nece menjati, ali me cisto informaticki zanima moze li se spreciti da ih ponovo osvezava prilikom manipulacijom tabele?

[Ovu poruku je menjao Blue82 dana 16.07.2017. u 16:33 GMT+1]
 
Odgovor na temu

ib.kroki
Beograd

Član broj: 188338
Poruke: 755
*.adsl.verat.net.

Sajt: www.e-oglasi.rs


Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS16.07.2017. u 15:28 - pre 4 meseca
Pratim temu iako ne mogu doprineti.

Rešenje koje je @Jpeca postavio sa Excel Add-ins kod mene radi.

Pokušao sam primeniti f-ju koju je postavio @Blue82, ali ne uspevam da je koristim. Moguće da nisam kod kopirao na odgovarajuće mesto. Molim vas da neko postavi excel fajl u kom radi pomenuta f-ja.
Unapred hvala!
Zvoni, kucanje ne radi ...
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS16.07.2017. u 15:37 - pre 4 meseca
Pretpostavljam da ti je jos aktivna njegova Add-ins koju si prvobitno isprobao, a posto se obe funkcije zovu isto, da ti to pravi problem. Nema nikakve posebne procedure. Samo u projekat ubacis novi modul i u njega paste code koji smo postavili.

Kada ga doradimo do kraja napravicemo Add-ins da ga lakse koristis.
 
Odgovor na temu

ib.kroki
Beograd

Član broj: 188338
Poruke: 755
*.adsl.verat.net.

Sajt: www.e-oglasi.rs


Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS17.07.2017. u 11:39 - pre 4 meseca
@Blue82
Da, problem je bio zbog aktivnog Add-ins.

@Jpeca
Sada imamo mogućnost da se povlače informacije sa dva različita sajta i možda bi bilo dobro da preradiš svoj dodatak i preimenuješ funkciju (npr KursnaLista) kako ne bi dolazile u "sukob".
Zvoni, kucanje ne radi ...
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 732
*.dynamic.sbb.rs.



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS06.08.2017. u 09:06 - pre 3 meseca
Poslednji update:

Moram da upozorim sve koji koriste ovaj metod skidanja SREDNJEG kursa NBS, da nije potpuno tacan pa se u njega ne mozete pouzdati.

Naime izgleda da nam metodologija obracuna srednjeg kursa nije dobra. Srednji kurs racunamo kao prosek prodajnog i kupovnog kursa sto je gotovo uvek tako ali pronasao sam slucajeve kada nije. Zna li neko kako se dobija srednji kurs? Ja koliko sam znao, NBS odredjuje srednji kurs a onda se na njega dodaje i oduzima odredjeni broj poena u zavisnosti da li je kurs prodajni ili kupovni, sto odlukom odredjuje guvener. Medjutim izgleda da taj broj ne mora biti isti za prodajni i za kupovni kurs.

Pogledajte npr datum 07.04.2006.
Ako uzmem pregled kursa ZA DEVIZE dobicu sledecu tabelu:


A ako uzmem pregled srednjeg kursa za isti dan, dobicu sledecu tabelu:


U prvoj tabeli kazu da je srednji kurs 86.6500 sto je srednja vrednost izmedju kupovnog i prodajnog kursa.
Ali u drugoj tabeli gre zatrazim podatak za isti datum ali ovoga puta ne zatrazim podatak "ZA DEVIZE" vec "SREDNJI KURS" dobicu drugu vrednost srednjeg kursa.
Prikačeni fajlovi
 
Odgovor na temu

kalimero 011

Član broj: 155560
Poruke: 1134



Profil

icon Re: Predlog - korisna funkcija za kursnu listu NBS06.08.2017. u 10:47 - pre 3 meseca
^
Citat:
Blue82: Zna li neko kako se dobija srednji kurs? Ja koliko sam znao, NBS odredjuje srednji kurs a onda se na njega dodaje i oduzima odredjeni broj poena u zavisnosti da li je kurs prodajni ili kupovni, sto odlukom odredjuje guvener.

Tako je, srednji kurs (bi trebalo da) se određuje tržišno, a kupovni/prodajni za devize i efektivu na osnovu oduzimanja/dodavanja marže koju određuje guverner odlukom.
Citat:
Blue82:Medjutim izgleda da taj broj ne mora biti isti za prodajni i za kupovni kurs.

Koliko mi je poznato nije se dešavalo da marža bude nesimetrična, ali to nije zabranjeno. Međutim, ovde to nije slučaj.
Citat:
Blue82: Ali u drugoj tabeli gre zatrazim podatak za isti datum ali ovoga puta ne zatrazim podatak "ZA DEVIZE" vec "SREDNJI KURS" dobicu drugu vrednost srednjeg kursa.

Ne gledaš iste kursne liste. ;) Prva je broj 67 iz 2006, a druga broj 66 iz te godine. Ono što te buni je posledica toga što su se u to vreme kursne liste objavljivale drugačije - srednji kurs sa važenjem od 00h do 00h sledećeg dana, a kursevi za devize sa važenjem od 14h do 14h sledećeg dana (odnosno do objave naredne). To je dovodilo do toga da ti u periodu od 14h do 00h narednog dana praktično imaš razliku između zvaničnog srednjeg kursa i onog koji se dobije ovom metodom koju koristiš ((kupovni+prodajni)/2). To je promenjeno baš negde tih godina i to tako da svi kursevi važe od 08h do 08h narednog dana.
 
Odgovor na temu

[es] :: Office :: Excel :: Predlog - korisna funkcija za kursnu listu NBS

Strane: 1 2

[ Pregleda: 2153 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.