OĞUZ EROLAI·ADS·APPS

Excel Çoklu Seçim Açılır Liste: VBA Kodu ve Alternatifler

6 dk okumaYayın: Güncelleme:

Excel’in yerleşik açılır listesi (Veri Doğrulama → Liste) bir hücreye tek değer seçtirir; ikinci seçim birincinin üstüne yazar. Aynı hücrede “Kesim, Paketleme” gibi birikmiş bir metin istiyorsanız iki yol var: sayfaya küçük bir VBA makrosu eklemek ya da her seçimi ayrı satırda tutmak. Aşağıda ikisi de var; makro kodunu doğrudan kopyalayabilirsiniz.

Yerleşik liste ne yapar, ne yapmaz?

Bir yardımcı alana Kesim ve Paketleme yazın. Giriş hücresini seçip Veri → Veri Doğrulama → Liste bölümünden bu aralığı kaynak yapın. Önce Kesim, ardından Paketleme seçin: hücrede yalnız Paketleme kalır. Microsoft’un açılır liste sayfası (Ekim 2026’da okundu) listeyi tek seçimli olarak anlatır ve çoklu seçim seçeneği tanımlamaz. Kendi sürümünüzde farklı bir şey görürseniz o geçerlidir; ben bu sayfada bulamadım.

Sayfa, liste öğelerini bir Excel tablosunda tutmanızı da öneriyor; tablodaki öğe eklenip silindikçe liste kendiliğinden güncellenir.

Yöntem 1: VBA ile aynı hücrede biriktirmek

Mantık şu: kullanıcı listeden bir öğe seçer, makro öğeyi hücredeki önceki metne ekler. Aynı öğe tekrar seçilirse çıkarır. Bu, yaygın kullanılan bir kalıptır; kodu bu kalıba göre yazdım ve mantığını adım adım gözden geçirdim. Yine de kodu kendi dosyanıza eklemeden önce bir kopyada deneyin; aşağıdaki test adımlarını uygulayın, giriş aralığını (C2:C200) ve liste adını (SecenekListesi) kendi dosyanıza göre değiştirin.

Hazırlık

  1. Seçenek aralığını (örneğin Listeler sayfasında A2:A6) seçin, Formüller → Ad Tanımla ile SecenekListesi adını verin.
  2. Giriş hücrelerini (örneğin C2:C200) seçin. Veri Doğrulama → Liste → Kaynak kutusuna =SecenekListesi yazın.
  3. Dosyayı Excel Makro Etkin Çalışma Kitabı (.xlsm) olarak kaydedin.
  4. Alt + F11 ile VBA düzenleyicisini açın, soldaki listede giriş hücrelerinin olduğu sayfaya çift tıklayın ve aşağıdaki kodu o sayfanın modülüne yapıştırın. Normal bir modüle değil, sayfanın kendi modülüne yapıştırılmalıdır.

Kod

Option Explicit

Private Const AYRAC As String = ", "
Private mEski As String   ' hücrenin seçmeden önceki değeri

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If IsError(ActiveCell.Value) Then mEski = "" Else mEski = CStr(ActiveCell.Value)
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim yeni As String, sonuc As String
    Dim parcalar() As String
    Dim i As Long, bulundu As Boolean

    If Target.CountLarge > 1 Then Exit Sub
    If Intersect(Target, Me.Range("C2:C200")) Is Nothing Then Exit Sub
    If IsError(Target.Value) Then Exit Sub

    yeni = CStr(Target.Value)
    If Len(yeni) = 0 Then               ' hücre silindi: eski değeri de unut
        mEski = ""
        Exit Sub
    End If
    ' Listede olmayan (elle yazılan ya da yapıştırılan) metne dokunma
    If IsError(Application.Match(yeni, ThisWorkbook.Names("SecenekListesi").RefersToRange, 0)) Then Exit Sub

    On Error GoTo Cikis
    Application.EnableEvents = False

    If Len(mEski) = 0 Then
        sonuc = yeni
    Else
        parcalar = Split(mEski, AYRAC)
        For i = LBound(parcalar) To UBound(parcalar)
            If StrComp(parcalar(i), yeni, vbTextCompare) = 0 Then
                bulundu = True              ' zaten seçiliydi: çıkar
            Else
                If Len(sonuc) > 0 Then sonuc = sonuc & AYRAC
                sonuc = sonuc & parcalar(i)
            End If
        Next i
        If Not bulundu Then
            If Len(sonuc) > 0 Then sonuc = sonuc & AYRAC
            sonuc = sonuc & yeni            ' yeni öğeyi ekle
        End If
    End If

    If Len(sonuc) = 0 Then Target.ClearContents Else Target.Value = sonuc
    mEski = sonuc

