Kendi programlama dilini yapmak

Class Module İşlemleri

Kendi programlama dilini yapmak

İleti#1)  winterwake » 24 Oca 2018 01:13

Merhaba,

Konuyu doğru yere mi açtım bilmiyorum ama heralde class module ile yapılır diye düşündüğüm için buraya açtım.
Hemen konuya giriyorum, yapmak istediğim şey şu: Userform üzerindeki bir textbox nesnesine kendi oluşturduğum komutları girerek buna göre vba'nın belli matematiksel ve mantıksal işlemleri gerçekleştirmesini sağlamak. Biraz daha açayım, mesela benim MA() isimli bir komutum olsun, bunun kurallarını ve parametre girdilerini kendi "programlama dili"me göre ben belirlemiş olayım. MA(C, 14) yazdığım zaman, "C" veri serisinin 14 periyotluk hareketli ortalamasını hesaplayan ilgili prosedür ve fonksiyonu çağırarak işlem sonucunu diğer mantıksal koşullara göre işleyebilsin. Daha açık bir örnek vereyim, textbox'ıma şunu yazmış olayım:

Kod: Tümünü seç
if MA(C, 14) CrossUp MA(C, 50) then 1 else 0

veya başka bir örnek;
Kod: Tümünü seç
if Sum(V, 1, 50) < 200 and V(1) > V(2) then 1 else 0


Dikkat ettiyseniz "V" ve "C" parametreleri önceden kod sayfamda tanımlanmış integer türünde dizilerdir. Sum() komutunu, kurallarını ve parametrelerini ben dizayn ettim. Sum(dizi, başlangıç elemanı, bitiş elemanı); V diye tanımladığım dizinin birinci elemanından 50. elemanına kadar olan sayıları toplamı 200'den küçükse ve V'nin ilk elemanı ikinci elemanın sayısal değerinden büyükse mantıksal "True" çıktısı ver.
İlk örnekte ise "CrossUp" diye bir koşul tanımladım. Vba bunun ne anlama geldiğini bununla ne yapacağını bilsin. Yani C'nin 14 periyot hareketli ortalaması 50 periyotluğu aşağıdan yukarı kestiğinde sonuç "True" aksi halde "False" değeri versin.

Bunun yapmanın yolu nedir?
Kullanıcı avatarı
winterwake
Yeni Başlamış
 
Adı Soyadı:İbrahim Kamçılı
Kayıt: 19 Tem 2011 16:12
Konum: İstanbul
Meslek: Çevre Mühendisi, Kimyager
Yaş: 35
İleti: 45
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul / Küçükçekmece

Cevap: Kendi programlama dilini yapmak

İleti#2)  Tarkan VURAL » 24 Oca 2018 11:06

Merhaba,
Temelde yazdığınız kelimeleri dönüştürerek işlem yapacak bir yorumlayıcıya ihtiyacınız var. Bu da kullandığınız VBA arayüzünün mevcut VBA kütüphanesi komutlarını ve kullanıcı tanımlı fonksiyonları yazıp kullanmak ile mümkün.

Kod: Tümünü seç
if Sum(V, 1, 50) < 200 and V(1) > V(2) then 1 else 0

Anlaşıldığı kadarıyla V dizisi içerisindeki değerler her zaman değişkenlik gösteriyor. Bir makineden yahut bir teorik dökümandan elde edilip kodlara ekleniyor. Sonra belirleyeceğiniz parametrik değerlerle karşılaştırılıp sonuç için durum değerlendirmesi yapılıyor. Laboratuar sonuçlarında olması gereken değer ve oluşan değer mantığındaki gibi. Tabi buradan çıkan değerlerin daha sonra yorumlanması da söz konusu olacaktır da şimdiki adımlamalarınızı anlayabildiğimi düşünüyorum.

Buna göre bahsettiğim gibi mevcut komutlarla dönüştürmeler yapılarak ve eğer ürettiğiniz özel metotlar her zaman farklı metotlar olabilecek ise, her defasında farklı farklı kullanıcı tanımlı bir fonksiyonlar oluşturulabilir. VBE penceresine manuel yazmadan prosedür, fonksiyon, class gibi tanımlar kodlama yaparak eklenebiliyor. Bu da ikinci olarak düşündüğüm her defasında değişik fonksiyon metodu konusuna çözüm olacaktır.

