Bu siteye giriş yaparak Çerez kullanımını kabul etmiş oluyorsunuz. İşbu sitede; çerez olarak, sadece son giriş tarihiniz ve eğer üye olursanız oturum statünüz tutulacaktır. Bunlar dışında başka hiçbir bilgi tutulmamaktadır. Çerezler için detaylı bilgi için buraya tıklayınız.
ANLADIM

DUYURULAR

Yeni eklenen ve/veya güncellenen sayfaları görmek için buraya tıklayınız.

Güncel ödev ve test listesini görmek için buraya tıklayınız.

Sitede yapılan iyileştirmeAer ve hata düzeltmelerine ait tüm bilgilendirmeleri görmek içinburaya tıklayınız.

Baş
Udemy
Konular
Son
Konular
NetDilleri
Giris
VSTO

.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ç

103581

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.
0
0
0
0

SoruID:... Şu an için bu konu için soru bulunmamaktadır. İletişim menüsünden örnek sorularınızı bana iletebilirsiniz.




ÖDEVLER

0
0
ÖdevNo:... Şu an için bu konu için ödev bulunmamaktadır. İletişim menüsünden örnek ödev sorularını bana iletebilirsin.
Çözüme bakın(Başka türlü de çözülebilir tabi, bu benim çözümüm.)




=YORUMLAR ve SORULAR=


DEVİR UYARISI

Herkese merhaba. Hosting maliyetlerinin aşırı artması yüzünden sitemi yakın zamanda(en geç Mayıs 2023) kapatmaya karar vermiştim. Ancak, siteyi yakından takip eden bir arkadaş siteyi devralmak istemiştir. Siteyi, Mayıs ayında kendisine devir etmeye karar verdim. Üyelik bilgilerini bana güvenerek girdiğiniz için, hepsini silmiş bulunuyorum, yani mail adreslerinizi kimseyle paylaşmamış olacağım. Bilginizi rica ederim.