Özellik ikonu

InputBox

İndirme izni yok

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.

Söz dizimi​

VBA'nın kendi InputBox işlevinin söz dizimi şöyledir:
VBA
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.
Dönüş değeri her zaman String türündedir. Kullanıcı Tamam (OK) düğmesine basarsa yazılan metin, İptal (Cancel) düğmesine basarsa ya da kutuyu kapatırsa uzunluğu sıfır olan metin ("") döner. Bu yüzden boş bırakılan giriş ile iptal edilen giriş ayırt edilemez.

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:
VBA
sonuc = Application.InputBox(Prompt, [Title], [Default], [Left], [Top], [HelpFile], [HelpContextID], [Type])
İ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:
  • 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.
Türler toplanarak birleştirilebilir; örneğin 1 + 2 değeri hem sayı hem metin kabul eder. Geçersiz bir giriş yapılırsa Excel kullanıcıyı uyarır ve kutuyu açık tutar.

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

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.
AB
1Ad SoyadDepartman
2Ayşe YılmazMuhasebe
3Mehmet DemirSatış
4Zeynep KayaLojistik
Personel GirişiExcelDepo v1.0.0
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.

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.
ABC
1ÜrünFiyatYeni Fiyat
2Klavye450,00
3Fare220,00
4Monitör3.200,00
5Kulaklık780,00
Fiyat ListesiExcelDepo v1.0.0
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.

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.
AB
1Girilen MetinDurum
225Geçerli
3abcSayı değil
4150Geçerli
5-7Pozitif değil
6Boş girdi
Girdi DenetimiExcelDepo v1.0.0
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.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
7
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst