Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 5
  • 4.2K

Potrzebuję napisać prosty programik w Excelu, który będzie pobierał kurs walut z NBP po podaniu daty.

Czyli podaję mu w komórce datę w odpowiednim formacie i on automatycznie sprawdza, jaki był kurs np. Euro w NBP.

Adam_Gesing
  • Zapytał
  • @ Adam_Gesing | 30.05.2014
    • laureat
    • 15
    • 6
    • 52

Odpowiedź (1)

  • 17

Zakładam, że chodzi o daty historyczne.

Na stronie NBP są przechowywane stare kursy walut. Możemy je znaleźć pod adresem:

http://www.nbp.pl/home.aspx?c=/ascx/archa.ascx

Można ściągnąć kursy z całego roku, a potem wyszukiwać.

Zakładam jednak, że chodziło o ściągnięcie kursów tylko z konkretnego dnia.

Na stronie NBP:  http://rss.nbp.pl/kursy/TabelaA.xml

Są przechowywane w postaci plików XML kursy z konkretnego dnia (plik mediów).

 

 

Po wejściu na plik mediów, przechodzimy na stronę:

 

 

Składanie adresu strony:

A - rok dla którego jest podany kurs.

B - dwucyfrowy rok.

C - Numer dnia roboczego w tym roku ( numer zawsze jest trzy znakowy - jeżeli jest krótszy niż trzy znaki to uzupełniany jest cyframi zero).

Rozwiązanie będzie oparte na imporcie informacji z XML-a.

 

  1. W Excelu budujemy listę dat świątecznych. Na arkuszu"Daty" w komórkach jest wypisana lista świąt z roku 2014 (komórki D2:D14). Jeżeli interesować nas będą kursy ze starszych lat,  trzeba tą listę powiększyć o daty świąteczne z tego okresu.

  2. W komórce Excela H3 wpisujemy interesującą nas date - jest tam ustawione sprawdzenie poprawności które nie pozwala wpisać daty świątecznej (lista świat patrz punkt 1)  oraz dat z weekendu (sobota niedziela).

  3. W komórce Excela F3 jest wpisana funkcja =DNI.ROBOCZE(DATA(ROK(H3);1;1);H3;D2:D14).
    1. funkcja liczy ilość dni roboczych pomiędzy datami =dni.robocze(data_pocz;data_koń;święta),
    2. data_pocz - to pierwszy dzień danego roku - dlatego Data(rok(h3);1;1),
    3. data_koń - to data która nas interesuje podana w komórce H3,
    4. święta to nasz lista świąt - patrz punkt 1.
  4. Dodajemy w VBA następujący kod:
    Sub zrob()
    
    Dim kursw As Worksheet
    
    Set dzienr = Nothing
    Set adres = Nothing
            
    ' tworzymy numer dnia roboczego jeżeli jest mniejszy od 10 dodajemy dwa zera
    ' jezeli jest mniejsza niż 100 dodajemy jedno 0
    ' patrz składnia adresu punkt C
    Set dzienr = ActiveWorkbook.Worksheets("daty").Range("f3")
    If dzienr < 100 Then
        
        If dzienr < 10 Then
            dzienr = "00" & dzienr
        End If
    dzienr = "0" & dzienr
    End If
    
    ' aby działało na inne lata budujemu składnie adresu
    rok = Year(Worksheets("daty").Range("h3"))
    znaki = Right(rok, 2)
    adres = "http://rss.nbp.pl/kursy/xml2/" & rok & "/a/" & znaki & "a" & dzienr & ".xml"
    On Error Resume Next
    Set kursw = Sheets("kurs")
    
    On Error GoTo 0
    ' jezeli jest arkusz kurs to
    
    If Not kursw Is Nothing Then
    
    ' jeżeli jest kasujemy wcześniejsze mapowanie xml
    
    If ActiveWorkbook.XmlMaps.Count > 0 Then
    ActiveWorkbook.XmlMaps(1).Delete
    End If
    
    ' jezeli jest kasujemy instniejace połaczenie ze źródłem
    
    If ActiveWorkbook.Connections.Count > 0 Then
    ActiveWorkbook.Connections(1).Delete
    End If
    
    ' wyłaczymy komunikaty
    Application.DisplayAlerts = False
    
    ' kasujemy arkusz
    Sheets("kurs").Delete
    Application.DisplayAlerts = True
    
    End If
    
    ' teraz dodakemu nowy arkusz
    ActiveWorkbook.Worksheets.Add
    ActiveSheet.Name = "kurs"
    
    ' imporutjemy do komórki a1 z wcześniej zbudowanego adresu kurs
        ActiveWorkbook.XmlImport URL:= _
            adres, ImportMap:=Nothing, _
            Overwrite:=True, Destination:=Range("$A$1")
    
    
    End Sub
    
    
    

Załączniki

  • xlsm

    waluty.xlsm ( 24K )
  • Odpowiedział
  • @ | 02.06.2014
  • TRENER ALTKOM AKADEMII
Komentarze
Dziekuję za "Ciekawe pytanie" oczywiście o historyczne dane. Jakby Pan miał kalkulator do kursów walut NBP na przyszłość to wchodzę z Panem w spółkę i jesteśmy bogaci :)
Skomentował : @ Adam_Gesing ,02.06.2014
  • 15
  • 6
  • 52