Konu güzel, zaman bulup üzerinde pratik denemeler yapmak lazım. ;) ;) --)(
Resim
www.tarkanvural.com.tr

İnnâ lillâhi ve innâ ileyhi raciûn
Şüphesiz ki; biz Allah’a âidiz ve vakti geldiğinde O’na döndürüleceğiz.

HasbunAllâhu ve nimel vekîl
Bize Allah yeter. O ne güzel vekildir.


ExcelVBA.NET' e katkıda bulunmak ister misiniz ? O halde BAĞIŞ butonunu tıklayın...
Kullanıcı avatarı
Tarkan VURAL
Yönetim Kurulu
 
Adı Soyadı:Tarkan VURAL
Kayıt: 14 Haz 2008 20:27
Konum: tarkan@excelvba.net
Meslek: LUU, Yazılım Geliştirme Müdürü
Yaş: 44
İleti: 26649
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul - Beylikdüzü

Cevap: Kendi programlama dilini yapmak

İleti#3)  winterwake » 29 Oca 2018 14:21

Tarkan Hocam,

Ben de aynı o şekilde düşünmüştüm. Bunun üzerinden giderek sonunda yapmak istediğimi başardım. Form üzerine büyükçe bir textbox yerleştirdim ve EnterKeyBehavior ve MultiLine özelliklerini "True" yaptım. ScrollBars özelliğini de both olarak aktif ettikten sonra kendi kod kurallarımı belirlerdim. Buna göre bir input görevi görecek olan "var" adında bir ifade ve mantıksal sonuç üretecek "if" adında bir ifade belirledim.
Kod: Tümünü seç
split(textbox1.text, Chr(10))
komutuyla bütün ifadeyi satırlara ayırarak her bir satırı lines isimli diziye ekledim. Sonra her bir satırı for döngüsü ile analiz ettirerek çıktı değerini "variables" adlı diziye eklettim. Eğer satırın başında "var" ifadesi geçiyorsa VBA bunun yeni bir değişken olduğunu ve bir takım matematiksel işlemler sonucunda çıkacak sayısal değer olacağını bilerek bu işlemin sonucunu iki boyutlu değişken bir dizi olan variables dizisine ekliyor.

Satırın başında "if" ifadesini bulursa da burada daha önceki işlemlerden elde edilmiş olan değerler ile mantıksal sonuçları analiz edip bir mantıksal sonuç üretiyor.
Kod mantığım ise şöyle:
Kod: Tümünü seç
var asd=(EMA(TS,40,1)+SMA(TS,10,1))/2
var user=USER(20,user1 or user2 and user3)
var sdf=asd+SMA(TS,14,1)
var dfg=asd+sdf
var fgh=SMA(US,20,1,10,sum)
var cross=CROSS(SMA(TS,3,1) UP SMA(TS,10,1))
if cross=1 and user=1 and dfg<50 then result=1 else result=0


Yukarıda komutlarımdan ve yapılarından bazı örnekler var. "var" ifadesinden sonra gelen "asd", "sdf" gibi ifadeler yeni bir değişken anlamına geliyor. Her bir değişkenin değeri ilgili fonksiyon çağırılarak çıkan sonuç iki boyutlu diziye ekleniyor. "if" ile başlayan satıra geldiğinde ise koşulların değişken adları ve karşılık gelen değerleri variables dizisinden bulunarak işleniyor ve sonuç yeni bir değişken adı olan "result" değişkeninin değerine atanıyor. 1 değeri True, 0 değeri False anlamına geliyor. Tüm bunları yaparkan string türünde ifadeler için kullanılan Left(), Right(), InStr(), Split() gibi komutlardan faydalandım. Texti parçalara ayırarak kendi komut ifadelerimi aradım. Select Case metoduyla da ilgili fonksiyonu çağırdım. Ayrıca burada benim en büyük yardımcım "evaluate" komutu oldu. İki örnek buldum ilki sadece string türündeki ifadeleri matematiksel sonuca ulaştırırken ikincisi aynı zamanda mantıksal sonuçları da işleyebiliyor: Yani ikinci kod hem "3+2" şeklindeki string türünden ifadeleri hesaplayabiliyor hem de "3>2" şeklindeki string türü veriler için "True" ya da "False" değerleri üretiyor. "And" ve "Or" ifadelerini ve parantezleri de dikkate aldığını da belirteyim. Bu kodları bilmiyordum, gerçekten müthiş oldu. Şimdi VBA ile kendi dilimden anlaşıyoruz.
Kod: Tümünü seç
Function Calc(Ref As String)
Application.Volatile
Calc = Evaluate(Ref)
End Function

Kod: Tümünü seç
Function Eval(strEvalContent As String) As Variant
    With CreateObject("ScriptControl")
        .Language = "VBScript"
        Eval = .Eval(strEvalContent)
    End With
End Function
Kullanıcı avatarı
winterwake
Yeni Başlamış
 
Adı Soyadı:İbrahim Kamçılı
Kayıt: 19 Tem 2011 16:12
Konum: İstanbul
Meslek: Çevre Mühendisi, Kimyager
Yaş: 35
İleti: 45
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul / Küçükçekmece

Cevap: Kendi programlama dilini yapmak

İleti#4)  Erkan Akayay » 29 Oca 2018 17:30

Vay vay vay. Yıllar önce bu site kurulurken bu günleri görürmüyüz diyordum. Bomba bir konu. Bravoooo. şkşk
Kullanıcı avatarı
Erkan Akayay
Site Dostu
 
Kayıt: 20 Ağu 2008 13:59
Konum: YALOVA
Meslek: Bilgi İşlem
Yaş: 48
İleti: 3906
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Ümraniye

REKLAM
Excel Logo XML Oluşturucu
Logo Object Designer ile Uyarlama

Cevap: Kendi programlama dilini yapmak

İleti#5)  Ersin YALIN » 29 Oca 2018 18:17

Konu kendi fonksiyonun yazmak olmalıymış.Programlama dili yazmak ileri seviye makine dili bilmek gerektiriyor.
Burada vba'nın mevcut fonksiyonları kullanılarak özel fonksiyonlar türetiliyor.
Resim
Kullanıcı avatarı
Ersin YALIN
Forum Moderatörü
 
Adı Soyadı:Ersin Yalın
Kayıt: 10 May 2010 12:52
Yaş: 39
İleti: 1590
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul

Cevap: Cevap: Kendi programlama dilini yapmak

İleti#6)  winterwake » 29 Oca 2018 22:46

Ersin YALIN yazdı:Konu kendi fonksiyonun yazmak olmalıymış.Programlama dili yazmak ileri seviye makine dili bilmek gerektiriyor.
Burada vba'nın mevcut fonksiyonları kullanılarak özel fonksiyonlar türetiliyor.


Evet haklısınız, belki çok iddialı oldu ama amaç çok basitçe kendi koyduğumuz kurallarla belli başlı komutlar oluşturup ilgili fonskiyonlardan çıktılar elde etmek. Yani aslında tıpkı bir programlama dilinde olduğu gibi değişkenler tanımlayıp bunların sonuçlarını belli mantık süzgecinden geçirerek sonuç üretiyoruz. Yaptığımız şeyin yapabilecekleri elbette ki çok kısıtlı. Ama sırf bu kadarcık komutla bile yüzlerce binlerce farklı kombinasyonda işlem yaptırıyoruz. Her bir olasılık için ayrı ayrı prosedür veya fonskiyon oluşturmak yerine belli kodlama kurallarıyla istediğimiz işlemi bir kaç satırlık kendi kodumuzla yaptırabiliyoruz. Bu benim için gerçekten çok büyük kolaylık çünkü pek çok hesaplama yöntemiyle deneme yanılma yapmam gerekiyor. Hepsi için tek tek fonksiyon yazamam.

Yukarıdaki yaptığım benim içi fazlasıyla yeterli yeteneklere sahip. Daha da geliştirmek için farklı yöntemler denemek gerekebilir. Bu konuyla ilgili farklı yaklaşımları olan varsa lütfen paylaşsın. İhtiyacı olanın mutlaka işine yarayacaktır. En başta da benim.

Bu arada Erkan Bey, beni ziyadesiyle onure ettiniz. Bunları duymak gerçekten benim için çok değerli. Hiç unutmuyorum 1991 yılında ben henüz 9-10 yaşlarındayken babam bir Commodore64 bilgisayar almıştı. Kullandığı dil BASIC'ti. Elbette ki oyun oynamak için almıştık ve oyunlar bildiğimiz kasetlerde kayıtlıydı. Çok kısa süre sonra ilgim oyunlardan kodlamaya kaymıştı. Bilgisayarla birlikte gelen iki tane, biri Türkçe olmak üzere BASIC kodlama kitabını okumaya ve komutları öğrenmeye, örnek kodları yazıp bunlar üzerinde değişiklik yapıp kendi kodlarımı yazmaya başlamıştım. Sağ olsun sevgili annem ve babam da "Yahu bu çocuk neyle uğraşıyor böyle, ne yapıyor, ne yazıyor" demedi. Beni yönlendirmediler. Beni daha fazlası için teşvik etmediler. Henüz 10 yaşındaydım ve Commodore64 ile oyun oynamak yerine BASIC öğreniyordum. Mazallah es kaza farketselerdi de beni tamamen bunun eğitimine, sertifika programlarına yazdırsalardı belki bugün Ersin Bey'in dediği şeyi de yapıyor olabilirdim. İçimde çok büyük bir yaradır. Her neyse "okuduk", kimyager ve çevre müh. olduk da bu işlere yakın zamanda tekrar merak saldık. Benimkisi kendi kendine bir şeyler öğrenmekten öte değil. Araştırıp örnekleri inceleyip kodların mantığını çözmeye çalışarak bir şeyler yapıyorum. Çok eksiklerim var ama neyse ki hobi olarak uğraşıyorum. Bu da bana inanılmaz bir haz veriyor. Ve bu forumdan öğrendiğim çok şey var. ExcelVBA.net ailesine çok şey borçluyum.

Kendi çocuğum aynı şeyi yaşamasın diye onu çok iyi takip edeceğim, her anne babaya da naçizane tavsiyemdir. Her insanın doğuştan yatkın olduğu bir becerisi vardır. Onu keşfetmek gerek.

Saygılarımla.
Kullanıcı avatarı
winterwake
Yeni Başlamış
 
Adı Soyadı:İbrahim Kamçılı
Kayıt: 19 Tem 2011 16:12
Konum: İstanbul
Meslek: Çevre Mühendisi, Kimyager
Yaş: 35
İleti: 45
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul / Küçükçekmece

REKLAM
ETA - Excel Konsolide Raporlama
ETA Excel Personel Entegre Raporu

Cevap: Kendi programlama dilini yapmak

İleti#7)  Ersin YALIN » 30 Oca 2018 11:46

İbrahim bey ,

Eleştirmek için yazmadım. Keşke böyle bir şey olsa yani TÜRKÇE diliyle kodlama yapabileceğimiz bir dil yaratılmış olsa bende çok isterim.

Sevmeyen bu işin okulunu okusa dahi yapamaz. Çünkü kodlama işi emek, araştırma, merak ,yaratıcılık ister.
Bir çok moderatör arkadaşımız ben dahil kendi çaba ve araştırmalarımızla bir şeyler öğrendiğini ve yaptığını söyleyebilirim.

Benimde Commodore64'üm vardı ve o yaşta basic dilinde kullanıcıdan doğum gününü alarak yaşadığı gün sayısını hesaplatıyordum. Ve bu kodlar kasetlerde hala kayıtlıdır tabi çalışıyor mu kasetler bilmiyorum....

Şimdi işin ucu eğitim sistemine falan gidecek o yüzden fazla uzatmak istemiyorum.

Yaptığınız şeyler karşılıksız kalmaz eninde sonununda bir yerden size dönüşü olur.


Kolay gelsin.
Resim
Kullanıcı avatarı
Ersin YALIN
Forum Moderatörü
 
Adı Soyadı:Ersin Yalın
Kayıt: 10 May 2010 12:52
Yaş: 39
İleti: 1590
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul

Cevap: Kendi programlama dilini yapmak

İleti#8)  Tarkan VURAL » 31 Oca 2018 14:15

İhtiyaç duyduğunuz ya da duyacağınız bilgiler için buradayız. Sorun, biliyorsak yardımcı olalım. Mesela içerik ararken Application.Match yöntemi işinize yarayabilir. Fonksiyonlarda ByVal ile içeri veri alıp sonda dışarı tek tipte değer döndüreceğinize, içeride ByRef özelliğini kullanarak birden çok dışarı veri döndürebilirsiniz, yahut collection sınıfı ile tablo döndürebilirsiniz gibi gibi... ;)
Resim
www.tarkanvural.com.tr

İnnâ lillâhi ve innâ ileyhi raciûn
Şüphesiz ki; biz Allah’a âidiz ve vakti geldiğinde O’na döndürüleceğiz.

HasbunAllâhu ve nimel vekîl
Bize Allah yeter. O ne güzel vekildir.


ExcelVBA.NET' e katkıda bulunmak ister misiniz ? O halde BAĞIŞ butonunu tıklayın...
Kullanıcı avatarı
Tarkan VURAL
Yönetim Kurulu
 
Adı Soyadı:Tarkan VURAL
Kayıt: 14 Haz 2008 20:27
Konum: tarkan@excelvba.net
Meslek: LUU, Yazılım Geliştirme Müdürü
Yaş: 44
İleti: 26649
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul - Beylikdüzü


Forum Class Module

Online Kullanıcılar

Bu forumu görüntüleyenler: Kayıtlı kullanıcı yok ve 1 misafir

Bumerang - Yazarkafe