Belirlediğim hücreye excel'i açtığımda https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod=YLB sayfadaki günlük değişen son fiyatı getirebilirmi
DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
Altın Üyelik Hakkında Bilgi
Private Sub Workbook_Open()
Dim URL As String
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
URL = "https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod=YLB"
IE.Navigate URL
Application.StatusBar = URL & " yükleniyor. Lütfen bekleyiniz.."
Do While IE.ReadyState = 4: DoEvents: Loop 'Do While
Do Until IE.ReadyState = 4: DoEvents: Loop 'Do Until
' Sayfa1 isimli çalışma sayfasının A1 hücresine son fiyat bilgisini getirir.
Worksheets("Sayfa1").Range("A1") = IE.document.getElementsByClassName("top-list")(0).getElementsByTagName("span")(0).innerhtml * 1
IE.Quit
Set IE = Nothing
MsgBox "Son fiyat bilgisi alındı.", vbOKOnly
End Sub
Sub Test()
' Haluk - 05/11/2020
Dim HTTP As New XMLHTTP60, HTML As New HTMLDocument
Dim xElement As Object
Const URL As String = "https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod=YLB"
HTTP.Open "GET", URL, False
HTTP.Send
HTML.body.innerHTML = HTTP.responseText
Set xElement = HTML.getElementsByClassName("top-list")
MsgBox Split(xElement(0).innerText, vbLf)(2)
End Sub
Eğer VBA ile yapılacaksa, Murat Beyin koduna alternatif olarak aşağıdaki gibi bir şey de kullanılabilir....
Not: "Microsoft XML, V6.0" ve "Microsoft HTML Object Library" eklenmelidir.
Kod:Sub Test() ' Haluk - 05/11/2020 Dim HTTP As New XMLHTTP60, HTML As New HTMLDocument Dim xElement As Object Const URL As String = "https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod=YLB" HTTP.Open "GET", URL, False HTTP.Send HTML.body.innerHTML = HTTP.responseText Set xElement = HTML.getElementsByClassName("top-list") MsgBox Split(xElement(0).innerText, vbLf)(2) End Sub
Ama yine de en kısası, ilk mesajımda belirttiğim yöntemdir.
.
Yanlış mı yazdım bilmiyorum split çalışmadı. Teşekkür ederim.
/*
YARDIM:
Google Sheet içinde bir doküman oluşturunuz.
Doküman içindeki Sayfa1 veya Sheet1 isimli dosyanın adını FONLAR olarak değiştiriniz
Uzantılar menüsünden Apps komut dosyası adımından (+) ya tıklayarak Komut dosyası oluşturunuz
Otomatik olarak eklenmiş satırları silerek aşağıdaki satırların hepsini yapıştırınız
Kaydet yaparak çıkabilirsiniz.
Dosyayı yeniden açtığınızda FONLAR isimli yeni bir menü oluşacaktır.
İlk olarak Varsayılan Sütün Adlarını eklemelisiniz. Ardından dosya içinde sadece FON KODU sütününa veriyi çekmek istediğiniz fonları yazmalısınız
FON ile ilgili diğer bilgileri siteden otomatik çekecektir.
Fon sayısı çok olduğunda süre uzun olacak, bazen erişim yapamayarak hata verebilir.
Baş.Satırı ve Bit.Satırı kısımlarına hangi satırlar arasını çekmek istiyorsanız satır numaralarını yazmalısınız.
*/
function TEFAS() {
// Çalışacağınız çalışma sayfasının adını buraya yazın
var sheetName = "FONLAR";
var url = 'https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod=';
// Çalışacağınız çalışma sayfasına erişin
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
//K2 ve L2 hücrelerine yazılacak sarır ile başlayıp bitirir
var startwith = sheet.getRange('K2').getValue();
var endto = sheet.getRange('L2').getValue();
var hucrebirlestir= 'A' + startwith + ':' + 'A' + endto;
//const timezone = sheet.getActiveSpreadsheet.timezone
const date = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyyy");
// Veri çekeceği hücreler için değerleri getirir
var data = sheet.getRange(hucrebirlestir).getValues();
// Tek tek satırları okuması için donguye alındı
for (var i = 0; i < data.length; i++) {
var address = url + data[i][0];
// Logger.log(address);
console.log(address);
SpreadsheetApp.getActive().toast("Alınan Sayfa: "+ address);
// Adreslerden veri çekmek için HTTP isteği yapın
var response = UrlFetchApp.fetch(address, {muteHttpExceptions: true});
// Çekilen verinin içinde arama yapın
var fiyat = response.getContentText().split('<span>')[1].split('</span>')[0];
var gunlukyuzde = response.getContentText().split('<span>')[2].split('</span>')[0];
var bir_ay = response.getContentText().split('<span style="font-size: 24px;">')[1].split('</span>')[0];
var uc_ay = response.getContentText().split('<span style="font-size: 24px;">')[2].split('</span>')[0];
var alti_ay = response.getContentText().split('<span style="font-size: 24px;">')[3].split('</span>')[0];
var bir_yil = response.getContentText().split('<span style="font-size: 24px;">')[4].split('</span>')[0];
var fonadi = response.getContentText().split('<span id="MainContent_FormViewMainIndicators_LabelFund">')[1].split('</span>')[0];
// Çekilen veriyi sütünlara yazacak
sheet.getRange(i + startwith, 2).setValue(fonadi);
sheet.getRange(i + startwith, 3).setValue(fiyat);
//sheet.getRange(i + startwith, 4).setValue(gunlukyuzde);
sheet.getRange(i + startwith, 5).setValue(bir_ay);
sheet.getRange(i + startwith, 6).setValue(uc_ay);
sheet.getRange(i + startwith, 7).setValue(alti_ay);
sheet.getRange(i + startwith, 8).setValue(bir_yil);
sheet.getRange(i + startwith, 9).setValue(date);
if (gunlukyuzde === "%-100") {
sheet.getRange(i + startwith, 4).setValue("Veri yok")
}
else {
sheet.getRange(i + startwith, 4).setValue(gunlukyuzde)
}
}
}
// Eski veriyi siler
function clearFormattingOnly() {
var range = SpreadsheetApp
.getActive()
.getSheetByName("FONLAR")
.getRange(2,3,100,7);
// range.clearFormat();
range.clearContent();
SpreadsheetApp.getActive().toast("Eski Veriler Silindi.");
}
function defaultColoom(){
// Başlık bilgisinin eklenmesi
var sheetName = "FONLAR";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
sheet.getRange(1,1).setValue("FON KODU").setNote("Sadece Fon kodunu yazın, diğer bilgiler Tefas'dan çekilecektir");
sheet.getRange(1,2).setValue("FON ADI");
sheet.getRange(1,3).setValue("FIYAT");
sheet.getRange(1,4).setValue("GUNLUK %");
sheet.getRange(1,5).setValue("AYLIK %");
sheet.getRange(1,6).setValue("3 AY %");
sheet.getRange(1,7).setValue("6 AY %");
sheet.getRange(1,8).setValue("1 YIL %");
sheet.getRange(1,9).setValue("TARIH");
sheet.getRange(1,11).setValue("Baş.Satırı");
sheet.getRange(2,11).setValue("2");
sheet.getRange(1,12).setValue("Bit.Satırı");
sheet.getRange(2,12).setValue("3");
sheet.getRange("K2:L2").setBackground("gray").setHorizontalAlignment("center").setNote("Hangi satırları okuyacağını yazın!");
}
function onOpen() {
SpreadsheetApp.getUi().createMenu("📋 FONLAR")
.addItem("✔️ Fon Verilerini Çek", "TEFAS")
.addItem("❌ Eski Verileri Sil", "clearFormattingOnly")
.addItem("🎈Varsayılan Sütün Adlarını Ekle","defaultColoom")
.addToUi();
}
Scripte verdiginiz emek icin tesekkurler. Kisa da olsa ornek bir google sheet dosyasi ile paylasirsaniz cok iyi olur. Benim gibi scriptlerden pek anlamayanlara yardim icinTEFAS verilerini Google Sheets'e çeken bir fonksiyon yazdım. Günlük olarak çalıştırıyorum fonların değerlerini ve bir takım bilgileri otomatik çekiyor.
Uzantılar > Apps menüsünden eklenecek. ilk fonksiyon verileri çeker, ikincisi ise tabloları siler.
Dikkat edilmesi gereken. Sayfanın adı FONLAR olmalı. farklı isim verilecek ise kod içinden FONLAR yerine başka bir isim kullanılabilir.
K2 ve L2 hücrelerine hangi satırdan başlayacağı, hangi satırda biteceği yazılacak. Bazen google hata verip çekme işlemini yarıda bırakabiliyor. Özellikle fon sayısı çok fazla ise. Bu durumda baştan başlamaması için K2 ve L2 hücrelerine çekemediği yerleri yazabilirsiniz.
Sayfa içine 2 tane de buton eklenip bu fonksiyonlar çalıştırılabilir.
JavaScript:/* YARDIM: Google Sheet içinde bir doküman oluşturunuz. Doküman içindeki Sayfa1 veya Sheet1 isimli dosyanın adını FONLAR olarak değiştiriniz Uzantılar menüsünden Apps komut dosyası adımından (+) ya tıklayarak Komut dosyası oluşturunuz Otomatik olarak eklenmiş satırları silerek aşağıdaki satırların hepsini yapıştırınız Kaydet yaparak çıkabilirsiniz. Dosyayı yeniden açtığınızda FONLAR isimli yeni bir menü oluşacaktır. İlk olarak Varsayılan Sütün Adlarını eklemelisiniz. Ardından dosya içinde sadece FON KODU sütününa veriyi çekmek istediğiniz fonları yazmalısınız FON ile ilgili diğer bilgileri siteden otomatik çekecektir. Fon sayısı çok olduğunda süre uzun olacak, bazen erişim yapamayarak hata verebilir. Baş.Satırı ve Bit.Satırı kısımlarına hangi satırlar arasını çekmek istiyorsanız satır numaralarını yazmalısınız. */ function TEFAS() { // Çalışacağınız çalışma sayfasının adını buraya yazın var sheetName = "FONLAR"; var url = 'https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod='; // Çalışacağınız çalışma sayfasına erişin var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); //K2 ve L2 hücrelerine yazılacak sarır ile başlayıp bitirir var startwith = sheet.getRange('K2').getValue(); var endto = sheet.getRange('L2').getValue(); var hucrebirlestir= 'A' + startwith + ':' + 'A' + endto; //const timezone = sheet.getActiveSpreadsheet.timezone const date = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyyy"); // Veri çekeceği hücreler için değerleri getirir var data = sheet.getRange(hucrebirlestir).getValues(); // Tek tek satırları okuması için donguye alındı for (var i = 0; i < data.length; i++) { var address = url + data[i][0]; // Logger.log(address); console.log(address); SpreadsheetApp.getActive().toast("Alınan Sayfa: "+ address); // Adreslerden veri çekmek için HTTP isteği yapın var response = UrlFetchApp.fetch(address, {muteHttpExceptions: true}); // Çekilen verinin içinde arama yapın var fiyat = response.getContentText().split('<span>')[1].split('</span>')[0]; var gunlukyuzde = response.getContentText().split('<span>')[2].split('</span>')[0]; var bir_ay = response.getContentText().split('<span style="font-size: 24px;">')[1].split('</span>')[0]; var uc_ay = response.getContentText().split('<span style="font-size: 24px;">')[2].split('</span>')[0]; var alti_ay = response.getContentText().split('<span style="font-size: 24px;">')[3].split('</span>')[0]; var bir_yil = response.getContentText().split('<span style="font-size: 24px;">')[4].split('</span>')[0]; var fonadi = response.getContentText().split('<span id="MainContent_FormViewMainIndicators_LabelFund">')[1].split('</span>')[0]; // Çekilen veriyi sütünlara yazacak sheet.getRange(i + startwith, 2).setValue(fonadi); sheet.getRange(i + startwith, 3).setValue(fiyat); //sheet.getRange(i + startwith, 4).setValue(gunlukyuzde); sheet.getRange(i + startwith, 5).setValue(bir_ay); sheet.getRange(i + startwith, 6).setValue(uc_ay); sheet.getRange(i + startwith, 7).setValue(alti_ay); sheet.getRange(i + startwith, 8).setValue(bir_yil); sheet.getRange(i + startwith, 9).setValue(date); if (gunlukyuzde === "%-100") { sheet.getRange(i + startwith, 4).setValue("Veri yok") } else { sheet.getRange(i + startwith, 4).setValue(gunlukyuzde) } } } // Eski veriyi siler function clearFormattingOnly() { var range = SpreadsheetApp .getActive() .getSheetByName("FONLAR") .getRange(2,3,100,7); // range.clearFormat(); range.clearContent(); SpreadsheetApp.getActive().toast("Eski Veriler Silindi."); } function defaultColoom(){ // Başlık bilgisinin eklenmesi var sheetName = "FONLAR"; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.getRange(1,1).setValue("FON KODU").setNote("Sadece Fon kodunu yazın, diğer bilgiler Tefas'dan çekilecektir"); sheet.getRange(1,2).setValue("FON ADI"); sheet.getRange(1,3).setValue("FIYAT"); sheet.getRange(1,4).setValue("GUNLUK %"); sheet.getRange(1,5).setValue("AYLIK %"); sheet.getRange(1,6).setValue("3 AY %"); sheet.getRange(1,7).setValue("6 AY %"); sheet.getRange(1,8).setValue("1 YIL %"); sheet.getRange(1,9).setValue("TARIH"); sheet.getRange(1,11).setValue("Baş.Satırı"); sheet.getRange(2,11).setValue("2"); sheet.getRange(1,12).setValue("Bit.Satırı"); sheet.getRange(2,12).setValue("3"); sheet.getRange("K2:L2").setBackground("gray").setHorizontalAlignment("center").setNote("Hangi satırları okuyacağını yazın!"); } function onOpen() { SpreadsheetApp.getUi().createMenu("📋 FONLAR") .addItem("✔ Fon Verilerini Çek", "TEFAS") .addItem("❌ Eski Verileri Sil", "clearFormattingOnly") .addItem("🎈Varsayılan Sütün Adlarını Ekle","defaultColoom") .addToUi(); }
kodlar çalışmıyor , güncelini paylaşır mısınız acaba ?TEFAS verilerini Google Sheets'e çeken bir fonksiyon yazdım. Günlük olarak çalıştırıyorum fonların değerlerini ve bir takım bilgileri otomatik çekiyor.
Uzantılar > Apps menüsünden eklenecek. ilk fonksiyon verileri çeker, ikincisi ise tabloları siler.
Dikkat edilmesi gereken. Sayfanın adı FONLAR olmalı. farklı isim verilecek ise kod içinden FONLAR yerine başka bir isim kullanılabilir.
K2 ve L2 hücrelerine hangi satırdan başlayacağı, hangi satırda biteceği yazılacak. Bazen google hata verip çekme işlemini yarıda bırakabiliyor. Özellikle fon sayısı çok fazla ise. Bu durumda baştan başlamaması için K2 ve L2 hücrelerine çekemediği yerleri yazabilirsiniz.
Sayfa içine 2 tane de buton eklenip bu fonksiyonlar çalıştırılabilir.
JavaScript:/* YARDIM: Google Sheet içinde bir doküman oluşturunuz. Doküman içindeki Sayfa1 veya Sheet1 isimli dosyanın adını FONLAR olarak değiştiriniz Uzantılar menüsünden Apps komut dosyası adımından (+) ya tıklayarak Komut dosyası oluşturunuz Otomatik olarak eklenmiş satırları silerek aşağıdaki satırların hepsini yapıştırınız Kaydet yaparak çıkabilirsiniz. Dosyayı yeniden açtığınızda FONLAR isimli yeni bir menü oluşacaktır. İlk olarak Varsayılan Sütün Adlarını eklemelisiniz. Ardından dosya içinde sadece FON KODU sütününa veriyi çekmek istediğiniz fonları yazmalısınız FON ile ilgili diğer bilgileri siteden otomatik çekecektir. Fon sayısı çok olduğunda süre uzun olacak, bazen erişim yapamayarak hata verebilir. Baş.Satırı ve Bit.Satırı kısımlarına hangi satırlar arasını çekmek istiyorsanız satır numaralarını yazmalısınız. */ function TEFAS() { // Çalışacağınız çalışma sayfasının adını buraya yazın var sheetName = "FONLAR"; var url = 'https://www.tefas.gov.tr/FonAnaliz.aspx?FonKod='; // Çalışacağınız çalışma sayfasına erişin var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); //K2 ve L2 hücrelerine yazılacak sarır ile başlayıp bitirir var startwith = sheet.getRange('K2').getValue(); var endto = sheet.getRange('L2').getValue(); var hucrebirlestir= 'A' + startwith + ':' + 'A' + endto; //const timezone = sheet.getActiveSpreadsheet.timezone const date = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyyy"); // Veri çekeceği hücreler için değerleri getirir var data = sheet.getRange(hucrebirlestir).getValues(); // Tek tek satırları okuması için donguye alındı for (var i = 0; i < data.length; i++) { var address = url + data[i][0]; // Logger.log(address); console.log(address); SpreadsheetApp.getActive().toast("Alınan Sayfa: "+ address); // Adreslerden veri çekmek için HTTP isteği yapın var response = UrlFetchApp.fetch(address, {muteHttpExceptions: true}); // Çekilen verinin içinde arama yapın var fiyat = response.getContentText().split('<span>')[1].split('</span>')[0]; var gunlukyuzde = response.getContentText().split('<span>')[2].split('</span>')[0]; var bir_ay = response.getContentText().split('<span style="font-size: 24px;">')[1].split('</span>')[0]; var uc_ay = response.getContentText().split('<span style="font-size: 24px;">')[2].split('</span>')[0]; var alti_ay = response.getContentText().split('<span style="font-size: 24px;">')[3].split('</span>')[0]; var bir_yil = response.getContentText().split('<span style="font-size: 24px;">')[4].split('</span>')[0]; var fonadi = response.getContentText().split('<span id="MainContent_FormViewMainIndicators_LabelFund">')[1].split('</span>')[0]; // Çekilen veriyi sütünlara yazacak sheet.getRange(i + startwith, 2).setValue(fonadi); sheet.getRange(i + startwith, 3).setValue(fiyat); //sheet.getRange(i + startwith, 4).setValue(gunlukyuzde); sheet.getRange(i + startwith, 5).setValue(bir_ay); sheet.getRange(i + startwith, 6).setValue(uc_ay); sheet.getRange(i + startwith, 7).setValue(alti_ay); sheet.getRange(i + startwith, 8).setValue(bir_yil); sheet.getRange(i + startwith, 9).setValue(date); if (gunlukyuzde === "%-100") { sheet.getRange(i + startwith, 4).setValue("Veri yok") } else { sheet.getRange(i + startwith, 4).setValue(gunlukyuzde) } } } // Eski veriyi siler function clearFormattingOnly() { var range = SpreadsheetApp .getActive() .getSheetByName("FONLAR") .getRange(2,3,100,7); // range.clearFormat(); range.clearContent(); SpreadsheetApp.getActive().toast("Eski Veriler Silindi."); } function defaultColoom(){ // Başlık bilgisinin eklenmesi var sheetName = "FONLAR"; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.getRange(1,1).setValue("FON KODU").setNote("Sadece Fon kodunu yazın, diğer bilgiler Tefas'dan çekilecektir"); sheet.getRange(1,2).setValue("FON ADI"); sheet.getRange(1,3).setValue("FIYAT"); sheet.getRange(1,4).setValue("GUNLUK %"); sheet.getRange(1,5).setValue("AYLIK %"); sheet.getRange(1,6).setValue("3 AY %"); sheet.getRange(1,7).setValue("6 AY %"); sheet.getRange(1,8).setValue("1 YIL %"); sheet.getRange(1,9).setValue("TARIH"); sheet.getRange(1,11).setValue("Baş.Satırı"); sheet.getRange(2,11).setValue("2"); sheet.getRange(1,12).setValue("Bit.Satırı"); sheet.getRange(2,12).setValue("3"); sheet.getRange("K2:L2").setBackground("gray").setHorizontalAlignment("center").setNote("Hangi satırları okuyacağını yazın!"); } function onOpen() { SpreadsheetApp.getUi().createMenu("📋 FONLAR") .addItem("✔ Fon Verilerini Çek", "TEFAS") .addItem("❌ Eski Verileri Sil", "clearFormattingOnly") .addItem("🎈Varsayılan Sütün Adlarını Ekle","defaultColoom") .addToUi(); }