Sıfırdan VBA Makroları Yazma

Excel'in makro kaydedicisinin çok fazla gücü vardır, ancak sınırlamaları vardır. Başka bir makalede ele alındığı gibi, makro kaydedici genellikle gereksiz kodları kaydeder ve mantık veya diğer programlarla etkileşimler gibi şeyleri kaydedemez. Daha uzun makrolar için kullanmak da zor olabilir - sadece maliyetli hatalar yapmaktan kaçınmak için eylemlerinizi önceden storyboard'da bulabilirsiniz.

Bu makale, VBA'da sıfırdan makro kodlamaya başlamanıza yardımcı olmayı amaçlamaktadır. Makroların nerede saklandığını öğrenecek, temel bir makro yazacak ve değişkenleri, mantığı ve döngüleri kullanarak VBA'da programlamanın temellerini öğreneceksiniz.

Başlarken

VBA ve Visual Basic Düzenleyicisi

VBA veya Visual Basic for Applications, makroların yazıldığı dildir. İster elle kodlanmış, ister makro kaydedici ile oluşturulmuş olsun, tüm makrolar VBA kodu olarak depolanır.

Visual Basic Düzenleyicisi'ni kullanarak bir çalışma kitabındaki tüm VBA koduna erişebilirsiniz. Bu, Excel dahil tüm ofis uygulamalarında yerleşik olarak bulunan özel bir metin düzenleyici ve hata ayıklayıcıdır. Genellikle, bu düzenleyiciyi ALT+F11 Excel'de klavye kısayolu, ancak buna Excel'den de erişebilirsiniz. geliştirici sekmesini etkinleştirdiyseniz.

Proje Gezgini

NS Proje Gezgini içinde VBA kodu olabilecek tüm öğeleri gösteren VB Düzenleyicisi içindeki bir penceredir. Bu pencereyi görmüyorsanız, düğmesine basın. F5 görünmesini sağlamak veya seçmek için Proje Gezgini itibaren görüş Menü.

Proje Gezgini'nde bir öğeye çift tıklamak, o öğenin kodunu gösterecektir. Proje Gezgini'nde görüntülenebilecek birkaç tür öğe vardır:

  • çalışma kitapları
  • çalışma sayfaları
  • Kullanıcı Formları
  • Sınıf Modülleri
  • Modüller (makrolar bu öğelerde saklanır)

Tüm bu öğe türleri VBA kodunu içerebilse de en iyi uygulama, Modüllerdeki makroları kodlamaktır.

İlk Makronuzu Yapmak

Makro Listesini Kullanma

Makrolar Listesi, çalışma kitabınızdaki tüm makroları gösterir. Bu listeden mevcut bir makroyu düzenleyebilir veya yeni bir tane oluşturabilirsiniz.

Makrolar listesini kullanarak yeni bir makro oluşturmak için:

  • Geliştirici sekmesini seçin ve tıklayın makrolar (veya basın ALT+F8)

  • Makronuz için yeni bir ad yazın ve ardından "Oluştur"u tıklayın.

“Oluştur”a tıkladıktan sonra, yeni oluşturulan makroyu gösteren VB Editörü görünecektir. Excel, gerekirse makro için yeni bir modül oluşturacaktır.

VB Editöründe manuel olarak

Makrolar listesi olmadan manuel olarak yeni bir makro ekleyebilirsiniz. Makronun kaydedildiği modülü belirtmek istiyorsanız bu daha iyi bir seçenektir.

Manuel olarak bir makro eklemek için:

  • VB Düzenleyiciyi açın (ALT+F11)
  • Herhangi biri:
    • Tıklayarak yeni bir modül ekleyin Ekle > Modül menüde (modül otomatik olarak açılacaktır)

    • VEYA, açmak için Proje Gezgini'nde mevcut bir modüle çift tıklayın

  • Modülde, yeni makronuzun kodunu yazın
Sub MyMacro() End Sub

