tcmb.gov.tr'den dövizleri çekmek

Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

Merhaba

Şu an yurtdışındayım ve maalesef bilgisayarım yanımda değil.

İlk fırsatta kontrıl ederim.

[ Post made via Android ] Resim
mehmethanifi

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen mehmethanifi »

Tamam hocam teşekkürler.
Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

Merhaba,

DovizKuruAl fonksiyonunun üzerinde Sub Main olmayacak ve en sonunda da End Sub olmayacak.

Gönderdiğin ekran görüntüsünde var görünüyor.
mehmethanifi

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen mehmethanifi »

Hocam kaldırdım. Son hali aşağıda ki gibidir.

Function DovizKuruAl(Tarih As Date, ParaBirimi As String, KurTuru As Byte) As Currency

On Error Goto Hata

Dim oleServisi As Object
Dim DovizAlis,DovizSatis, EfektifSatis, EfektifAlis As Currency
Dim MerkezBankasi, HedefKurAdi As String
Dim Sonuc As Currency
Dim BaslangicTarihi As Date
Dim BitisTarihi As Date
Dim HedefKurNo As Byte
Dim Sayfa As Object

BaslangicTarihi = "16/04/1996"

BitisTarihi = Date

ParaBirimi = UCase(ParaBirimi)

Sonuc=0.0

If (Tarih < BaslangicTarihi) Then
Beep
MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
"16/04/1996 Tarihinden önceki T.C. Merkez Bankası döviz kurları" & Chr(10) & +_
"web sitesine girilmemiştir. Lütfen uygun bir tarih giriniz."
Goto Hata
End If

If (Tarih > BitisTarihi) Then
Beep
MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
"Girilen Tarih için günlük kur kaydı bulunamadı. Lütfen uygun bir tarih giriniz."
Goto Hata
End If

If ((ParaBirimi <> "USD") And (ParaBirimi <> "AUD") And (ParaBirimi <> "DKK") And +_
(ParaBirimi <> "EUR") And (ParaBirimi <> "GBP") And (ParaBirimi <> "CHF") And +_
(ParaBirimi <> "SEK") And (ParaBirimi <> "CAD") And (ParaBirimi <> "KWD") And +_
(ParaBirimi <> "NOK") And (ParaBirimi <> "SAR") And (ParaBirimi <> "JPY") And +_
(ParaBirimi <> "BGN") And (ParaBirimi <> "PKR") And (ParaBirimi <> "CNY") And +_
(ParaBirimi <> "RUB") And (ParaBirimi <> "RON") And (ParaBirimi <> "IRR")) Then
Beep
MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
"Hedef Para Birimi Tanınmıyor ve/veya" & Chr(10) & +_
"T.C. Merkez Bankasında işlem görmüyor." & Chr(10) & +_
"Girilebilecek Para Birimleri aşağıda listelenmiştir." & Chr(10) & +_
"USD, AUD, DKK, EUR, GBP, CHF, SEK, CAD, KWD," & Chr(10) & +_
"NOK, SAR, JPY, BGN, RON, RUB, IRR, CNY, PKR"
Goto Hata
End If

If ((KurTuru < 1) Or (KurTuru > 4)) Then
Beep
MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
"Dönüşüm için gerekli olan KUR TÜRÜ bilgisi tanımsız." & Chr(10) & +_
"1:Döviz Alış, 2:Döviz Satış, 3:Efektif Alış, 4:Efektif Satış" & Chr(10) & +_
"Lütfen KUR TÜRÜ parametresini doğru giriniz."
Goto Hata
End If

oleServisi = createUnoService( "com.sun.star.sheet.FunctionAccess" )

If (Tarih=Date) Then
MerkezBankasi = "http://www.tcmb.gov.tr/kurlar/today.xml"
Else
MerkezBankasi = "http://www.tcmb.gov.tr/kurlar/" & Year(Tarih) & Format(Month(Tarih),"0#") & "/" & +_
Format(Day(Tarih),"0#") & Format(Month(Tarih),"0#") & Year(Tarih) & ".xml"
End If

With oleServisi

XML_String = .callFunction("WEBSERVICE",array(MerkezBankasi))

DovizAlis = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/ForexBuying)"))
DovizSatis = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/ForexSelling)"))
EfektifAlis = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/BanknoteBuying)"))
EfektifSatis = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/BanknoteSelling)"))

Select Case KurTuru
Case 1
Sonuc=DovizAlis
Case 2
Sonuc=DovizSatis
Case 3
Sonuc=EfektifAlis
Case 4
Sonuc=EfektifSatis
End Select

DovizKuruAl() = Sonuc

Exit Function

End With

Hata:

DovizKuruAl() = 0.0

End Function

Yukarıdaki komutu çalıştırdığım zaman karşılaştığım hata..
Resim
Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

Merhaba,

