Excel Çoklu Seçim Açılır Liste: VBA Kodu ve Alternatifler
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
- Seçenek aralığını (örneğin Listeler sayfasında A2:A6) seçin, Formüller → Ad Tanımla ile
SecenekListesiadını verin. - Giriş hücrelerini (örneğin C2:C200) seçin. Veri Doğrulama → Liste → Kaynak kutusuna
=SecenekListesiyazın. - Dosyayı Excel Makro Etkin Çalışma Kitabı (.xlsm) olarak kaydedin.
- 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 yazarkenWorksheet_Changeolayını yeniden tetiklemesin diye kapatılır;Cikisetiketi 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
SelectionChangeile 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
AYRACsabitini değiştirirsiniz. Satır başına bir öğe içinvbLfkullanılır ve hücrede Metni Kaydır açılır.
Çalıştığını nasıl sınarsınız?
- C2’den Kesim seçin: hücre
Kesimolmalı. - Aynı hücreden Paketleme seçin:
Kesim, Paketleme. - Kesim’i yeniden seçin:
Paketleme. - Paketleme’yi yeniden seçin: hücre boşalmalı.
- 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:
| Proje | Ekipman kodu | Ad |
|---|---|---|
| PJ-12 | M-01 | Kesim |
| PJ-12 | M-02 | Paketleme |
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?
| Durum | Uygun yöntem |
|---|---|
| Tek kişi, masaüstü Excel, kısa etiket listesi | VBA makrosu |
| Dosyayı tarayıcıdan (Excel web) açanlar var | Ayrı satır |
| Seçimler sayılacak, filtrelenecek, rapora girecek | Ayrı satır |
| Her seçime tarih, miktar, sorumlu eklenecek | Ayrı satır |
| Makro kullanımı kurumda yasak ya da dosya sık kopyalanıyor | Ayrı 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.