Bu iki satır, “MyMacro” adlı bir makronun başlangıcını ve sonunu gösterir (gerekli olan parantezlere dikkat edin). Bu, Excel'deki "Makroları Görüntüle" iletişim kutusunda görünecek ve bir düğmeye atanabilir (henüz hiçbir şey yapmasa da).

Makroya biraz kod ekleyin

Şimdi, bu makronun gerçekten bir şeyler yapmasını sağlamak için “Sub” ve “End Sub” satırları arasına bir kod ekleyelim:

Sub MyMacro() Range(“A1”).Value = “Merhaba Dünya!” Alt Bitiş

Temel Kod Yapıları

Menzil Nesnesi

Excel VBA, bir çalışma sayfasındaki hücreleri temsil etmek için Aralık Nesnesini kullanır. Yukarıdaki örnekte, kodla bir Range nesnesi oluşturulur. Aralık(“A1”) A1 hücresinin değerine erişmek için.
Aralık Nesneleri öncelikle hücre değerlerini ayarlamak için kullanılır:

Aralık(“A1”).Değer = 1
Aralık(“A1”).Value = "Birinci Hücre"

Hücre değerlerini sayı olarak tanımlarken sadece sayıyı girdiğinize, ancak metin girerken metni tırnak içine almanız gerektiğine dikkat edin.

Aralıklar, yazı tipi, kenarlıklar, formüller ve daha fazlası gibi hücrelerin birçok özelliğine erişmek için de kullanılabilir.
Örneğin, bir hücrenin yazı tipini şu şekilde Kalın olarak ayarlayabilirsiniz:

Aralık(“A1”).Font.Bold = Doğru

Bir hücrenin formülünü de ayarlayabilirsiniz:

Aralık(“A1”).Formül = “=Toplam(A2:A10)”

Excel'de, imleçle bir hücre bloğu seçebilir (örneğin, A1'den D10'a kadar) ve hepsini kalın olarak ayarlayabilirsiniz. Range nesneleri aşağıdaki gibi hücre bloklarına erişebilir:

Aralık(“A1:D10”).Font.Bold = True

Aynı anda birkaç hücreye/bloğa da başvurabilirsiniz:

Aralık(“A1:D10,A12:D12,G1”).Font.Bold = True

Bunun biçimi, Excel'de SUM() formülü için hücre seçerken kullanacağınız biçimle aynıdır. Her blok bir virgülle ayrılır ve bloklar, iki nokta üst üste ile ayrılan sol üst ve sağ alt hücrelerle gösterilir.

Son olarak, Range nesnelerinin bir çalışma sayfasında ortak işlemleri gerçekleştirmek için yerleşik yöntemleri vardır. Örneğin, bazı verileri bir yerden diğerine kopyalamak isteyebilirsiniz. İşte bir örnek:

Aralık(“A1:D10”).Kopyalama Aralığı(“F1”).PasteSpecial xlPasteValues ​​Range(“F1”).PasteSpecial xlPasteFormats

Bu, A1:D10 hücrelerini panoya kopyalar ve ardından C1 hücresinden başlayarak bir PasteSpecial() yapar - tıpkı Excel'de el ile yaptığınız gibi. Bu örneğin PasteSpecial()'ın yalnızca Değerleri ve Biçimleri yapıştırmak için nasıl kullanılacağını gösterdiğine dikkat edin - Özel Yapıştır iletişim kutusunda göreceğiniz tüm seçenekler için parametreler vardır.

İşte başka bir çalışma sayfasına "Tümü" yapıştıran bir örnek:

Aralık(“A1:D10”). Sayfaları Kopyala(“Sayfa2”).Range(“A1”).PasteSpecial xlPasteAll

If İfadeleri

Bir ile If deyimi, bir kod bölümünün yalnızca belirli bir ifade doğruysa "eğer" çalıştırılmasını sağlayabilirsiniz.

Örneğin, bir hücreyi kalın yapmak ve kırmızıya boyamak isteyebilirsiniz, ancak yalnızca hücredeki değer 100'den küçükse "eğer".