Gönderdiğim örnek dosya hiç problemsiz çalışıyor.

Sanırım sen makroyu yanlış modüle ve/veya aynı anda 2 farklı modüle ekliyorsun.
makronunyeri
makronunyeri
soffice.bin_2017-06-05_12-02-30.png (49 KiB) 4522 kere görüntülendi
Bu makro sadece içerisinde kayıtlı olduğu dosya ile çalışacak ise yukarıdaki ekran görüntüsünde olduğu gibi yerleştirlmeli.

Yok eğer LibreOffice içerisinde olsun ve dosya ne olursa olsun çalışsın diyorsanız o zaman sizin yaptığınız gibi Makrolarım içerisine kayıt edilmeli. Ancak bu durumda açık duran dosya içerisinde aynı isimde başka bir makro olmamalı.

Şimdi sizden ricam Makrolarım kısmındaki kodların tamamını silin ve sadece benim bir kaç mesaj önce gönderdiğim örnek dosyayı açıp deneyin.
Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

Merhaba,

T.C. Merkez Bankasından Döviz Kur'unu alma makrosunu LibreOffice Türkiye Wiki'sine ekledim.

İncelemk isteyen arkdaşlar için bağlantı aşağıdadır.

T.C. Merkez Bankasından Günlük Döviz Kurlarını Almak
Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

Merhaba,

Oldukça sık olarak Basic macroları ile değil de LibreOffice Calc'ın kendi dahili fonksiyonları ile T.C. Merkez Bankasından ilgili tarihe ait döviz kurlarının nasıl alınacağı soruluyor.

Bunu aşağıdaki şekilde yapabilirsiniz.

Kod: Tümünü seç

= SAYIDEĞERİ( FILTERXML( WEBHİZMETİ("MerkezBankasiWebAdresi.xml"); "//Tarih_Date/Currency[1]/ForexBuying") ; ".")
Burada sırasıyla;

SAYIDEĞERİ : Web sayfasından TEXT olarak alınacak değeri sayıya çevirmek için kullanılıyor
FILTERXML : Bir xml sayfasından istenilen kriterlere uygun veriyi süzmek için kullanılıyor
WEBHİZMETİ : Bir web sayfasının HTML/XML kodlarını TEXT olarak verir

T.C. Merkez Bankası günlük döviz kularını bir XML sayfasında yayınlamaktadır.

İçinde bulunduğumuz gün'e ait XML sayfasının adresi şöyledir;

http://www.tcmb.gov.tr/kurlar/today.xml

Ancak istenilen tarihe ait döviz kurlarının yayınlandığı sayfa adresi şu formattadır;

http://www.tcmb.gov.tr/kurlar/YYYYAA/GGAAYYYY.xml

Örneğin 5/6/2018 tarihine ait döviz kurları için;
http://www.tcmb.gov.tr/kurlar/201806/05062018.xml


Yukarıdaki WEBHİZMETİ("MerkezBankasıWebAdresi.xml") kısmına bu formatta adres yazmanız gerekmektedir.

Bu formatı sağlamak için Calc hücrelerindeki tarihi Gün/Ay/Yıl olarak parçalamak ve Gün ile Ay'ı "00" formatına çevirmek gerekir.

Bu sebeple METNEÇEVİR( Sayı; Format) fonksiyonunu kullanıyoruz.

Sonuç olarak örneğimiz şöyle olsun;

A1 hücresinde ilgili tarih olsun (5/6/2018 gibi)
B1 hücresine aşağıdaki şekilde fonksiyonumuzu girdiğimizde bize ilgili tarihe ait USD alış kur'unu verecektir.

Kod: Tümünü seç

= SAYIDEĞERİ( FILTERXML( WEBHİZMETİ( "http://www.tcmb.gov.tr/kurlar/" & YIL(A1) & METNEÇEVİR( AY(A1) ; "00") & "/" & METNEÇEVİR( GÜN(A1) ; "00") & METNEÇEVİR( AY(A1) ; "00") & YIL(A1) & ".xml"); "//Tarih_Date/Currency[1]/ForexBuying");".")
T.C. Merkez Bankasının Web Sayfasındaki Döviz Kurları XML dosyasından istenilen bilgileri süzebilmek için aşağıdaki listeyi kullanmalısınız.

"//Tarih_Date/Currency[1]/ForexBuying" içerisinde Currency[Kod] istenilen PARA BİRİMİ'Nİ ifade eder.

Kod PARA BİRİMİ
-----------------------------------
1 US DOLLAR
2 AUSTRALIAN DOLLAR
3 DANISH KRONE
4 EURO
5 POUND STERLING
6 SWISS FRANK
7 SWEDISH KRONA
8 CANADIAN DOLLAR
9 KUWAITI DINAR
10 NORWEGIAN KRONE
11 SAUDI RIYAL
12 JAPENESE YEN
13 BULGARIAN LEV
14 NEW LEU
15 RUSSIAN ROUBLE
16 IRANIAN RIAL
17 CHINESE RENMINBI
18 PAKISTANI RUPEE