Cikis:
    Application.EnableEvents = True
End Sub

Kodda dikkat edilen noktalar:

  • Application.EnableEvents = False: Makro hücreye yazarken Worksheet_Change olayını yeniden tetiklemesin diye kapatılır; Cikis etiketi hata olsa bile geri açar. Açılmazsa makro bir daha çalışmaz, bu kodun en sık görülen kırılma noktasıdır.
  • Eski değer ayrı tutulur: Hücrenin seçmeden önceki metni, hücreye tıklanınca SelectionChange ile saklanır. Böylece Excel’in geri alma (Undo) yığınına güvenmek gerekmez.
  • Tekrar seçim: Aynı öğe ikinci kez seçilirse listeden çıkar; ayrı bir silme düğmesi yoktur.
  • Listede olmayan metin: Elle yazılan ya da yapıştırılan değerlere dokunulmaz. Yapıştırma Veri Doğrulama’yı zaten atlar; makronun bunu bozmaması için bu denetim konuldu.
  • Hücre silinince: Delete ile silinen hücrenin eski metni de unutulur; yoksa sonraki seçim silinmiş metni geri getirirdi.
  • Çoklu hücre: Birden fazla hücre aynı anda değişirse (doldurma, yapıştırma) kod çıkar.
  • Ayraç: Tek satırda AYRAC sabitini değiştirirsiniz. Satır başına bir öğe için vbLf kullanılır ve hücrede Metni Kaydır açılır.

Çalıştığını nasıl sınarsınız?

  1. C2’den Kesim seçin: hücre Kesim olmalı.
  2. Aynı hücreden Paketleme seçin: Kesim, Paketleme.
  3. Kesim’i yeniden seçin: Paketleme.
  4. Paketleme’yi yeniden seçin: hücre boşalmalı.
  5. Hücreyi Delete ile silin ve tekrar seçin; sıfırdan başlamalı.

Bunlardan biri çalışmazsa önce makroların etkin olduğundan ve kodun sayfa modülünde durduğundan emin olun.

Sınırlar

  • Excel’in web sürümünde çalışmaz. Microsoft’a göre web sürümünde VBA makrosu oluşturulamaz, çalıştırılamaz ve düzenlenemez; var olan makrolar dosyada kalır ama işlemez (Ekim 2026’da okundu). Tarayıcıda açan kişi için liste yine tek seçimli olur.
  • Öğe adında ayraç olmamalı. “Kesim, Boyama” adlı bir seçenek bölünür ve yanlış çıkarılır.
  • Hücre tek bir metindir. Sonradan saymak, filtrelemek ya da öğeye tarih veya miktar eklemek için metni ayrıştırmanız gerekir.
  • Doğrulama yalnız seçilen öğeyi denetler. Makronun yazdığı birleşik metin doğrulamaya takılmaz; sonradan bu hücrede “Değer listede yok” denetimine güvenmeyin.
  • Makro güvenliği: Dosya e-postayla ya da internetten gelirse Excel makroları varsayılan olarak engelleyebilir; kullanıcıların bunu açması gerekir.
  • Sayfa korumalıysa makro hücreye yazamaz; kodu korumayı kaldıracak şekilde genişletmek ya da yalnız giriş hücrelerinin kilidini açmak gerekir.

Makrosuz başka çözümler

Form denetimlerinden çoklu seçimli bir liste kutusu eklenebilir; Microsoft belgesine göre çoklu seçimli liste kutuları LinkedCell ile bir hücreye bağlanamaz (Ekim 2026’da okundu), yani seçilenleri okumak için yine VBA gerekir. Bu yüzden liste kutusu makrosuz bir çıkış değildir.

Yöntem 2: Her seçimi ayrı satırda tutmak

Makro eklemeden her seçimi ayrı satırda tutabilirsiniz. Üç sütun oluşturun: Proje, Ekipman kodu, Ekipman adı. Kurgusal PJ-12 projesi için iki satır yazın:

