İçindekiler
Koşullara bağlı olarak, bir açılır liste içinde birden fazla değer seçmeniz gerekebilir. Bu eğitimde, bir açılır listede birden fazla seçimi nasıl yapacağınızı göstereceğiz. Bu oturum için Excel 2019 kullanıyoruz, tercih ettiğiniz sürümü kullanmaktan çekinmeyin.
Oturuma geçmeden önce, örneklerimizin temelini oluşturan veri kümesi hakkında bilgi sahibi olalım.
Burada birkaç kırtasiye elemanımız var, bunları kullanarak bir açılır liste oluşturacağız ve orada birden fazla öğe seçeceğiz.
İşleri basit tutmak için bunun basit bir veri kümesi olduğunu unutmayın. Pratik bir senaryoda, çok daha büyük ve karmaşık bir veri kümesiyle karşılaşabilirsiniz.
Alıştırma Çalışma Kitabı
Alıştırma çalışma kitabını aşağıdaki bağlantıdan indirebilirsiniz.
Açılır Listeden Çoklu Seçim Yapma.xlsm
Açılır Listede Çoklu Seçim
Öncelikle kırtasiyelerimiz bazında bir açılır liste oluşturmamız gerekiyor. Hızlıca oluşturalım. Açılır liste yapımı ile ilgili makaleyi ziyaret etmekten çekinmeyin.
İçinde Veri Doğrulama iletişim kutusunda LİSTE veri türünü seçin ve öğelerin hücre aralığını ekleyin.
B4:B11 kırtasiye öğelerini tutan aralıktır. Şimdi açılır listeyi bulacaksınız.
Daha fazlasını okuyun: Seçime Bağlı Excel Açılır Listesi
1. Birden Fazla Öğe Seçin (Yinelenen Seçime İzin Verir)
Geleneksel bir açılır liste her zaman tek bir öğe seçer. Burada gördüğünüz gibi, seçtiğimiz öğe Kalem listeden (aşağıdaki resim).
Şimdi, başka bir öğe seçersek, diyelim ki Kurşun Kalem
o zaman önceki değerin yerini alacaktır. Sadece Kurşun Kalem seçili kalacaktır.
Birden fazla öğe seçmek için VBA kodu. Uygulamalar için Microsoft Visual Basic penceresi (basın ALT + F11 açmak için).
Şimdi açılır listede birden fazla öğe seçmek istediğiniz çalışma sayfası adına veya numarasına çift tıklayın. Söz konusu sayfa için kod penceresini bulacaksınız.
İşte, aşağıdakiler için kod penceresi Sayfa2 çalışma kitabımızda (bu sayfada açılır listemiz var).
Kod penceresi açıldıktan sonra, aşağıdaki kodu buraya ekleyin
Private Sub Worksheet_Change(ByVal Target As Range) Dim Oldvalue As String Dim Newvalue As String On Error GoTo Exitsub If Target.Address = "$D$4" Then If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub Else: If Target.Value = "" Then GoTo Exitsub Else Application.EnableEvents = False Newvalue = Target.Value Application.UndoOldvalue = Target.Value If Oldvalue = "" Then Target.Value = Newvalue Else Target.Value = Oldvalue & ", " & Newvalue End If End If End If Application.EnableEvents = True Exitsub: Application.EnableEvents = True End Sub
Kodu kaydedin ve şimdi açılır listeden değerleri seçmeyi deneyin.
Seçildikten sonra Kurşun Kalem , başka bir öğe seçeceğiz Not Defteri Gördüğünüz gibi her iki ürünü de bulduk (aşağıdaki resim).
Bu kod seçimi tekrarlamamıza izin verecektir. Diyelim ki Kurşun Kalem Tekrar,
öğeyi seçim kutusunda tekrar bulacağız.
Kod Açıklaması
İki dizge bildirdik Eski değer ve Yeni değer .
Aşağı açılır listeyi şu şekilde yaptığımızı görebilirsiniz D4 hücresi, bu yüzden hedef adresimiz D4 . Ayrıca, hücrenin veri doğrulama kullanıp kullanmadığını şu şekilde yeniden kontrol ettik Hedef.ÖzelHücreler .
Bir değer seçildiğinde, olayları kapattık ( Application.EnableEvents = False
) böylece değişiklikler olayı tekrar tetiklemez. Daha sonra seçilen öğeyi Yeni değer .
Değişikliği geri aldıktan sonra, değeri Eski değer . Sonra kontrol edin Eski değer Boşsa (yalnızca bir değer seçildiği anlamına gelir), o zaman Yeni değer . Aksi takdirde, birleştirme Eski değer ve Yeni değer .
Etkinliği sıfırlamayı sonlandırmadan önce, gerekirse değiştirebilmemiz için.
Daha fazlasını okuyun: Çoklu Bağımlı Açılır Liste Excel VBA
2. Açılır Listeden Birden Fazla Öğe Seçin (Yalnızca Benzersiz Seçim)
Önceki bölümde, tekrara izin verilen çoklu seçimleri gördük. Bunu istemiyorsanız, bu bölümü izleyin.
Kolaylık olması açısından, bu gösterim için ayrı bir sayfa kullandık. Bu kez Sayfa3'teyiz. Bu sayfanın kod penceresine aşağıdaki kodu yazın.
Private Sub Worksheet_Change(ByVal Target As Range) Dim Oldvalue As String Dim Newvalue As String Application.EnableEvents = True On Error GoTo Exitsub If Target.Address = "$D$4" Then If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub Else: If Target.Value = "" Then GoTo Exitsub Else Application.EnableEvents = False Newvalue = Target.ValueApplication.Undo Oldvalue = Target.Value If Oldvalue = "" Then Target.Value = Newvalue Else If InStr(1, Oldvalue, Newvalue) = 0 Then Target.Value = Oldvalue & ", " & Newvalue Else: Target.Value = Oldvalue End If End If End If End If Application.EnableEvents = True Exitsub: Application.EnableEvents = True End Sub
Önceki koda kıyasla herhangi bir fark var mı! Daha yakından bakın, küçük farkı fark edebileceksiniz.
Burada biz bir VBA fonksiyon adı INSTR . Bu INSTR fonksiyonu, bir dizede bir alt dizenin ilk oluşumunun konumunu döndürür. Daha fazla bilgi için bu INSTR makalesini ziyaret edin.
InStr(1, Oldvalue, Newvalue) = 0 ile bu mantıksal işlemi kullanarak, değerlerin bulunup bulunmadığını kontrol ettik. Mantıksal işlem geri dönerse DOĞRU (daha önce bulunamadı) sonra öğeyi seçmeye ve önceki değerle birleştirmeye izin verir.
Kodu kaydedin ve şimdi zaten seçilmiş olan bir öğeyi seçmeye çalışın.
Burada zaten seçmiştik Kurşun Kalem Eğer bunu tekrar seçmek istersek, yapamayız. Yinelenen değerlere izin vermez.
Daha fazlasını okuyun: Excel'de Başka Bir Sayfadan Açılır Liste Oluşturma
3. Yeni Satırdaki Öğeleri Seçin
Şimdiye kadar, öğelerin virgülle ayrıldığını gördük. Bu bölümde, seçilen öğeleri yeni satırlarla düzenleyeceğiz.
Basit olması açısından, birkaç hücreyi D4 Bunu yapmak için, birleştirmek istediğiniz hücreleri seçin ve Birleştir & Merkez bir şey yok. Hizalama bölümünün Ev sekmesi.
Hücre daha fazla yükseklik kazanacaktır.
Şimdi, öğeleri satırsonu ile ayırmak için kullanılan koda bakalım. Aşağıdaki kodu kullanın
Private Sub Worksheet_Change(ByVal Target As Range) Dim Oldvalue As String Dim Newvalue As String Application.EnableEvents = True On Error GoTo Exitsub If Target.Address = "$D$4" Then If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then GoTo Exitsub Else: If Target.Value = "" Then GoTo Exitsub Else Application.EnableEvents = False Newvalue = Target.ValueApplication.Undo Oldvalue = Target.Value If Oldvalue = "" Then Target.Value = Newvalue Else If InStr(1, Oldvalue, Newvalue) = 0 Then Target.Value = Oldvalue & vbNewLine & Newvalue Else: Target.Value = Oldvalue End If End If End If End If Application.EnableEvents = True Exitsub: Application.EnableEvents = True End Sub
Önceki koddan tek farkı, bu sefer vbNewLine arasında EskiDeğer ve YeniDeğer .
vbNewLine öğeler arasında yeni bir çizgi sağlar.
Şimdi öğeleri seçin.
Bir ürün seçiyoruz Kalem Şimdi başka bir öğe seçin.
İki öğenin farklı sıralarda olduğunu göreceksiniz.
Burada iki farklı satırda bulunan iki değerimiz var. Başka bir değer seçildiğinde, bu değer başka bir satıra eklenecektir. Her değer yeni bir satırda olacaktır.
Öğeleri ayırmak için başka bir sınırlayıcı istiyorsanız, bunu çift tırnak içinde vbNewline .
Sonuç
Bugünlük bu kadar. Açılır listede birden fazla seçim yapmak için çeşitli yaklaşımları listeledik. Umarız bunu yararlı bulursunuz. Anlaşılması zor görünen herhangi bir şey varsa yorum yapmaktan çekinmeyin. Burada atladığımız diğer yöntemleri bize bildirin.