Ayrıca;

"//Tarih_Date/Currency[1]/ForexBuying" içerisinde ForexBuying istenilen KUR cinsini ifade eder.

Döviz Alış için ForexBuying
Döviz Satış İçin ForexSelling
Efektif Alış için BanknoteBuying
Efektif Satış İçin BanknoteSelling

ifadeleri kullanılmalıdır.
kenandrn
Mesajlar: 5
Kayıt: 29 Tem 2022, 17:17
İşletim Sisteminiz: Pardus 23, Kubuntu 23, Windows
LibreOffice Sürümü: 7.3

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen kenandrn »

Merhaba
Mali müşavir olduğum için Merkez Bankası kur uygulaması çok kullanışlı benim için, burada bir iki konuda destek isteyeceğim.
1. Biliyorsunuz kur 1 gün önceki kuru alarak kayıt yapıyoruz yani 06.09.2023 tarihli kur dediğimizde 05.09.2023 tarihindeki kuru dikkate alıyoruz. bunun içi ben dövizkuru al(tarih-1) yaparak doğru kuru alıyorum. Bu doğrultuda bir düzenleme yapılabilir mi?,
2. Tatil zamanına rastlayan günlerde kur değeri 0 çıkıyor bunun için eğer 0 çıkıyorsa yada kur yoksa 1 gün öncesi, o da yoksa kuru bulana kadar güne gidecek bir güncelleme mümkün mü?
Teşekkür ederim.
Kenan Duran
Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

mehmethanifi yazdı: 05 Haz 2017, 09:32 Yukarıdaki komutu çalıştırdığım zaman karşılaştığım hata..
Resim

Merhaba,

LibreOffice Makro Güvenlik ayarlarından ilgili dosyanın bulunduğu klasörü güvenilirler listesine eklemen gerekir.

Bunun için;

Araçlar Menüsünden Seçeneklere girin.

makroguvenligi1.png
makroguvenligi1.png (46.37 KiB) 862 kere görüntülendi

Soldaki Menüden Güvenlik seçin ve sağ taraftaki Makro Güvenliği butonuna basın.

Karşınıza aşağıdaki ekran gelecektir.

Bu ekranda Güvenlik Düzeyi sayfasındaki Yüksek seçeneğini işaretleyin ve sonrasında Güvenilir Kaynaklar sayfasına geçin.

makroguvenligi2.png
makroguvenligi2.png (29.7 KiB) 862 kere görüntülendi

Bu sayfada aşağıdaki Güvenilen Dosya Konumları bölümündeki Ekle butonuna basarak ilgili dosyanız hangi klasördeyse o klasörü seçin.

Benim örneğimde dosya D:\Downloads klasöründe kayıtlı olduğu için o klasörü seçtim.

makroguvenligi3.png
makroguvenligi3.png (22.18 KiB) 862 kere görüntülendi

Son olarak Tamam butonuna basarak belgenize dönün.

Ayrıca daha önce yazdığım fonksiyon adı DovizKuruAl şeklindeydi ve küçük "i" harfi ile küçük "ı" harfi biliyorsunuz İngilizce de aynı harf değil ve bu sebeple problem çıkartıyor.

Kodu aşağıdaki şekilde değiştirdim.

Kod: Tümünü seç

Function KURAL(Tarih As Date, ParaBirimi As String, KurTuru As Byte) As Currency

On Error Goto Hata

Dim oleServisi, XMLOku As Object
Dim DovizAlis,DovizSatis, EfektifSatis, EfektifAlis As Currency
Dim MerkezBankasi, HedefKurAdi As String
Dim Sonuc As Currency
Dim BaslangicTarihi As Date
Dim BitisTarihi As Date
Dim HedefKurNo As Byte
Dim Sayfa As Object

BaslangicTarihi = "16/04/1996"

BitisTarihi = Date

ParaBirimi = UCase(ParaBirimi)

Sonuc=0.0

If (Tarih < BaslangicTarihi) Then
	Beep
	MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
		   "16/04/1996 Tarihinden önceki T.C. Merkez Bankası döviz kurları" & Chr(10) & +_
		   "web sitesine girilmemiştir. Lütfen uygun bir tarih giriniz."
	Goto Hata
End If

If (Tarih > BitisTarihi) Then
	Beep
	MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
	       "Girilen Tarih için günlük kur kaydı bulunamadı. Lütfen uygun bir tarih giriniz."
	Goto Hata
End If

