Genel Bakış
ExecuteExcel4Macro (Application yöntemi), eski Excel 4.0 (XLM) makro dilindeki bir işlevi ya da formülü metin olarak alıp çalıştıran ve sonucunu döndüren yöntemdir. VBA'nın doğrudan sunmadığı GET.CELL, GET.WORKBOOK gibi bilgi işlevlerine ulaşmak için kullanılır. Ayrıca R1C1 biçimindeki başvurularla hücre değeri okumak için de işe yarar.
Yöntem bir Variant döndürür. Dönen değer sayı, metin, mantıksal değer, hata değeri ya da dizi (array) olabilir.
Yalnızca VBA ile yapılabilen işleri bu yöntemle yapmayın. Örneğin hücre rengi ya da yazı tipi boyutu Interior ve Font nesneleriyle doğrudan okunabilir. Bu yöntem, VBA nesne modelinde karşılığı olmayan ya da pratik olmayan durumlar için ayrılmalıdır.
Makro, B2:B6 aralığını R2C2:R6C2 olarak yazıp Excel 4.0 işlevlerine gönderir. Toplam adet C2 hücresinde 815, en yüksek adet ise D2 hücresinde 310 olarak görünür.
İlk fiyat hücresinin biçim kodu C2 hücresine #,##0.00 olarak yazılır. D2 hücresindeki YANLIŞ değeri bir yazı tipi boyutu değil, mantıksal bir değerdir; bu nedenle GET.CELL türü 20 yazı tipi boyutunu okumak için kullanılamaz. Yazı tipi boyutunu Range.Font.Size ile, biçim kodunu Range.NumberFormat ile okuyabilirsiniz. Örnek, GET.CELL işlevinin çalışma biçimini göstermek içindir.
İlk sayfanın sırası A2 hücresinde 1, adı B2 hücresinde Satışlar olarak görünür. Çalışma kitabındaki toplam sayfa sayısı C2 hücresine 1 olarak yazılır. Sayfalar sekme sırasıyla listelenir.
Söz dizimi
Yöntem Application nesnesine aittir. Standart modülde doğrudan ExecuteExcel4Macro yazmanız da yeterlidir.sonuc = Application.ExecuteExcel4Macro(String)
- String: Zorunludur. Çalıştırılacak Excel 4.0 makro işlevi ya da formülü metin olarak verilir. Başına eşittir işareti konmaz. Başvurular A1 değil R1C1 biçiminde yazılır. Metin en fazla 255 karakter olabilir. Varsayılan değeri yoktur.
Yöntem bir Variant döndürür. Dönen değer sayı, metin, mantıksal değer, hata değeri ya da dizi (array) olabilir.
Başvuru yazımı ve dönüş değeri
Metin içindeki hücre başvuruları R1C1 biçimindedir. Örneğin R2C3, ikinci satır ile üçüncü sütunun kesiştiği hücreyi gösterir. Sayfa adı tek tırnak içine alınır ve ünlem işaretiyle başvurudan ayrılır. Sayfa adında boşluk ya da Türkçe karakter olabileceği için tırnak kullanmak güvenlidir.- Etkin çalışma kitabı: Çalışma kitabı adı verilmeyen başvurular, o anda etkin olan çalışma kitabına göre çözülür. Bu yüzden kodda önce ilgili sayfayı Activate ile etkinleştirmek iyi bir alışkanlıktır.
- Kapalı dosya: Kapalı bir çalışma kitabındaki hücre değeri, klasör yolu, köşeli parantez içindeki dosya adı ve sayfa adından oluşan tam başvuruyla okunabilir. Böylece dosyayı açmadan tek hücre değeri alınır.
- Dizi dönüşü: GET.WORKBOOK(1) gibi işlevler birden çok değer döndürür. Bu durumda sonuç bir diziye atanır ve LBound ile UBound ile gezilir.
- Hata: Geçersiz bir işlev ya da bağımsız değişken verilirse yöntem ya hata değeri döndürür ya da çalışma zamanı hatası oluşturur. Sonucu IsError ile denetleyin.
Sık kullanılan XLM işlevleri
- GET.CELL(tür, başvuru): Hücre hakkında bilgi verir. Tür sayısına göre sonuç değişir: 5 hücrenin içeriğini, 6 formül metnini, 7 sayı biçim kodunu, 17 satır yüksekliğini verir. Tür 20 ise yazı tipi boyutunu değil, mantıksal bir değer döndürür (Örnek 2'de YANLIŞ). Yazı tipi adı ve boyutu gibi bilgileri tür sayılarıyla aramak yerine Font nesnesinden okumak daha güvenlidir.
- GET.WORKBOOK(1): Çalışma kitabındaki tüm sayfaların adlarını, çalışma kitabı adıyla birlikte dizi olarak döndürür. Gizli sayfalar da listede yer alır.
- Genel işlevler: SUM, MAX, COUNT gibi sıradan çalışma sayfası işlevleri de aynı yöntemle R1C1 başvurularıyla çalıştırılabilir.
Yalnızca VBA ile yapılabilen işleri bu yöntemle yapmayın. Örneğin hücre rengi ya da yazı tipi boyutu Interior ve Font nesneleriyle doğrudan okunabilir. Bu yöntem, VBA nesne modelinde karşılığı olmayan ya da pratik olmayan durumlar için ayrılmalıdır.
1. R1C1 başvurusuyla toplam ve en yüksek değer
Aşağıdaki makroyu standart modüle yapıştırın. Makro, adet sütunundaki beş değerin toplamını ve en yüksek değerini R1C1 başvurusu kullanarak hesaplar ve C2 ile D2 hücrelerine yazar.
VBA
11 satır
Option Explicit
Sub ToplamVeEnYuksek()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Satışlar")
ws.Activate
' Sayfa adı tek tırnak içinde, aralık R1C1 biçiminde yazılır
ws.Range("C2").Value = ExecuteExcel4Macro("SUM('" & ws.Name & "'!R2C2:R6C2)")
ws.Range("D2").Value = ExecuteExcel4Macro("MAX('" & ws.Name & "'!R2C2:R6C2)")
End Sub
ExecuteExcel4Macro
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Adet | Toplam Adet | En Yüksek |
| 2 | Kalem | 120 | 815 | 310 |
| 3 | Defter | 85 | ||
| 4 | Silgi | 240 | ||
| 5 | Cetvel | 60 | ||
| 6 | Ataç | 310 |
SatışlarExcelDepo v1.0.0
2. GET.CELL ile sayı biçimi ve yazı tipi boyutu
Fiyat sütunu B2:B6 aralığında binlik ayraçlı ve iki ondalıklı biçimdedir. Makroyu standart modüle yapıştırın. Makro, her fiyat hücresinin sayı biçim kodunu (GET.CELL 7) okuyup C sütununa yazar. Ayrıca GET.CELL 20 ile yazı tipi boyutunu okumayı dener ve sonucu D sütununa yazar. Ancak tür 20 yazı tipi boyutu vermez, D sütununda mantıksal bir değer görünür.
VBA
19 satır
Option Explicit
Sub BicimBilgisiOku()
Dim ws As Worksheet
Dim r As Long
Dim adres As String
Set ws = ThisWorkbook.Worksheets("Fiyat Listesi")
ws.Activate
For r = 2 To 6
' Her satırdaki fiyat hücresinin R1C1 adresi
adres = "'" & ws.Name & "'!R" & r & "C2"
' 7: sayı biçimi, 20: yazı tipi boyutu
ws.Cells(r, 3).Value = ExecuteExcel4Macro("GET.CELL(7," & adres & ")")
ws.Cells(r, 4).Value = ExecuteExcel4Macro("GET.CELL(20," & adres & ")")
Next r
End Sub
ExecuteExcel4Macro
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün | Fiyat | Biçim Kodu | Yazı Boyutu |
| 2 | Laptop | 24.500,00 | #,##0.00 | YANLIŞ |
| 3 | Monitör | 6.350,50 | #,##0.00 | YANLIŞ |
| 4 | Klavye | 890,00 | #,##0.00 | YANLIŞ |
| 5 | Fare | 450,75 | #,##0.00 | YANLIŞ |
| 6 | Yazıcı | 3.999,00 | #,##0.00 | YANLIŞ |
Fiyat ListesiExcelDepo v1.0.0
3. Sayfa adlarını GET.WORKBOOK ile listeleme
Makroyu standart modüle yapıştırın. Makro, çalışma kitabındaki tüm sayfa adlarını (gizli olanlar dahil) GET.WORKBOOK(1) ile alır. Çalışma kitabı adını ayıklayıp yalnızca sayfa adını B sütununa, sıra numarasını A sütununa yazar. Toplam sayfa sayısı C2 hücresine gider.
VBA
29 satır
Option Explicit
Sub SayfaAdlariniListele()
Dim ws As Worksheet
Dim arr As Variant
Dim i As Long
Dim k As Long
Dim ad As String
Set ws = ThisWorkbook.Worksheets("Sayfa Listesi")
ws.Activate
' Tüm sayfa adları dizi olarak gelir
arr = ExecuteExcel4Macro("GET.WORKBOOK(1)")
' Tek sayfa varsa dizi yerine metin dönebilir
If Not IsArray(arr) Then arr = Array(arr)
k = 0
For i = LBound(arr) To UBound(arr)
k = k + 1
' Köşeli parantezli çalışma kitabı adını at, yalnız sayfa adını al
ad = Mid(arr(i), InStr(arr(i), "]") + 1)
ws.Cells(k + 1, 1).Value = k
ws.Cells(k + 1, 2).Value = ad
Next i
ws.Range("C2").Value = k
End Sub
ExecuteExcel4Macro
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Sıra | Sayfa Adı | Toplam Sayfa |
| 2 | 1 | Satışlar | 1 |
Sayfa ListesiExcelDepo v1.0.0
Kullanırken dikkat edin
- Eşittir işareti kullanmayın: Yöntemin bağımsız değişkeni eşittir işaretiyle başlamamalıdır. Örneğin GET.WORKBOOK(1) yazın, eşittir işaretli biçimi yazmayın. Aksi halde işlev tanınmayabilir ve hata alırsınız.
- R1C1 biçimini unutmayın: Metin içindeki başvurular A1 biçiminde değil, R1C1 biçiminde yazılmalıdır. Satır ve sütun numarasını döngü değişkenlerinden birleştirerek oluşturmak en pratik yoldur.
- 255 karakter sınırı: Bağımsız değişken olarak verilen metin en fazla 255 karakter olabilir. Uzun klasör yolları ve sayfa adları bu sınırı aşabilir. Böyle durumlarda başvuruyu kısaltın ya da başka bir yöntem seçin.
- Sayfa etkin olmalıdır: Çalışma kitabı adı verilmeyen başvurular etkin çalışma kitabına göre çözülür. Kodu çalıştırmadan önce Activate ile ilgili çalışma kitabını ve sayfayı etkinleştirin. Yoksa beklenmedik bir kitabın değeri okunabilir.
- Güvenlik ve uyumluluk: Excel 4.0 makro dili eski bir teknolojidir. Güvenlik ayarlarında bu makrolar için ayrı bir denetim bulunur ve kötü amaçlı dosyalarda sık kötüye kullanılır. Kurumsal ortamlarda bu nedenle kısıtlanmış olabilir. Mümkünse Range, Font, Interior gibi VBA nesne modeli karşılıklarını tercih edin.
- İlgili konular:
- Evaluate: Formül metnini A1 biçiminde çalıştıran yöntem
- Application.Run: Makro çalıştırma yöntemi
- Range.NumberFormat: Sayı biçim kodunu okuma ve yazma
- Range.Font: Yazı tipi özellikleri
- IsError: Hata değeri denetimi
- LBound ve UBound: Dizi sınırları
- Formüller > Tanımlı Adlar > Ad Yöneticisi (Formulas > Defined Names > Name Manager): Ad içinde XLM işlevi kullanımı
- DOLAYLI: Metinden başvuru oluşturan çalışma sayfası işlevi