Eğer Range(“A4”).Value < 100 O zaman Range(“A4”).Font.Bold = True Range("A4").Interior.Color = vbRed End If 

Bir If ifadesinin uygun yapısı aşağıdaki gibidir (köşeli parantezler isteğe bağlı bileşenleri gösterir):

eğer o zaman

[ElseIf O zaman]

[Başka]

Bitir

kadar dahil edebilirsiniz ElseIf birden çok koşulu test etmek istediğiniz gibi engeller. Ayrıca bir ekleyebilirsiniz Başka Yalnızca If ifadesindeki diğer koşullardan hiçbiri karşılanmadığında çalışan blok.

Burada, hücrenin değere bağlı olarak birkaç farklı şekilde biçimlendirildiği, öncekine dayalı başka bir örnek verilmiştir:

If Range("A4").Value < 100 O zaman Range("A4").Font.Bold = True Range("A4").Interior.Color = vbRed ElseIf Range("A4").Value < 200 Then Range( "A4").Font.Bold = False Range("A4").Interior.Color = vbYellow Else Range("A4").Font.Bold = False Range("A4").Interior.Color = vbGreen End If

Yukarıdaki örnekte, değerin 100'ün altında olmadığı ElseIf bloklarında hücre kalınlaştırılmamıştır. yuva Kodun kopyalanmasını önlemek için if ifadeleri şöyle:

If Range("A4").Value < 100 O zaman Range("A4").Font.Bold = True Range("A4").Interior.Color = vbRed Else Range("A4").Font.Bold = False ' yazı tipini yalnızca bir kez kalınlaştırma If Range("A4").Value < 200 Then Range("A4").Interior.Color = vbYellow Else Range("A4").Interior.Color = vbGreen End If End If

Değişkenler

A Değişken bir makro çalışırken geçici bilgileri depolamak için kullanılan bir bellek parçasıdır. Genellikle döngülerde yineleyici olarak veya bir makro boyunca birkaç kez kullanmak istediğiniz bir işlemin sonucunu tutmak için kullanılırlar.

İşte bir değişken örneği ve onu nasıl kullanabileceğiniz:

Sub ExtractSerialNumber() Dim strSerial As String ' bu değişken bildirimidir ' 'As String', bu değişkenin metni tutması gerektiği anlamına gelir ' taklit bir seri numarası ayarlar: Range("A4").Value = “seri# 804567-88 ” ' seri numarasını A4 hücresinden ayrıştırın ve onu strSerial = Mid(Range(“A4”) değişkenine atayın.Value, 9) ' artık seri numarasını iki kez ayrıştırmak yerine değişkeni iki kez kullanın Range(“ B4”).Value = strSerial MsgBox strSerial End Sub 

Bu temel örnekte, "strSerial" değişkeni, Mid() işlevini kullanarak A4 hücresinden seri numarasını çıkarmak için kullanılır ve ardından iki yerde daha kullanılır.

standart yol bildirmek bir değişken aşağıdaki gibidir:

loş adı ne olursa olsun [Olarak tip]

  • adı ne olursa olsun değişkeninize vermeye karar verdiğiniz isimdir
  • tip değişkenin veri türüdür

“[As tip]” kısmı atlanabilir - eğer öyleyse, değişken her türlü veriyi tutabilen bir Variant türü olarak bildirilir. Tamamen geçerli olsalar da, dikkatli olmazsanız beklenmedik sonuçlara yol açabileceklerinden Varyant türlerinden kaçınılmalıdır.

Var tüzük değişken isimleri için Bir harf veya alt çizgi karakteri ile başlamaları gerekir, boşluk, nokta, virgül, tırnak işareti veya “! @ & $ #”.

İşte bazı değişken bildirim örnekleri:

Dim strFilename As String ' iyi ad stili - açıklayıcı ve önek kullanır Dim i As Long ' kötü ad stili - yalnızca bazı yineleyiciler için kabul edilebilir Dim SalePrice As Double ' tamam ad stili - açıklayıcı, ancak Dim iCounter ' tamam adı önekini kullanmaz - çok açıklayıcı değil, önek kullanıyor, veri türü yok