If ((ParaBirimi <> "USD") And (ParaBirimi <> "AUD") And (ParaBirimi <> "DKK") And +_
	(ParaBirimi <> "EUR") And (ParaBirimi <> "GBP") And (ParaBirimi <> "CHF") And +_
	(ParaBirimi <> "SEK") And (ParaBirimi <> "CAD") And (ParaBirimi <> "KWD") And +_
	(ParaBirimi <> "NOK") And (ParaBirimi <> "SAR") And (ParaBirimi <> "JPY") And +_
	(ParaBirimi <> "BGN") And (ParaBirimi <> "PKR") And (ParaBirimi <> "CNY") And +_
	(ParaBirimi <> "RUB") And (ParaBirimi <> "RON") And (ParaBirimi <> "IRR")) Then
	Beep
	MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
		   "Hedef Para Birimi Tanınmıyor ve/veya" & Chr(10) & +_
		   "T.C. Merkez Bankasında işlem görmüyor." & Chr(10) & +_
		   "Girilebilecek Para Birimleri aşağıda listelenmiştir." & Chr(10) & +_
		   "USD, AUD, DKK, EUR, GBP, CHF, SEK, CAD, KWD," & Chr(10) & +_
		   "NOK, SAR, JPY, BGN, RON, RUB, IRR, CNY, PKR"
	Goto Hata
End If

If ((KurTuru < 1) Or (KurTuru > 4)) Then
	Beep
	MsgBox "=DOVIZKURUNUAL( Tarih ; HedefParaBirimi ; KurTuru )" & Chr(10) & Chr(13) & +_
		   "Dönüşüm için gerekli olan KUR TÜRÜ bilgisi tanımsız." & Chr(10) & +_
		   "1:Döviz Alış, 2:Döviz Satış, 3:Efektif Alış, 4:Efektif Satış" & Chr(10) & +_
		   "Lütfen KUR TÜRÜ parametresini doğru giriniz."
	Goto Hata
End If 

oleServisi = createUnoService( "com.sun.star.sheet.FunctionAccess" )

If (Tarih=Date) Then
	MerkezBankasi = "https://www.tcmb.gov.tr/kurlar/today.xml"
	Else
	MerkezBankasi = "https://www.tcmb.gov.tr/kurlar/" & Year(Tarih) & Format(Month(Tarih),"0#") & "/" & +_
					Format(Day(Tarih),"0#") & Format(Month(Tarih),"0#") & Year(Tarih) & ".xml"
End If

With oleServisi

	XML_String = .callFunction("WEBSERVICE",array(MerkezBankasi))

	DovizAlis    = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/ForexBuying)"))
	DovizSatis   = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/ForexSelling)"))
	EfektifAlis  = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/BanknoteBuying)"))
	EfektifSatis = .callFunction("FILTERXML", array(XML_String, "number(/Tarih_Date/Currency[@CurrencyCode='"+ParaBirimi+"']/BanknoteSelling)"))
	
	Select Case KurTuru
		Case 1
			Sonuc=DovizAlis
   		Case 2
   			Sonuc=DovizSatis
   		Case 3
   			Sonuc=EfektifAlis
   		Case 4
   			Sonuc=EfektifSatis
   	End Select
    		
	KURAL() = Sonuc

	Exit Function

End With
	
Hata:

	KURAL() = 0.0
	
End Function
Daha önce

Kod: Tümünü seç

=DOVIZKURUAL(...)
Şeklinde kullandığınız fonksiyon isimlerini artık aşağıdaki şekilde kullanmalısınız.

Kod: Tümünü seç

=KURAL(....)
Umarım işinize yarar.
Kullanıcı avatarı
Hamurcu
Mesajlar: 265
Kayıt: 06 Ağu 2012, 00:14
İşletim Sisteminiz: Windows 10/11 - Pardus Linux
LibreOffice Sürümü: 7.x

Re: tcmb.gov.tr'den dövizleri çekmek

Mesaj gönderen Hamurcu »

kenandrn yazdı: 06 Eyl 2023, 19:21 Merhaba
Mali müşavir olduğum için Merkez Bankası kur uygulaması çok kullanışlı benim için, burada bir iki konuda destek isteyeceğim.
1. Biliyorsunuz kur 1 gün önceki kuru alarak kayıt yapıyoruz yani 06.09.2023 tarihli kur dediğimizde 05.09.2023 tarihindeki kuru dikkate alıyoruz. bunun içi ben dövizkuru al(tarih-1) yaparak doğru kuru alıyorum. Bu doğrultuda bir düzenleme yapılabilir mi?,
2. Tatil zamanına rastlayan günlerde kur değeri 0 çıkıyor bunun için eğer 0 çıkıyorsa yada kur yoksa 1 gün öncesi, o da yoksa kuru bulana kadar güne gidecek bir güncelleme mümkün mü?
Teşekkür ederim.
Kenan Duran
Merhaba,

İlk fırsatta kodu düzenlemeye çalışacağım.
Cevapla