Excelde TCMB Kurlarını Alma (Yeni)

Katılım
25 Nisan 2024
Mesajlar
2
Excel Vers. ve Dili
Excel 2016 İngilizce
Merhaba,

TCMB web servislerinde http request header zorunlu olacak şekilde değişiklik yapılacak. Veriyi, Excel 2016 da Data-> From Web seçeneği yerine aşağıdaki kullanım kılavuzuna göre macro ile nasıl set edip çekebiliriz?

Teşekkürler.



NOT: Sorgu URL'indeki key=XXX verisi, kullanıcıya verilen TCMB API keydir.

TCMB DUYURU
URL adresinden giden “key” parametresinin artık http request header içinde gelmesi ve web servis kullanan uygulamalarınızda “key=xxxxxx” parametresini http request header olarak dönüştürmeniz gerektiği belirtilmişti. Bu düzenleme 05 Nisan 2024 Cuma saat 21:00 TSİ tarihinden itibaren geçerli olacaktır. Kullanıcılara, değişikliği test etme olanağının sağlanması amacıyla, halen kullanılan uygulama 25 Nisan 2024 Perşembe saat 21:00 TSİ ye kadar yeni uygulama ile birlikte kullanılabilir olacaktır. 26 Nisan 2024 Cuma gününden itibaren sadece yeni sürüm kullanılabilecektir. Tüm web servis kullanıcılarına duyurulur.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,271
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Bilgilendirme için teşekkür ederim; haberim yoktu...

Aşağıdaki gibi kullanabilirsiniz (test edilmiştir):

C#:
Sub Test()
    Dim oHttp As Object, sUrl As String
    
    sUrl = "https://evds2.tcmb.gov.tr/service/evds/series=TP.DK.USD.A-TP.DK.EUR.A-TP.DK.CHF.A-TP.DK.GBP.A-TP.DK.JPY.A&" & _
            "startDate=01-10-2017&endDate=01-11-2017&type=xml"
            
    Set oHttp = CreateObject("MSXML2.XMLHTTP.6.0")
    
    oHttp.Open "GET", sUrl, False
    oHttp.setRequestHeader "key", "XXXXXXXX"
    oHttp.send
    
    Debug.Print oHttp.ResponseText
    
End Sub
.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Sistemin değiştiğini ben de bilmiyordum...... Zeki Beyin koduna ilave olarak geri dönen XML verilerini sayfaya yazdırmak için aşağıdaki gibi bir alternatif kullanılabilir.....

Gerçi burada ben 25/04/2024 tarihini başlangıç ve bitiş olarak kullandım ama sunucudan 24/04/2024 tarihli veriler geldi...... Biraz daha kurcalamak gerekebilir...

C#:
Sub Test()
'   Haluk - 25/04/2024
    Dim strURL As String, objHTTP As Object, XDoc As Object, myList As Object, Num As Integer, i As Integer
    
    strURL = "https://evds2.tcmb.gov.tr/service/evds/series=TP.DK.USD.S-TP.DK.EUR.S-TP.DK.CHF.S-TP.DK.GBP.S-TP.DK.JPY.S&" & _
             "startDate=01-04-2024&endDate=05-04-2024&type=xml"
            
    Set objHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
    
    objHTTP.Open "GET", strURL, False
    objHTTP.setRequestHeader "key", "vnFfzWvidO"
    objHTTP.send
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False
    XDoc.validateOnParse = False
    
    XDoc.LoadXML (objHTTP.responseText)
'    XDoc.Save (ThisWorkbook.Path & "\TCMB_Kur.xml")
   
    Set myList = XDoc.SelectNodes("document/items")
    
    If myList.Length = 0 Then GoTo SafeExit:
    
    Num = myList.Length
    
    With Range("A1:F1")
        .Value = Array("USD", "EUR", "CHF", "GBP", "JPY", "Tarih")
        .Font.Bold = True
        .HorizontalAlignment = xlRight
    End With
    
    For i = 0 To Num - 1
        Cells(i + 2, 1) = myList(i).SelectSingleNode("TP_DK_USD_S").Text
        Cells(i + 2, 2) = myList(i).SelectSingleNode("TP_DK_EUR_S").Text
        Cells(i + 2, 3) = myList(i).SelectSingleNode("TP_DK_CHF_S").Text
        Cells(i + 2, 4) = myList(i).SelectSingleNode("TP_DK_GBP_S").Text
        Cells(i + 2, 5) = myList(i).SelectSingleNode("TP_DK_JPY_S").Text
        Cells(i + 2, 6) = Unix2Date(myList(i).SelectSingleNode("UNIXTIME/numberLong").Text)
        Cells(i + 2, 7).NumberFormat = "dd.mm.yyyy hh:mm:ss"
    Next
   
SafeExit:
    If myList.Length = 0 Then MsgBox "API KEY'i veya URL'i kontrol edin...."
    Set myList = Nothing
    Set XDoc = Nothing
    Set objHTTP = Nothing
End Sub
'
Function Unix2Date(vUnixDate As Long) As Date
    Unix2Date = DateAdd("s", vUnixDate, CDbl(DateSerial(1970, 1, 1) + TimeSerial(3, 0, 0)))
End Function

Not: Veysel Beyin 8 No'lu mesajdaki önerisi de dikkate alınarak revize edildi.


.
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
İlave bilgi olarak;

"TP.DK.USD.A" formatı, USD koduna ait TCMB'nin "Döviz Alış" kurunu verir. "Döviz Satış" kuru için "TP.DK.USD.S" kullanmanız gerekir.