Bu örneklerin tümü, biraz farklı adlandırma şemaları kullanır, ancak tümü geçerlidir. Bir değişken adının önüne veri türünün kısa bir biçimini eklemek (bu örneklerden bazılarına göre) kötü bir fikir değildir, çünkü bu, kodunuzu bir bakışta daha okunabilir hale getirir.

VBA birçok temel içerir veri tipleri. En popüler olanlar şunları içerir:

  • Sicim (metin verilerini tutmak için kullanılır)
  • Uzun (tam sayıları tutmak için kullanılır, yani ondalık basamak yok)
  • Çift (kayan noktalı sayıları tutmak için kullanılır, yani ondalık basamaklar)

VBA içsel veri türlerinin tam listesi burada bulunabilir: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

Aralık Nesne Değişkenleri

Menzil Nesnelerine başvuran değişkenler oluşturmak da mümkündür. Bu, kodunuzdaki belirli bir aralığa birkaç yerde başvurmak istiyorsanız kullanışlıdır - bu şekilde, aralığı değiştirmeniz gerekirse, yalnızca tek bir yerde değiştirmeniz gerekir.

Bir Range nesne değişkeni oluşturduğunuzda, onu bir Range örneğine “ayarlamanız” gerekir. Örneğin:

Dim rMyRange As Range Set rMyRange = Range(“A1:A10;D1:J10”)

Range değişkeni atarken “Set” ifadesinin dışarıda bırakılması hataya neden olacaktır.

döngüler

Döngüler, içindeki kodu belirli sayıda tekrar eden bloklardır. Yazmanız gereken kod miktarını azaltmak için kullanışlıdırlar ve birçok farklı ilgili öğe üzerinde aynı eylemleri gerçekleştiren tek bir kod parçası yazmanıza izin verirler.

For-Sonraki

A For-Sonraki blok, belirli sayıda tekrar eden bir döngüdür. olarak bir değişken kullanır. yineleyici kaç kez çalıştığını saymak için ve bu yineleyici değişken döngü içinde kullanılabilir. Bu, For-Next döngülerini hücreler veya diziler arasında yineleme yapmak için çok kullanışlı hale getirir.

İşte 1'den 100'e kadar olan satırlar, 1. sütundaki hücreler arasında dolaşan ve değerlerini yineleyici değişkenin değerine ayarlayan bir örnek:

Dim i As Long For i = 1 ila 100 Hücre(i, 1).Value = i Next i

“For i = 1 ila 100” satırı, döngünün 1'den başlayıp 100'den sonra bittiği anlamına gelir. İstediğiniz başlangıç ​​ve bitiş numaralarını ayarlayabilirsiniz; bu sayılar için değişkenler de kullanabilirsiniz.

For-Next döngüleri varsayılan olarak 1 sayılır. Farklı bir sayı ile saymak istiyorsanız, döngüyü açık bir şekilde yazabilirsiniz. Adım madde:

i = 5 ila 100 Adım 5 için

Bu döngü 5'te başlayacak, ardından döngü her tekrarlandığında 'i'ye 5 ekleyecektir (böylece 'i' ikinci tekrarda 10, üçüncüde 15 olacak ve bu böyle devam edecektir).

kullanma Adım, bir döngüyü geriye doğru da sayabilirsiniz:

i = 100 ila 1 Adım -1 için

Ayrıca yuva For-Next döngüleri. Her blok, saymak için kendi değişkenini gerektirir, ancak bu değişkenleri istediğiniz yerde kullanabilirsiniz. Excel VBA'da bunun nasıl yararlı olduğuna dair bir örnek:

Dim i As Long, j As Long For i = 1 ila 100 For j = 1 ila 100 Cells(i, j).Value = i * j Sonraki j Sonraki i

Bu, hem satırlar hem de sütunlar arasında geçiş yapmanızı sağlar.

