Genel Bakış
InputBox (InputBox), VBA'da kullanıcıya bir ileti ve yazı girebileceği bir kutu gösteren işlevdir; Tamam'a basılınca yazılan metni döndürür. Makronun çalışma sırasında dışarıdan ad, sayı, oran gibi bir bilgi almasını sağlar. Excel'e özgü Application.InputBox yöntemi ise girişin türünü (sayı, metin, hücre başvurusu vb.) denetleyebildiği için daha güvenlidir.
İlk yedi bağımsız değişken VBA işleviyle aynı amaçlara hizmet eder; Left ve Top konumu belirler. Farklı olan Type bağımsız değişkenidir ve kabul edilebilecek veri türünü belirler:
VBA'nın InputBox işlevinde ise sonucun Len değeri sıfırsa çıkış yapmak yaygın yöntemdir. Sayı beklenen girişlerde dönen metin IsNumeric ile denetlenmeli, ardından CDbl ile sayıya çevrilmelidir.
Makro etkileşimlidir; giriş kutuları ekranda açılır. Örneğin ad olarak Burak Çelik, departman olarak Satış girerseniz bu bilgiler listenin altındaki ilk boş satıra yazılır. Kullanıcı iptal ederse ya da kutuyu boş bırakırsa makro hiçbir şey yazmadan sonlanır.
Makro bir giriş kutusu açtığı için bu sayfada otomatik çalıştırılmaz. Kutuya 10 yazıp Tamam'a basarsanız her fiyat yüzde 10 artırılarak C sütununa yazılır. Kutuya sayı olmayan bir metin yazarsanız Excel girişi kabul etmez ve uyarı verir; İptal'e basarsanız makro değişiklik yapmadan çıkar.
Makro her satırdaki girdiyi sırayla denetler. İlk girdinin sonucu Geçerli, ikincinin Sayı değil, üçüncünün Geçerli, dördüncünün Pozitif değil ve boş girdinin sonucu Boş girdi hücresindedir. Aynı denetim kalıbını InputBox'tan dönen metne uygulayarak sayı beklenen girişleri güvenle kullanabilirsiniz.
Söz dizimi
VBA'nın kendi InputBox işlevinin söz dizimi şöyledir:sonuc = InputBox(Prompt, [Title], [Default], [XPos], [YPos], [HelpFile], [Context])
- Prompt: Kutuda görünen iletidir; zorunludur. Uzunluğu yaklaşık 1024 karaktere kadar olabilir. Satır sonu için vbCrLf kullanılır.
- Title: Kutunun başlık çubuğundaki metindir; isteğe bağlıdır. Verilmezse uygulama adı (Microsoft Excel) görünür.
- Default: Kutuda hazır yazılı gelen varsayılan metindir; isteğe bağlıdır. Verilmezse kutu boş açılır.
- XPos: Kutunun sol kenarının ekranın solundan uzaklığıdır (twip); isteğe bağlıdır. Verilmezse yatayda ortalanır.
- YPos: Kutunun üst kenarının ekranın üstünden uzaklığıdır (twip); isteğe bağlıdır. Verilmezse dikeyde ekranın yaklaşık üçte birine yerleşir.
- HelpFile: Yardım dosyasının adıdır; isteğe bağlıdır. Verilirse Context de verilmelidir.
- Context: Yardım konusunun numarasıdır; isteğe bağlıdır.
Application.InputBox yöntemi
Excel nesne modelindeki Application.InputBox yöntemi, giriş türünü zorlayabilir ve kullanıcının çalışma sayfasından hücre seçmesine izin verir:sonuc = Application.InputBox(Prompt, [Title], [Default], [Left], [Top], [HelpFile], [HelpContextID], [Type])
- 0: Formül olarak yorumlanan giriş.
- 1: Yalnız sayı kabul edilir.
- 2: Metin kabul edilir (varsayılan).
- 4: Mantıksal değer (True ya da False).
- 8: Hücre başvurusu; kullanıcı fareyle aralık seçebilir. Sonuç Range nesnesidir ve Set ile atanmalıdır.
- 16: Hata değeri (ör. #YOK).
- 64: Değer dizisi.
İptal ve boş giriş denetimi
Application.InputBox iptal edilirse False döndürür. Sonucu Variant değişkende tutup VarType ile denetlemek güvenlidir. Type:=8 ile aralık seçilirken iptal edilirse çalışma zamanı hatası oluşur; bu durumda On Error Resume Next ile hata yakalanmalıdır. Kısa bir kalıp şöyledir:
VBA
3 satır
Dim yanit As Variant
yanit = Application.InputBox("Bir sayı girin:", "Sayı", Type:=1)
If VarType(yanit) = vbBoolean Then Exit Sub ' iptal edildi
1. Kullanıcıdan ad ve departman almak
Sayfada personel listesi var. Makro iki kez giriş kutusu açar ve girilen bilgileri listenin ilk boş satırına yazar. Kodu standart modüle yapıştırın ve makroyu Alt+F8 ile çalıştırın.
VBA
20 satır
Option Explicit
Sub YeniPersonelEkle()
Dim ad As String
Dim dep As String
Dim satir As Long
' Personel adı istenir; boş ya da iptal ise çıkılır
ad = InputBox("Personel adını girin:", "Yeni Personel")
If ad = "" Then Exit Sub
' Departman için varsayılan bir değer önerilir
dep = InputBox("Departmanı girin:", "Yeni Personel", "Satış")
If dep = "" Then Exit Sub
' A sütunundaki son dolu hücrenin altına yazılır
satir = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row + 1
ActiveSheet.Cells(satir, 1).Value = ad
ActiveSheet.Cells(satir, 2).Value = dep
End Sub
InputBox
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Ad Soyad | Departman |
| 2 | Ayşe Yılmaz | Muhasebe |
| 3 | Mehmet Demir | Satış |
| 4 | Zeynep Kaya | Lojistik |
Personel GirişiExcelDepo v1.0.0
2. Application.InputBox ile sayı almak ve zam uygulamak
Fiyat listesinde B sütununda mevcut fiyatlar var. Makro, zam oranını yalnız sayı kabul eden bir kutuyla sorar ve yeni fiyatları C sütununa yazar. Kodu standart modüle yapıştırın.
VBA
19 satır
Option Explicit
Sub ZamUygula()
Dim yanit As Variant
Dim i As Long
Dim son As Long
' Type:=1 yalnız sayı kabul eder
yanit = Application.InputBox(Prompt:="Zam oranını yüzde olarak girin:", _
Title:="Fiyat Zammı", Default:=10, Type:=1)
' İptal edilirse False döner
If VarType(yanit) = vbBoolean Then Exit Sub
son = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = 2 To son
ActiveSheet.Cells(i, 3).Value = ActiveSheet.Cells(i, 2).Value * (1 + yanit / 100)
Next i
End Sub
InputBox
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Fiyat | Yeni Fiyat |
| 2 | Klavye | 450,00 | |
| 3 | Fare | 220,00 | |
| 4 | Monitör | 3.200,00 | |
| 5 | Kulaklık | 780,00 |
Fiyat ListesiExcelDepo v1.0.0
3. Girilen metni sayıya çevirmeden önce denetlemek
InputBox'tan dönen değer her zaman metindir; bu yüzden kullanmadan önce denetlenmelidir. Bu örnekte kullanıcı girdileri A sütununda hazır durur ve makro her birini aynı kurallarla denetleyip sonucu B sütununa yazar. Kodu standart modüle yapıştırın.
VBA
21 satır
Option Explicit
Sub GirdiKontrol()
Dim i As Long
Dim s As String
For i = 2 To 6
' Hücre içeriği metne çevrilip baştaki ve sondaki boşluklar atılır
s = Trim(CStr(ActiveSheet.Cells(i, 1).Value))
If Len(s) = 0 Then
ActiveSheet.Cells(i, 2).Value = "Boş girdi"
ElseIf Not IsNumeric(s) Then
ActiveSheet.Cells(i, 2).Value = "Sayı değil"
ElseIf CDbl(s) <= 0 Then
ActiveSheet.Cells(i, 2).Value = "Pozitif değil"
Else
ActiveSheet.Cells(i, 2).Value = "Geçerli"
End If
Next i
End Sub
InputBox
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Girilen Metin | Durum |
| 2 | 25 | Geçerli |
| 3 | abc | Sayı değil |
| 4 | 150 | Geçerli |
| 5 | -7 | Pozitif değil |
| 6 | Boş girdi |
Girdi DenetimiExcelDepo v1.0.0
Kullanırken dikkat edin
- İptal ile boş girişi karıştırmayın: VBA'nın InputBox işlevi iptalde de boş metin döndürür. Sıfır girişini ya da bilerek boş bırakılan alanı ayırt etmeniz gerekiyorsa Application.InputBox yöntemini kullanın; bu yöntem iptalde False döndürür.
- Dönen değer metindir: VBA InputBox işlevi sayı girilse bile String döndürür. Hesapta kullanmadan önce IsNumeric ile denetleyin, ardından CDbl ya da CLng ile çevirin. Aksi halde tür uyuşmazlığı hatası alabilirsiniz. Yüzde ya da ondalık girişlerde bölgesel ayarlara (virgül ve nokta) dikkat edin.
- Aralık seçiminde Set kullanın: Application.InputBox ile Type:=8 kullandığınızda sonuç bir Range nesnesidir; Set deyimiyle atanmalıdır. Kullanıcı iptal ederse çalışma zamanı hatası oluşur, bu yüzden On Error Resume Next ile hata yakalayıp sonucu Nothing ile karşılaştırın.
- Etkileşimli kod otomasyona uygun değildir: InputBox makroyu kullanıcı yanıtını verene kadar durdurur. Zamanlanmış ya da arka planda çalışan makrolarda kullanmayın; değerleri hücrelerden ya da UserForm üzerinden alın. Çok sayıda değer gerekiyorsa art arda kutular açmak yerine UserForm daha kullanışlıdır.
- Uzun ileti ve konum: Prompt metni yaklaşık 1024 karakterle sınırlıdır. XPos, YPos, Left ve Top değerleri ekran koordinatıdır ve çoklu monitör kullanımında beklenmedik yerde açılabilir. Çoğu durumda varsayılan konumu kullanmak yeterlidir.
- İlgili konular:
- MsgBox: Kullanıcıya ileti gösterir ve Evet/Hayır gibi düğmelerle yanıt alır.
- UserForm: Birden çok değerin tek pencerede alınmasını sağlar.
- Application.InputBox: Türü denetlenen ve aralık seçtirebilen giriş kutusu.
- IsNumeric: Metnin sayıya çevrilebilir olup olmadığını denetler.
- CDbl ve CLng: Metni sayıya dönüştüren VBA işlevleri.
- VarType: Değişkenin türünü döndürür; iptal denetiminde kullanılır.
- Veri > Veri Araçları > Veri Doğrulama (Data > Data Tools > Data Validation): Hücreye girişi makrosuz sınırlandırır.
- EĞERSAYI: Girilen değerin listede olup olmadığını denetlemek için kullanılabilir.