.Net Dilleri: VB.Net ve C#
VSTO'yu ilk öğrendiğimde VB.Net yeterli olur diye düşünüyordum, özellikle c#'ın(si
şarp diye okunur) bazı eksiklikleri can sıkıcıydı ancak bunlar yıllar içinde giderildikten ve c#'a da iyice ısındıktan sonra c#'ın tercih edilmesi gerektiğini düşünüyorum.
Öncelikle belirtmek isterim ki, burada bu iki dili detaylıca görmeyeceğiz. Sadece VSTO programlama yaparken işimize yarayacak kısımları bilmemiz yeterli. O yüzden ilerleyen zamanlarda bu dillerle ilgili internette bolca bulunan diğer eğitim materyallerinden faydalanmanızı tavsiye ederim.
VBA'yi bildiğiniz için VB.Net size biraz daha kolay gelecektir. Ben burada VBA ve VB.Net arasındaki farkları da anlatmaya çalışacağım. Böylece yoldaki kazalardan korunmuş olacaksınız.
Bununla beraber ilerleyen sayfalardaki kod örneklerinin büyük çoğunluğu c# ile yazacağım. Keza Örnek projeler de c# ile yazdığım projeler olacak. Ancak bunlardan Excelent'ı Vb.Net ile yazdım, ki içlerinde en büyük proje de budur.
Size önerim VSTO programı yaratmadan önce sıradan VB.Net ve C# programları yaratarak başlayın ve bu dillere aşina olun, ondan sonra VSTO uygulamalarına doğru geçiş yapın.
VB.Net
Öncelikle VB.Net'ten başlıyoruz. Bununla beraber anlatacaklarımın çoğu,
syntaxtaki farklılıklar dışında c# için de geçerlidir.
VB.Net'i VBA'den en büyük ayıran kısmı syntaxıdır sanırım. En aşağıda detaylı bir karşılatırma bulacaksınız. O yüzden bu kısımda farklara detaylı girmiyorum.
VB.Net, .Net platformunun ana prensipleri ışığında çalışır ve tam anlamıyla
nesne yönelimli(obje oriented) bir dildir. VBA ise VB6 dilinden başka birşey değildir, bunun Ofis programları içine gömülmüş halidir, en büyük eksiği tek başına executable programları çalıştıramamasıdır. VB6 tam anlamıyla bir object oriented dil olmadığı için Microsoft, .Net platformu bile birlikte VB6nın yerine de VB.Net'i getirdi. VB.Net'te tüm diğer object yönelimli dillerdeki gibi 4 ana unsur vardır: Encapsulation, Abstraction, Inheritance ve Polymorphism.
Bu arada VBA'deki modül kavramı hala var ancak sınıf kavramı da bulunmaktadır. (c#'ta ise modül diye birşey yok, sadece sınıf var)
VB.net'le ilgili özet bir eğitim sitesine buradan ulaşabilirsiniz. Benim sitemdeki bilgilerden sorna yetersiz kaldığınız hissederseniz bu siteye bakabilirsiniz. Kendinizi VB.Net konusunda çok da geliştirmenize gerek yok, enerjinizi daha çok c# öğrenmeye harcayın derim ben,
ki aynı sitede ve daha birçok sitede c# için de öğrenim kaynağı
bulacaksınızdır. Eminim bu dil size başka kapılar da açacaktır. (Java
veya c++ öğrenme, mobil development yapma gibi)
.Net Programlarının Genel Yapısı
Modül(sadece vb.net) ve sınıf
VB.Net programlarında VBA'deki modüller gibi modüller bulunabileceği gibi, .Net dünyasına özgü namesapace ve onların altında sınıflar
da bulunabilir.
Imports System 'kullanmak istediğim sınıfları içeren namespaceleri programa dahil ediyoruz
Module Module1
'This program will display Hello World
Sub Main()
Console.WriteLine("Hello World") 'Console denen terminal ortamına çıktımız yazdırılır. VSTO'da bunu kullanmayacağız.
Console.ReadKey()
End Sub
End Module
veya modül olmadan şölye;
Imports System 'kullanmak istediğim sınıfları içeren namespaceleri programa dahil ediyoruz
Class Personel
'Sınıf seviyesinde değişkenler
Private Name As String
Private Sicil As Integer
Private Sub BilgiVer()
Dim degisken As String
Console.WriteLine(....)
End Sub
End Class
Class Test
Sub Main()
Dim p As New Personel() 'Yukarıda tanımladığımız sınıftan bi nesne yaratıyoruz
r.Name="Volkan"
r.Sicil=123
r.BilgiVer()
Console.ReadLine()
End Sub
End Class
Modül ve classlar arasındaki farkı şu sayfada bulabilirsiniz.
Sınıfların da erişim türleri olmaktadır. Bunlardan Shared sınıflar(c#'ta
static sınıf olarak geçerler) Modüllere çok benzerler. Bundan şimdi
bahsediyorum, çünkü özellikle c# tarafında bol bol statik sınıf
kullanacağız. Modüllerin ana kullanım prensibini hatırlayack
olursak, c#'taki bu kullanım şeklini de çok daha iyi anlayabiliriz.
Sınıflar ve nesneler
.Net'te kodlarımız hiyerarşik bir yapı içindedir. En üstte
namespace denen yapılar vardır, bunları özet olarak
kütüphane terimiyle özdeş düşünebilirsiniz(tam olarak öğle değil ama basit olması adına şimdilik öyle düşünün). Bu namespacelerin/kütüphanelerin
altına başka namespaceler olabilir, bunların da içinde sınıflar vardır. Sınıflar, başka sınıfları miras alabilir ve hiyerarşik bir yapı oluşturur. Ör:System namespace'i
altında Windows isimli bir namespace ve onun altında da Forms isimli bir sınıf bulunur ve gösterimi System.Windows.Forms şeklindedir.
Object Oriented bir dilde bu sınıflardan objeler yaratılır. Sınıflar bu nesneler için kalıp görevi görürler. Bu nesneleri yaratabilmek için bu sınıfları programımıza dahil etmeliyiz. Bunun için öncelikle ilgili
sınıfın bulunduğu kütüphaneyi Referanslar içine eklememiz gerekir. Referanslara eklemek onu
kodumuzda kullanabiliriz anlamına gelir.
Imports deyimi ile programın başına yazarak da bu sınıfları uzun uzun yazmaktan kurtulmuş oluruz. Bu arada bazı kütüphaneler default olarak başta hazır eklenmiş olarak gelir.
'Hiç import yapılmazsa
System.Diagnostics.Debug.Write("Merhaba")
'Tek seviye import
Imports System
Diagnostics.Debug.Write("Merhaba")
'İki seviye import
Imports System.Diagnostics
Debug.Write("Merhaba")
Biz de kodlarımızda Interop altındaki Excel namespace'ini programımıza dahil edeceğiz.
Imports Microsoft.Office.Interop.Excel
Yaygın import şekli ise Excel'i alias olarak almaktır. Böylece Application gibi birçok namespace'te olabilecek sınıfların önüne bu aliası yazarak karışıklıkları da önlemiş oluruz.
Imports Excel = Microsoft.Office.Interop.Excel
Dim hucre As Excel.Range
Veri Tipleri ve Değişken tanımlama/atama
Veri türleri VBA'den oldukça farklı olup buradan detaylara ulaşabilirsinz.
Değişken atama şekli de VBA'den biraz farklıdır. Şimdi şu örneklere bakalım:
Dim adet As Integer = 10 'tek satırda tanımlama ve atama. VBA'de
sadece constantlar böyle atanabilyor
Dim sayi1, sayi2 as Integer 'VBA'de ilki Variant olurdu, VB.Net'te
ikisi de Integer
Module DataTypes
Sub Main()
Dim n As Integer
Dim da As Date
Dim bl As Boolean = True
n = 1234567
da = Today
Console.WriteLine(bl)
Console.WriteLine(CSByte(bl))
Console.WriteLine(CStr(bl))
Console.WriteLine(CStr(da))
Console.WriteLine(CChar(CChar(CStr(n))))
Console.WriteLine(CChar(CStr(da)))
Console.ReadKey()
End Sub
End Module
Değişkenin tanımlandığı yere göre ömrü de farklı olacaktır. Sınıf
seviyesindeki değişkenler, o sınıftan yaratılan tüm nesnelerde var
olacaktır. Local değişkenler sadece ilgili scope'ta var olacaktır.
c#'ta değişken tanımlama biraz daha farklı ve basittir. Önce
değişken tipini sonra adını yazarız.
int i = 0;
string isim = "";
Veri tipi dönüştürme
Veriler arasında dönüşüm yapmak için VBA'dekine benzer dönüşüm fonksiyonları vardır. Detaylar burada. Bunun dışında bir de
Convert sınıfı var.
Bir de tam olarak dönüştürme olmayan ama benzer kavramlar olan
Casting, Parsing ve Boxing var.
- converting: bir veri tipini başkasına çevirme.
Ör: Integer'ı Floata. int i = Convert.ToInteger(sayi)
- casting: compilera "bu obje aslında başka birşey, onu bu şeye dönüştür" diyoruz
-
parsing: Bir stringi sayı olarak yorumla(genelde böyle), veya daha genel anlamda bir string içinden anlamlı bişey çıkarma amaçlı kullanılır
-
boxing: değişkenleri object tipine çevirmedir.
Tersi Unboxingdir, castinge benzer.
CType ve DirecCast fonksiyonları(Vb.Net
kodlarıdır, c# eşlenikleri de mevcuttur)
Dönüş tipi Obje olan nesnelerin üyelerine erişmek için onları daha
spesifik nesnelere dönüştürmemiz gerekmektedir. Ve nitekim Excel
objelerinin de bir kısmının dönüş tipi object'dir. O yüzden sık sık
DirectCast/CType fonksiyonları ile dönüşüm yapacağız. c#'ta bu işlem
biraz daha farklı bir şekilde yapılmaktadır.
CType(obj, sınıf).sınıfınmetodu() 'metod kullanımı
degisken=CType(obj, sınıf).sınıfınpropertysi 'property kullanımı
'veya öncelikle bir nesne değişkenine atarız sonra üyeleri kullanırız
myobj = CType(obj, sınıf)
degisken= myobj.somevalue
'Excel dünyasından bir örnek
Svar= CType(sender, Button).Text
hucre= CType(app.ActiveCell, Excel.Range) 'app de Application nesnesini temsil eden başka bir değişken
c#'ta casting, dönüştürlecek sınıf tipi parantez içinde ilgili objenin
önüne yazılarak yapılır.
hucre=(Excel.Range)app.ActiveCell;
Nesne yaratma
VBA'deki gibidir. Late ve Early binding olmak üzere iki yolu vardır.
Dim nesne As New Sınıf() 'sondaki paranteze dikkat
'veya iki yarı satırda
Dim nesne As Sınıf()
nesne = New Sınıf() #set yok
Erişim Tipleri
Erişim tipleri hem değişkenler hem prosedürler için kullanılabilir. Public, Private, Protected, Friend(c#'ta
Internal), Protected Friend
Bunları siz araştırın lütfen.
Hata Yönetimi ve Debugging
VBA'deki yetersiz On Error ifadeleri yerine daha güçlü olan TryCatch
ve TryCatchFinally blokları kullanılır.
- Try ile Catch arasına yazılan kodlar icra edilir.
- Hata alınırsa Catch bloğuna gelir
- Hata alsa da almasa da bir kod çalışsın istersek de bunu Finally
bloğu içine yazarız.
- Hata alındığında tüm koddan çıkılmaması adına iç içe TryCatch
blokları kullanmak yaygın bir durumdur
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
Debugginle ilgili olarak tuşlarda bazı değişiklikler var. Ör:Adım adım
ilerlemek için F8 değil F11 kullanıyoruz. Hepsini menüden
görebilirsiniz.
Eventler
Eventler, VBA'deki ile hemen hemen aynı. Sadece Event handler'ların
sonunda "Handles" vardır. Bunu takiben birden fazla control için event
yazılabilr. Ör: Hem A hem B butonlarına tıklandığında aynı eventin
çalışması sağlanabilir. Hangi butona tıklandığını da sender parametresi
ile elde edebiliriz.
Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click, btn2.Click
End Sub
Dizimsiler(Veri Yapıları)
Dim dizi(10) As Integer 'Son indeksi 10 olan 11 elemanlık bir dizi tanımlandı, ancak henüz yaratılmadı??
Dim dizi() As Integer = New Integer(){} 'Boş dizi
Dim dizi() Ad Integer = {1,2,3,4,5} '5 elemanlı bir dizi
Dim dizi() As Integer = New Integer() {1,2,3,4,5} '5 elemanlı bir dizi
VB.Net'te, Option Base 1 olayı kaldırıldı, yani indeks her daim 0'dan başlar.
Redim, içiçe diziler ve çokboyutlu diziler aynen var. Ancak Redim aynı zamanda boyutu baştan belirtilmiş dizilerin boyutunu yeniden boyutlandırmak için de kullanılabilir, bu VBA'de yoktu.
Ubound'a ek olarak Length propertysi var, Lbound yok, zaten
alt indeks hep 0'dır. Ayrıca IndexOf gibi faydalı propertyler ile Copy, Reverse, Sort gibi VBA'de olmayan faydalı metodları var.
../Fasulye/NeNeredeNasil_Diziler.aspx sayfasından detaylı kullanım
örneklerini görebilirsiniz.
Diğer veri yapıları
System.Collection ve System.Collection.Generic namespaceleri içinde
çok sayıda veri yapısı bulunmaktadır. Bunlar oldukça güçlü veri yapıları
olup sıklıkla List ve Dictionary'leri
kullanıyor olacağız. Bunlardan List VBA'Deki Collection'lara benzer
ancak çok daha güçlüdür.
Algoritmik yapılar
Koşullu yapılar ile döngüler hemen hemen aynıdır, o yüzden detaya girmiyorum. Ancak bilmeniz gereken önemli bir husus var ki, VBA'de bir değişken prosedürün her yerinde yaşamaya devam ediyordu, yani kapsamı prosedür seviyesindeydi. Detayları bu sayfadan hatırlayabilirsiniz. VB.Net'te ise local değişkenler,
tanımlandığı koşul veya döngü bloğu içinde geçerlidir. Bununla beraber,
sınıf seviyesinde tanımlanan ve instance variable olarak da geçen
değişkenler ilgili sınıfın altındaki tüm metodlarda geçerlidir.
Stringler ve Tarihler
VBA'de olmayan birçok faydalı metod ve property var, bunlara burda değil, örnekler sırasında değineceğiz
Formlar
VB.Net'te Userform yerine Formlar var ve bunlar bir sınıftır. Sınıf tanımlama şeklinde yaratılırlar, ancak çoğu zaman manuel yaratmak yerine menülerden yaratacağız(aslında tanımlayacağız). Bu sınıftan bir form yaratıp çağırmadığımız sürece o form yaratılmaz.
Bir sınıf olduğu için aynı form için birden fazla nesne yaratabiliyoruz. Pratikte çok karşılaşılmamakla birlikte bazen gerekebilmektedir.
VBA'deki vbModal ve vbModeless etkisi, VB.Nette sırasıyla ShowDialog() ve Show() metodlarıyla yapılır.
Form üzerinde oluşturduğunuz her bir controlün bilgisi "Form1.Designer.vb" dosyasında bulunur.
Controllerin çoğu aynı olmakla birlikte kimisinin adı(CommandButton-->Button) ve özellik isimleri(CommandButton.Caption-->Button.Text) değişti. Başka bir örnek: ListBox1. AddtIem ListBox.Items.Add() oldu. Diğer değişenbelli başlı controler şöyle :
Form sınıfı oldukça gelişmiş bir sınıf olup hem üzerine alabileceği control sayısı çok fazla hem de kendisine ait event sayısı fazladır. VBA’deki Userformlarda 22 event varken Form sınıfında 85 event vardır
Diğer
Diğer bilgileri .Net işlemleri bölümünde bulabilirsiniz.
C#
Microsoft, .Net platformu ile birlikte Vb.Net'e ek olarak,ve aslında Java'ya rakip olarak c# dilini de kullanıma sürmüştür. Bu dil, C ailesinden bir dil olmakla birlikte Delphi ve Pascal gibi eskinin güçlü dillerinin de güçlü özelliklerini almıştır. Size önerim de kendinizi VB.net’ten ziyade c#'ta geliştirmenizdir. Zaten stackoverflowdaki arama sayılarına baktığınızda c# etiketlemesi, vb.net'ten kat kat daha fazladır.
C ailesi demek süslü parantezlerin ve noktalı virgüllerin hayatımıza girmesi, "End ...." ifadesinin de çıkması demek . Örnek bir kod bloğu şöyle:
private void hello() {
string mesaj="Merhaba dünya";
Console.WriteLine(string);
}
Koşul ve döngü blokları ise şöyle
if () {
}
do {
}
Yukarıda Vb.Net için anlatıtığımız birçok detay c# için de geçerli
demiştik. Şimdi, kısaca c#'ta farklı olarak ne var, onlara
bakalım.
Missing parametresi ve c# 4.0
Uzun bir süre kodlarımı c# yerine VB.Nette yazmama neden olan bir
açıklama göstermek istiyorum size, MSDN'den:
In general, developers who use Microsoft Visual Basic® .NET have an easier time working with Microsoft Office objects than do developers who use Microsoft Visual C#® for one important reason: Visual Basic for Applications (VBA) methods often include optional parameters, and Visual Basic .NET supports optional parameters. C# developers will find that they must supply a value for each and every optional method parameter, whereas Visual Basic .NET developers can simply used named parameters to supply only the values they need.
Türkçesi: c#, optional parameterleri desteklemediği ve VBA
metodlarının da çoğu optional parametre içerdiği için, c# kodlarında
optional parametrelerin yerine geçmesi için çok çirkin görünen
missing ifadesini eklenmek durumundaymış.
Ör: FalancaFonksiyon(arg1,arg2,missing,missing,missing). Üstelik bu
missing'lerin sayısı bazen 30-40'ı bulabiliyordu.
Excel.Workbook wb = ThisApplication.Workbooks.Add(Type.Missing);
Ancak güzel haber şu: c# 4' ten sonra artık optional parametre desteği var, yani artık missing eklemek zorunda değiliz.
Excel.Workbook wb = ThisApplication.Workbooks.Add();
Bir diğer can sıkıcı açıklama ise şuydu:
In addition, C# doesn't support properties with parameters other than indexers, yet many Excel properties accept parameters. You'll find that properties such as the Application.Range property, available in VBA and Visual Basic .NET, require separate accessor methods for C# developers (the get_Range method replaces the Range property.) Watch for differences between the languages like these throughout this document.
Bunun Türkçesi
de "c#, parametreli propertyleri desteklemiyor, bu propertler için
'get_' ile başlayan metodlar üretilmiştir. Ör: Range propertysi yerine
get_Range metodu gibi" olup, bu durum da düzelmiş durumda. Yani artık garip garip get_Range, get_Offset gibi şeyler yazmıyoruz.
Zaten yazarsanız, böyle bir metod yok diye hata alırsınız.
Özetle
VSTO dünyasında c# ile çalışmamanız için artık hiçbir neden yok.
İki dil kıyaslamasını birçok yerde bulabilirsinz. Ben örnek olarak
birini koyuyorum. Gerçi ben c#'ı tek geçiyorum ama bunu yaşadıkça
görmeniz lazım.
Kıyaslama ve VBA'den .Net dillerine dönüşüm
Burada bütün farklara değinmeyeceğim, sadece önemli olduğunu
düşündüklerimi buraya aldım. Ama
şu sayfada detaylı bir kıyaslama bulabilirsiniz.
Aşağıdaki gösterimler vb.net ile c#ta önemli bi fark yoksa sadece vb.neti vereceğim.
Metodlar/Fonksiyonlar
Sub/Fonksiyon/Metod ayrımı
VBA'de sadece fonksiyon kavramı varken, VB.Net'te hem fonksiyon hem metod, c#'ta ise sadece metod kavramı var. VBA'de tanımlanan fonksiyonların VB.Net karşılığı Modül fonksiyonu veya Shared sınıf metodudur, c#'ta da static sınıf metodur. VBA'in Sub prosedürünün VB.Net karşılığı da yine Sub prosedürdür, c# karşılığı ise void dönüş tipli metodlardır.
Private Sub Prosedur()
'.....
End Sub
Private Function Fonksiyon()
'.....
End Function
private void subprosedur_veya_donusdegersiz_fonksiyon() {
//.....
}
privade int donus_degerli_fonksiyon() {
//......
}
Parantez kullanımı
VBA'da metodlar parantez almazken, fonksiyonlar alabiliyor. Üstelik aynı isme sahip olan metod-fonksiyonlar sözkonusu olup bunlar da kafa karıştırıcı olabilmekteydi.
.Net dillerinde ise parantez zorunludur. VB.Net'te fonksiyon kavramı hala varken, c#'ta fonksiyon diye ayrı bir yapı bulunmuyor.
MsgBox "Merhaba" 'Fonksiyon1: Dönüş tipi yok, sadece bir iş icra ediyor
cevap=MsgBox("Emin misin",vbYesNo) 'Fonksiyon2: Dönüş tipi var
ActiveCell.Clear 'Metod: Bir nesneye ait fonksiyon
VB.Net'e bakalım
MsgBox("Merhaba") 'Bu arada c#'ta MsgBox kullanımı bulunmuyor. System.Windows.Forms.MessageBox metodu kullanılıyor. Bu Vb.Net'te de kullanılabilmektedir.
cevap=MsgBox("Emin misin",vbYesNo)
ActiveCell.Clear()
Parametre tipleri
VBA'de parametreler default olarak ByRef olarak geçirilirken, .Net dillerinde ByValue'dur. O yüzden özellikle
VBA'den VSTO'ya kopyaladığınız kodlarda buna dikkat etmelisiniz.
Fonksiyon dönüşü
VBA'de fonksiyonların son satırı fonksiyonun adı ile aynı idi, VB.Net'te bu hala yapılabilirken aynı zamanda
Return ifadesi de kullanılabilir. c# metodlarında ise sadece Return kullanılır.
Function Deneme(param1 As String)
'....
Temp=1
Return Temp 'veya Deneme=Temp
End Function
Fonksiyon çağrılması
VBA'de fonksiyonlar doğrudan çağrılabilmekte iken, VB.Net'te bir modül içinde tanımlanan fonksiyonlar yine doğrudan çağrılabilirken, bir sınıf içinde tanımlanmış metodlar sınıf adıyla çağrılırlar. C#'ta da sadece sınıf metodları vardır. Tabi burada
Shared(Static) class yapısından da bahsedeceğiz. Sınıflardan türetilen nesnelerde ise metodu kullanımı zorunludur.
sayi = Sqr(4) 'Built-in Fonksiyon
sayi2 = Math.Sqrt(4) 'Shared sınıf metodu, sınıftan nesne yaratmadan doğrudan kullandık
sayi3 = MyFunc(10) 'Modül fonksiyonu(UDF)
Dim obje As New MyClass() 'Bu sınıfın Kokal diye bir metodu olduğunu düşünelim
sayı4 = obje.Kokal(4) 'sınıftan bi nesne yaratarak kullandık
Overloading
VBA'de olmayıp .Net dillerinde olan bir özellik de metodların overload edilebilmesi. Yani aynı isimde, ancak farklı parametre kümesiyle birden fazla metod olabilir.
Benimmetod(Sayi As Integer)
Benimmetod(Sayi As Integer, deger As Long)
Benimmetod(Sayi As Integer, adres As String)
Propertyler
VBA'de default propertyler yazılmadan geçilebiliyorken, .Net dillerinde böyle birşey sözkonusu değildir.
İlgili property açıkça yazılmalıdır.
deger=ActiveCell 'Value propertysi default propertydir
Bir de .Net'e bakalım
deger=ActiveCell.Value
NOT: Activecell.Value yazmak bu kadar basit değil ama prensipte böyle, basit olması adına böyle yazdım. Daha doğru yazımı sonra göreceğiz.
Yukarıda Veri Tipi Dönüştürme ve onun altındaki DirectCast/CType
konusunda biraz bahsetmiştim. Detayları VSTO kodlarında göreceğiz.
Indeksler
VBA'de diziler
0'dan da 1'den de başlayabiliyor. Collectionlar'ın indeksi ise hep 1'den başlıyor. Form elemanlarında da indeksler 0'dan başlıyor. .Net dillerinde ise indeks hep 0'dan başlar.
Bununla birlikte, VB.Net Excel'in kendisiyle ilgilendiğinde mecburen Excelin sınırlamalarına boyun eğer ve onun indeks mantığını kullanır. Mesesa sayfaların indeksi Vb.Net'te de 1'den başlar.
c# farkı
Indeksler Vb.Net'te VBA'de olduğu gibi () işaretleri arasında
gösterilirken c#'ta [] işaretleri arasında yazılır.
adet = Cells[1,1].Value
Nesnelere değer atama
VBA'de nesnelere Set ifadesi ile atama yapılırken .Net dillerinde ise Set ifadesi bulunmuyor. Ayrıca default propertyler nedeniyle VBA'de bir nesne hem kendisi olarak hem de default propertysi olarak aynı şekilde atanabiliyor, ki bu da karışık bir görüntüye neden oluyordu,
halbuki az önce gördüğümüz üzere .Net'te default property kullanımı
yoktur.
deger=ActiveCell 'default property ataması
Set hucre=ActiveCell
.Net'e bakalım
deger=ActiveCell.Value
hucre=ActiveCell 'bu kadar basit değil ama prensipte böyle, daha doğru yazımı sonra göreceğiz
Değişkenler ve Veri Tipleri
Tanımlama zorunluğu
VBA anlatırken "Değişkenlerinizi, tipi belli olacak şekilde(yani
variant değil) tanımlamak faydalı olur" diyorduk,
.Net'te artık bu faydanın size zorla dayatılması sözkonusu. c#ta her
değişken mutlaka belli bir tiple tanımlanmalıyken, Vb.Net'te biraz size bırakmışlar;
Option Strict On yapılarak bu zorunluluk sağlanır. c#
değil de Vb.Net'i kullanmaya karar verirseniz bu ayarı yapmayı
unutmayın. Bunu kod olarak da, Property menüsünden de yapabiliyorsunuz.
Variant vs Object
VBA'de hem Variant hem Object tipleri varken, .Net dillerinde sadece Object vardır. Variantlar da objecte dönüşmüştür.
Tanımlama
VBA'de deklerasyon(tanımlama) ve atama ayrı satırda yapılırken .Net
dillerinde tek satırda yapılabiliyor.
Dim a As Integer
a = 1
.Net'e bakalım
Dim a As Integer = 1
Ayrıca VBA'de aynı veri tipteki değişkenler tek seferde veri tipi sadece
bir kez belirtilerek tanımlanamazken .Net dillerinde tanımlanabilir.
Dim a As Integer, b As Integer 'Dim a, b As Integer deseydik a Variant olurdu
.Net'e bakalım
Dim a, b As Integer 'ikisi de integer
int a ,b;
Enumerations
VBA'da global olarak tanımlı bulunann xlCenter tarzındaki
enumerationlar, .Net'te artık global olarak bulunmaz ve doğrudan
kullanılamazlar. Bunlar uzun uzun yazılmalıdır, ancak neyseki
intellisense var. Üstelik Visual Studion'nun sürekli gelişen
versiyonalrıyla biz = düğmesine bastığımızda ne seçmemiz gerektiği
anında çıkıyor.
ActiveCell.HorizontalAlignment = xlCenter
CurrentRegion.Sort(..., xlAscending)
Application.Cursor = xlDefault
.Net'teki duruma bakalım
ActiveCell.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
CurrentRegion.Sort(..., Excel.XISortOrder.xlAscending)
Application.Cursor = Excel.XIMousePointer.xlDefault
Bir diğer değişiklik de Enumerationların constant değerleri yani
sayısal değerleri .Net'te yasaklı durumda. Yani kodlarınızı VBA'den
kopyalıyorsanız bunlara elle müdahale etmeniz gerekecektir.
Application.CutCopyMode = 1
CurrentRegion.Sort(..., 1)
Application.CutCopyMode = Excel.XICutCopyMode.xlCopy
CurrentRegion.Sort(..., Excel.XISortOrder.xlAscending)
VBA kodlarınızın .Net'e dönüştürülmesi
- Modül kodlarını aktarmak sıkıntı değil, ancak Userformlarınızı baştan yapmak zorundasınız.
- Kodlarınızı öncelikle VB.Net'e çevirebilirsiiniz. Bunun için
standart modül kodlarınızı Visual Studio'da açtığınız bir modül
içine kopyalayın. VS, hatalı yerlerin altını çizecektir. Sonra
gerekli düzeltmeleri yapın.
- Vb.Net'e çevirdiğinizi kodları
şu sayfada c# koduna
dönüştürebilirsiniz
- ADO kodlarınızı olduğu gibi bırakabilirsiniz ancak ADO.Net tercih sebebi olmalı, o yüzden yeniden yazmalısınız.
- VBA kodlarını VSTO kodunuz içinde de çalıştırabiliyorsunuz. Bunu
hiç denemedim ancak yapılabiliyor.
Aşağıdaki iki sayfadan daha detaylı bilgi alabilirsiniz.
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa192490(v=office.11)
https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/bb960898(v=office.12)
TEST SORULARI
Son Sorumuz şuymuş:Bir metindeki tüm noktaları yoketmek istiyorsunuz. Hangi fonksiyonu kullanırdınız?
Soru:
A şıkkı:
B şıkkı:
C şıkkı:
D şıkkı:
Doğru Cevap
Etiketler
İlişkili konuyu seç
5836
Label
* Sorulara verilen yanlış cevaplardaki esprili yorumlarım için hoşgörünüze sığınıyorum.
* Test ve Ödevlerdeki bazı detaylar burada anlatılmamış olabilir. Bunları kendiniz araştırıp bulmalısınız.
* Birden çok konuya ait içeriği olan ödevler var. Algoritmik açıdan bakıldığında o an en uygun konuya adreslenmiştir.
Dikkat! Bir soruya cevap verdikten sonra geri dönemezsiniz.