Genel Bakış
SendKeys (Application.SendKeys), Excel'de etkin olan pencereye klavyeden tuşa basılmış gibi tuş vuruşları gönderen yöntemdir. Nesne modeliyle doğrudan yapılamayan, yalnızca klavye kısayoluyla ya da bir iletişim kutusuna yazılarak yapılabilen işlemleri makroya bağlamak için kullanılır. Tuş vuruşları gerçek klavye girişi gibi işlendiği için sonucu etkin pencereye ve odaktaki öğeye bağlıdır; bu nedenle son çare olarak düşünülmelidir.
Bu simgelerden biri düz metin olarak gönderilecekse süslü parantez içine alınmalıdır: {+}, {^}, {%}. Aynı kural ~, (, ), {, }, [ ve ] karakterleri için de geçerlidir; süslü parantezler {{} ve {}} biçiminde yazılır.
Makro her satır için özel karakterleri süslü parantez içine alır. İlk metin B2 hücresinde Toplam{+}KDV, yüzde işaretli metin B3 hücresinde Yüzde 50{%} olur. Üstel işaretli metnin kodu Alan{^}2, tilde içerenin kodu Ali{~}Veli, süslü parantezli metnin kodu {{}Not{}} ve parantezli metnin kodu Liste{(}Ocak{)}{[}1{]} biçimindedir. Bu değerler SendKeys ile gönderildiğinde karakterler tuş birleşimi olarak değil düz metin olarak yazılır.
Makro işaretli seçeneklere göre simgeleri tuşun önüne ekler. Ctrl+C için E2 hücresinde ^c, Ctrl+Shift+L için E4 hücresinde ^+l, Alt+F için E5 hücresinde %f yazar. Değiştirici seçilmeyen {F9} satırında kod E6 hücresinde {F9} olarak kalır. Ctrl+Home için E7 hücresindeki ^{HOME} ve Shift+Delete için E8 hücresindeki +{DELETE} değerleri doğrudan Application.SendKeys içine yazılabilir.
Makro çalıştırıldığında InputBox açılır, kutuya Ankara yazılıp Enter'a basılmış gibi kapanır ve B2 hücresine Ankara metni yazılır. Kullanıcıya hiçbir şey sorulmadığı için bu yöntem yalnızca test ya da otomasyon amacıyla anlamlıdır; gerçek bir giriş istiyorsanız SendKeys satırını kaldırın.
Söz dizimi
Yöntem Application nesnesine aittir ve tuş dizisini bir metin olarak alır:
VBA
3 satır
Application.SendKeys Keys, Wait
' ya da değer döndürmeden parantezli yazım:
Application.SendKeys(Keys:="^c", Wait:=True)
- Keys: Gönderilecek tuş vuruşlarını tanımlayan metin; zorunludur. Düz karakterler olduğu gibi yazılır, özel tuşlar süslü parantez içinde kod olarak verilir.
- Wait: İsteğe bağlıdır; varsayılanı False'tur. True verilirse Excel tuşlar işlenene kadar bekler ve sonra makroya döner. False iken makro hemen devam eder, tuşlar ise Excel boştayken ya da bir iletişim kutusu girdi beklerken işlenir.
Özel tuş kodları
Yazdırılamayan tuşlar süslü parantez içinde kodlarıyla yazılır. Sık kullanılanlar:- {BACKSPACE} ya da {BS}: Geri silme tuşu.
- {DELETE} ya da {DEL}: Delete tuşu.
- {ENTER} ya da ~: Enter tuşu.
- {ESC}: Esc tuşu.
- {TAB}: Tab tuşu.
- {HOME}, {END}: Home ve End tuşları.
- {PGUP}, {PGDN}: Sayfa yukarı ve sayfa aşağı.
- {UP}, {DOWN}, {LEFT}, {RIGHT}: Ok tuşları.
- {INSERT}: Insert tuşu.
- {F1} ... {F15}: İşlev tuşları.
- {CAPSLOCK}, {NUMLOCK}, {SCROLLLOCK}: Kilit tuşları.
- {BREAK}, {HELP}, {RETURN}: Diğer özel tuşlar.
Değiştirici tuşlar ve gruplama
Üç tuş özel anlam taşır: + Shift tuşunu, ^ Ctrl tuşunu, % Alt tuşunu temsil eder. Bu simge, kendisinden hemen sonra gelen tuşa uygulanır; örneğin ^c Ctrl+C, %f Alt+F anlamına gelir. Birden çok tuşa aynı değiştirici uygulanacaksa tuşlar parantezle gruplanır: +(ec) Shift basılıyken e ve c tuşlarına basar.Bu simgelerden biri düz metin olarak gönderilecekse süslü parantez içine alınmalıdır: {+}, {^}, {%}. Aynı kural ~, (, ), {, }, [ ve ] karakterleri için de geçerlidir; süslü parantezler {{} ve {}} biçiminde yazılır.
Ne zaman ve nasıl kullanılır
Tuş vuruşları, makro çalışırken odakta olan pencereye gider. Wait değeri False ise tuşlar makro sürerken kuyruğa girer ve InputBox gibi girdi bekleyen bir iletişim kutusu açıldığında işlenir. Bu davranış, kutuyu önceden doldurmak için kullanılabilir. Wait değeri True ise bir sonraki makro satırına geçilmeden önce tuşların işlenmesi sağlanır; ancak bir iletişim kutusu açıp kapanmasını beklemek için yine de güvenilir değildir.1. Özel karakterleri SendKeys için kaçırma
A sütunundaki metinlerde SendKeys'in özel anlam verdiği karakterler var. Aşağıdaki kodu standart modüle (Ekle > Modül) yapıştırın. Makro her metnin SendKeys'e güvenle gönderilebilecek biçimini B sütununa yazar; özel karakterleri süslü parantez içine alır.
VBA
29 satır
Option Explicit
' Özel karakterleri {..} içine alan yardımcı işlev
Function SendKeysKacis(ByVal metin As String) As String
Dim i As Long
Dim c As String
Dim sonuc As String
For i = 1 To Len(metin)
c = Mid$(metin, i, 1)
Select Case c
Case "+", "^", "%", "~", "(", ")", "{", "}", "[", "]"
sonuc = sonuc & "{" & c & "}"
Case Else
sonuc = sonuc & c
End Select
Next i
SendKeysKacis = sonuc
End Function
Sub KacisYaz()
Dim ws As Worksheet
Dim r As Long
Set ws = ActiveSheet
For r = 2 To 7
' Metin olarak yazılsın, formül sanılmasın
ws.Cells(r, 2).NumberFormat = "@"
ws.Cells(r, 2).Value = SendKeysKacis(CStr(ws.Cells(r, 1).Value))
Next r
End Sub
SendKeys
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Metin | SendKeys Kodu |
| 2 | Toplam+KDV | Toplam{+}KDV |
| 3 | Yüzde 50% | Yüzde 50{%} |
| 4 | Alan^2 | Alan{^}2 |
| 5 | Ali~Veli | Ali{~}Veli |
| 6 | {Not} | {{}Not{}} |
| 7 | Liste(Ocak)(1) | Liste{(}Ocak{)}{(}1{)} |
Metin KaçışExcelDepo v1.0.0
2. Tuş birleşiminden SendKeys kodu üretme
Sayfada her satır bir tuşu ve onunla birlikte basılacak Ctrl, Shift, Alt seçeneklerini gösterir. Kodu standart modüle yapıştırın. Makro, değiştirici simgeleri (^, +, %) doğru sırayla tuşun önüne ekleyerek E sütununa SendKeys kodunu yazar.
VBA
18 satır
Option Explicit
Sub KodUret()
Dim ws As Worksheet
Dim r As Long
Dim kod As String
Set ws = ActiveSheet
For r = 2 To 8
kod = ""
If ws.Cells(r, 2).Value = True Then kod = kod & "^" ' Ctrl
If ws.Cells(r, 3).Value = True Then kod = kod & "+" ' Shift
If ws.Cells(r, 4).Value = True Then kod = kod & "%" ' Alt
kod = kod & ws.Cells(r, 1).Value
' + ile başlayan kod formül sanılmasın
ws.Cells(r, 5).NumberFormat = "@"
ws.Cells(r, 5).Value = kod
Next r
End Sub
SendKeys
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Tuş | Ctrl | Shift | Alt | SendKeys Kodu |
| 2 | c | DOĞRU | YANLIŞ | YANLIŞ | ^c |
| 3 | v | DOĞRU | YANLIŞ | YANLIŞ | ^v |
| 4 | l | DOĞRU | DOĞRU | YANLIŞ | ^+l |
| 5 | f | YANLIŞ | YANLIŞ | DOĞRU | %f |
| 6 | {F9} | YANLIŞ | YANLIŞ | YANLIŞ | {F9} |
| 7 | {HOME} | DOĞRU | YANLIŞ | YANLIŞ | ^{HOME} |
| 8 | {DELETE} | YANLIŞ | DOĞRU | YANLIŞ | +{DELETE} |
Tuş KodlarıExcelDepo v1.0.0
3. InputBox'ı önceden doldurma
Bu örnekte SendKeys, açılacak InputBox'a önceden metin ve Enter tuşu gönderir. Kodu standart modüle yapıştırın. Wait değeri False olduğu için tuşlar kuyrukta bekler ve InputBox açıldığında işlenir. Kod etkileşimli bir iletişim kutusu açtığı için bu sayfada otomatik çalıştırılmaz.
VBA
10 satır
Option Explicit
Sub SehirSor()
Dim sehir As String
' Tuşlar kuyruğa girer, InputBox açılınca işlenir
Application.SendKeys "Ankara{ENTER}", False
sehir = InputBox("Şehir adını girin:", "Şehir")
' Sonucu etkin sayfanın B2 hücresine yaz
ActiveSheet.Range("B2").Value = sehir
End Sub
SendKeys
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Alan | Değer |
| 2 | Şehir |
Veri GirişiExcelDepo v1.0.0
Kullanırken dikkat edin
- Güvenilirlik sınırı: SendKeys tuşları etkin pencereye gönderir. Makro çalışırken başka bir pencere öne geçerse, kullanıcı klavyeye dokunursa ya da bir uyarı penceresi açılırsa tuşlar yanlış yere gidebilir. Nesne modeliyle yapılabilen her işlemi (hücre yazma, kopyalama, hesaplama, kaydetme) SendKeys yerine doğrudan özellik ve yöntemlerle yapın.
- Wait değerine dikkat edin: Wait değeri False iken makro tuşlar işlenmeden devam eder ve sıralama beklediğinizden farklı olabilir. True değeri tuşların işlenmesini bekler; ancak bir iletişim kutusunun açılıp kapanmasını garanti etmez. Kutu açan bir komutu SendKeys ile çağırıp aynı satırda yanıtlamaya çalışmak sık görülen bir hatadır.
- Özel karakterleri kaçırmayı unutmayın: Kullanıcıdan ya da hücrelerden gelen metinde +, ^, %, ~, parantez ve köşeli parantez karakterleri varsa bunları süslü parantez içine almazsanız tuş birleşimi olarak yorumlanırlar. Birinci örnekteki gibi bir yardımcı işlev kullanın.
- Klavye ve dil bağımlılığı: Alt tuşlu menü kısayolları Excel'in arayüz diline ve sürümüne göre değişir; Türkçe Excel'de çalışan bir Alt dizisi İngilizce Excel'de başka bir komutu çalıştırabilir. Şerit komutları için mümkünse VBA nesne modelini ya da CommandBars.ExecuteMso yöntemini tercih edin.
- Excel dışındaki uygulamalar: Başka bir uygulamaya tuş göndermek için önce o uygulamanın etkinleştirilmesi gerekir. Yönetici ayrıcalığıyla çalışan pencerelere, güvenlik ayarları nedeniyle tuş gönderilemeyebilir. Excel'in ayrı bir örneğine ya da bazı çevrimiçi sürümlere de güvenilir biçimde gönderilemez.
- İlgili konular: MsgBox, InputBox, Application.OnKey, Application.Calculate, Application.Goto, Application.Wait, AppActivate ve Application.EnableEvents konuları bu sayfayla birlikte incelenebilir.