.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
İlginç bir bilgi daha vereyim..... kurcalarken karşılaştım;

Bugünkü verileri almak için sunucuya yarınki tarihli bir istek gönderince, aldım ..... ilginç :)

".............................startDate=26-04-2024&endDate=26-04-2024&type=xml"


Yani; hangi güne ait verileri almak istiyorsanız, bir sonraki günün tarihini girmek gerekiyor...

.
 
Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,271
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Üstad, 25.04.2024 15:30' da yayınlanıp, 26.04.2024' de döviz işlemlerinde geçerli olacak kur sanırım.

.
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,604
Excel Vers. ve Dili
Pro Plus 2021
İlginç bir bilgi daha vereyim..... kurcalarken karşılaştım;

Bugünkü verileri almak için sunucuya yarınki tarihli bir istek gönderince, aldım ..... ilginç :)

".............................startDate=26-04-2024&endDate=26-04-2024&type=xml"


Yani; hangi güne ait verileri almak istiyorsanız, bir sonraki günün tarihini girmek gerekiyor...

.
Merhaba Haluk bey, bence aslında gelen verilerde tarih kısmı doğru geliyor. Sanırım siz UNIXTIME ile gelen zaman bilgisindeki veriyi kastediyorsunuz.
Burda timezone farkından ortaya çıkan bir sıkıntı olabilir.

Kod:
Function Unix2Date(vUnixDate As Long) As Date
    Unix2Date = DateAdd("s", vUnixDate, CDbl(DateSerial(1970, 1, 1)) + TimeSerial(3, 0, 0))
End Function
Yazmış olduğunuz bu fonksiyona 3 saat ilave edilmesi gerekli olabilir diye düşünüyorum.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Zeki Bey, Veysel Bey;

Saat farkı konusunda haklı olabilirsiniz belki ama, geçmiş tarihli verileri TCMB'nin sitesinden kontrol edince, bir önceki güne ait olduğunu görüyorum.....

.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,271
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Bugünün 15:30' a kadar olan döviz işlemlerinde dünkü 15:30' da yayınlanan kur baz alınır. Yanlış bir durum göremedim. Aslında tam olarak da istenen özellik.

.
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bugünün 15:30' a kadar olan döviz işlemlerinde dünkü 15:30' da yayınlanan kur baz alınır. Yanlış bir durum göremedim. Aslında tam olarak da istenen özellik.

.

Üstad, tamam ama örneğin 18-04-2024 için sorguladığımızda;

"startDate=18-04-2024&endDate=18-04-2024&type=xml"

17-04-2024 tarihli döviz kurları geliyor..... Benim demek istediğim bu.

Örneğin 18-04-2024 için USD Satış Kuru 32,5136 TL iken, XML bize 32,5211 TL veriyor.



.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
İşin ilginç tarafı, EVDS'den manuel olarak şu anda (Saat 20:21) seri ürettiğimde 25-04-2024 için EURO satış kurunu 34,77 TL olarak veriyor. Halbuki bu veri 24-04-2024 için geçerli.

25-04-2024 tarihinde saat 20:21 itibariyle TCMB'nin sitesinde EURO Satış kuru 34.8859 TL

Screenshot.png


Screenshot2.png


Birşeyler ters gidiyor ama, anlamadım....

.
 
Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,271
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Eski sistemi bir hatırlayalım...

Eski sistemde örneğin 24.04.2024 tarihli bir istek attığımızda 24.04.2024 tarihli 15:30 da duyurulan kur dönecekti; burada hemfikiriz sanırım. 24.042024 tarihinde gün içerisinde baz alacağımız kur ise, 23.04.2024 tarihli (ki, resmi tatil olduğundan bir önceki gün olan 22.04.2024 tarihi) kur olacaktı... Bunun için 23.04.2024 tarihli bir istek atmamız gerekecekti.

Yeni sistemde 24.04.2024 tarihli istek attığımızda ise, 24.04.2024 tarih, 15:30 da duyurulan kur değil, bir önceki gün olan 23.04.2024 tarihli (ki, resmi tatil olduğundan 22.04.2024 olur) kuru getiriyor. Bu aynı zamanda zaten baz almamız gereken kurun doğrudan döndürüldüğü anlamına geliyor. Ayrıca Cumartesi, Pazar ve Resmi tatil günlerinde günü gününe kur bilgisinin boş geldiğini gözlemledim.

251337

.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Değerli dostum, maalesef halen anlaşamadık.....

25/04/2024 saat 23:58 itibariyle yeni sisteme gönderdiğim isteğe cevap olarak, EURO Satış kurunu 34.771 TL geri döndürüyor. Bu değer ise 25/04/2024 değil, 24/04/2024 tarihinde saat 15:30'dan sonra ilan edilmiş veri.

Benzer şekilde; eklediğin resimde 19/04/2024 tarihli USD alış kuru 32.4551 TL görünüyor. Halbuki bu veri 18/04/2024 tarihine ait.
19/04/2024 tarihine ait veri, 19/04/2024 saat 15:30'da yayınlanan 32,5096 TL

Bütün demek istediğim bu....

.
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,313
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bu arada, hepimizin alışık olarak kullandığı sistemin kaldırılması söz konusu değil sanırım..... Aşağıdaki URL halen çalışmaya devam ediyor.


Bahsedilen konu EVDS'nin diğer kullanım alanlarıyla ilgilidir belki.....

.
 
Üst