UYARI: izin verilmesine rağmen, bir For-Next bloğu içindeki yineleyici değişkeni ASLA DEĞİŞTİRMEmelisiniz, çünkü döngüyü takip etmek için bu yineleyiciyi kullanır. Yineleyiciyi değiştirmek sonsuz bir döngüye neden olabilir ve makronuzu askıda bırakabilir. Örneğin:

i = 1 ila 100 i = 1 için Sonraki i

Bu döngüde, 'I' 1'e sıfırlanmadan önce asla 2'nin ötesine geçmeyecek ve döngü sonsuza kadar tekrar edecektir.

Her biri için

Her biri için bloklar, For-Next bloklarına çok benzer, ancak kaç kez döngü yapacaklarını belirtmek için bir sayaç kullanmazlar. Bunun yerine, For-Each bloğu, nesnelerin bir 'koleksiyonunu' (hücre aralığı gibi) alır ve bu koleksiyondaki nesneler kadar çok kez çalışır.

İşte bir örnek:

Dim As Range As Range In Range("A15:J54") r.Value > 0 ise r.Font.Bold = True End If Next r

Range nesne değişkeni 'r' kullanımına dikkat edin. Bu, For-Each döngüsünde kullanılan yineleyici değişkendir - döngü boyunca her seferinde 'r', Aralıktaki sonraki hücreye bir başvuru alır.

Excel VBA'da For-Each döngülerini kullanmanın bir avantajı, bir aralıktaki tüm hücreler arasında döngüleri yerleştirmeden döngü yapabilmenizdir. Gibi karmaşık bir aralıktaki tüm hücreler arasında dolaşmanız gerekiyorsa, bu kullanışlı olabilir. Aralık(“A1:D12,J13, M1:Y12”).

For-Each döngülerinin bir dezavantajı, hücrelerin işlenme sırası üzerinde hiçbir kontrolünüz olmamasıdır. Rağmen uygulamada Excel sırayla hücreler arasında dolaşacaktır, teoride hücreleri tamamen rastgele bir sırayla işleyebilir. Hücreleri belirli bir sırayla işlemeniz gerekiyorsa, bunun yerine For-Next döngülerini kullanmalısınız.

Do-Döngüsü

For-Next blokları ne zaman duracağını bilmek için sayaçları kullanırken, Do-Döngüsü Bloklar bir koşul sağlanana kadar çalışır. Bunu yapmak için bir A kadar koşulu test eden ve bu koşul karşılandığında döngünün durmasına neden olan bloğun başında veya sonunda bulunan madde.

Örnek:

Dim str As String str = "Buffalo" str = “Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo” str = str & " " & "Buffalo" Döngü Aralığı("A1").Değer = str

Bu döngüde, "Buffalo", beklenen cümleyle eşleşene kadar döngü boyunca her seferinde 'str' ile birleştirilir. Bu durumda, test döngünün başında gerçekleştirilir - eğer 'str' zaten beklenen cümleyse (ki bu, onu bu şekilde başlatmadığımız için değil, ama eğer) döngü çalışmazdı bile .

Bitiş yan tümcesini aşağıdaki gibi sona taşıyarak döngünün en az bir kez çalışmasını sağlayabilirsiniz:

Do str = str & " " & "Buffalo" str = “Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo”ya Kadar Döngü

Makronuzda hangisi mantıklıysa onu kullanabilirsiniz.

UYARI: Bitiş koşulu hiçbir zaman karşılanmazsa, Do-Loop bloğu ile sonsuz bir döngüye neden olabilirsiniz. Kodunuzu her zaman, bu tür bir döngü kullandığınızda Bitiş koşulunun kesinlikle karşılanacağı şekilde yazın.

Sıradaki ne?

Temel bilgileri kavradıktan sonra, neden daha ileri teknikler öğrenmeyi denemiyorsunuz? https://easyexcel.net/excel/learn-vba-tutorial/ adresindeki eğiticimiz, burada öğrendiğiniz her şeyi geliştirecek ve Etkinlikler, Kullanıcı Formları, kod optimizasyonu ve çok daha fazlasıyla becerilerinizi geliştirecek!

wave wave wave wave wave