ProjeEkipman koduAd
PJ-12M-01Kesim
PJ-12M-02Paketleme

Ekipman kodu sütununa normal liste doğrulaması uygulayabilirsiniz. İkinci satır ikinci seçimi temsil eder. Bu yaklaşım tek hücrede çoklu seçim görünümü vermez; ancak seçilen her ekipmanı saymak, filtrelemek ve başka bilgiyle ilişkilendirmek kolaylaşır. İşiniz rapor üretmekse görsel olarak kompakt bir hücreden daha değerli olabilir.

Aynı ekipmanın iki kez girilmesini kontrol edin. M-01’in farklı projelerde bulunması normal olabilir; aynı projeye iki kez eklenmesi ise iş kuralınıza bağlıdır. Tekrarlı satırları bütün dosyada silmek, başka projelerdeki geçerli ilişkileri de kaldırabilir. Ekipman adını değiştirmek ile seçimi projeden kaldırmayı da ayırın.

Bir ekipmana proje bazında kullanım tarihi, miktar ve sorumlu ekleniyorsa bu bilgiler seçimin kendisine aittir. Bunları virgüllü tek bir hücreye sığdırmak sonraki işlemleri zorlaştırır; ayrı satır yapısı bu ihtiyacı açıkça taşır.

Hangisini seçmeli?

DurumUygun yöntem
Tek kişi, masaüstü Excel, kısa etiket listesiVBA makrosu
Dosyayı tarayıcıdan (Excel web) açanlar varAyrı satır
Seçimler sayılacak, filtrelenecek, rapora girecekAyrı satır
Her seçime tarih, miktar, sorumlu eklenecekAyrı satır
Makro kullanımı kurumda yasak ya da dosya sık kopyalanıyorAyrı satır

Karar verirken dosyayı kimin açacağını, makrolara izin verilip verilmediğini ve kodun bakımını kimin yapacağını sorun. Yalnızca çoklu seçim görüntüsü için işleyen bir kayıt düzenini karmaşıklaştırmak gerekmez.

Özel uygulama neyi değiştirir?

Çoklu seçimli ve ilişkili kayıt formunda PJ-12’ye M-01 ve M-02 iki ayrı bağlantı olarak eklenebilir. M-02’yi projeden kaldırmak ekipman kaydını veya diğer projelerdeki kullanımını silmez. Bakımda olan ekipmanın seçilememesi ve kullanıcının yalnız yetkili ekipmanı görmesi ek kurallardır; bu kurallar tanımlandığında veri girilirken uygulanır, standart Excel listesinin davranışı değildir.

Genel ekip ihtiyacı için Excel web uygulaması yaklaşımını inceleyebilirsiniz. Önce mevcut dosyanızın yeterli olup olmadığını değerlendiririm.

Sıkça Sorulan Sorular

Makrosuz tek hücrede aynı görünüm olur mu?

Elle birleşik metin yazmak mümkündür; fakat bunu otomatik çoklu seçim olarak düşünmeyin. Ayrı satırlarla kayıt tutmak çoğu raporda daha anlaşılırdır.

Bir seçimi kaldırınca ekipman silinir mi?

Proje ilişkisini kaldırma ile ekipman kaydını silme farklı işlemlerdir. Yapıyı buna göre kurmak gerekir.

VBA kodunda bir seçimi nasıl kaldırırım?

Yukarıdaki kodda aynı öğeyi listeden yeniden seçmeniz yeter; öğe hücreden çıkar. Hücrenin tamamını boşaltmak için Delete tuşu kullanılır.

Excel’in web sürümünde çoklu seçim çalışır mı?

VBA makrosu web sürümünde çalışmaz, dolayısıyla makroyla yapılan çoklu seçim de çalışmaz. Dosyayı tarayıcıdan açacak kişiler varsa ayrı satır yapısı daha güvenlidir.

Makro çalışmayı bıraktı, neden?

En sık sebep Application.EnableEvents ayarının kapalı kalmasıdır (bir hatadan sonra). VBA düzenleyicisinde Hemen penceresine Application.EnableEvents = True yazıp Enter’a basın, sonra yeniden deneyin.

İhtiyacınızı konuşalım

Seçimlerinizi nasıl kullandığınızı konuşalım.

Başa dön ↑