• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

TextBoxlardaki Verileri ListBoxa Tekrarsız Listeleme

Katılım
24 Temmuz 2019
Mesajlar
482
Excel Vers. ve Dili
EXCEL 2010 TÜRKÇE
Altın Üyelik Bitiş Tarihi
19-12-2025
İyi akşamlar diliyorum arkadaşlar.
8 ile 47 numaralar arasında textboxlar var. Bunlarda bazı değerler benzerdir. Bazen iki bazen dört veya daha fazla Textbox değeri aynıdır. Bunları listboxa birer defa olacak şekilde nasıl listeleyebilirim?
teşekkür ederim.
 

hamitcan

Uzman
Uzman
Katılım
1 Temmuz 2004
Mesajlar
7,763
Excel Vers. ve Dili
Excel 2019 Türkçe
Chatgpt çözümü;
Evet 👍 VBA ile gayet rahat yapılır.
(Muhtemelen Excel VBA kullanıyorsun, ona göre anlatıyorum.)
Ama önce netleştireyim:
👉 TextBox’lar bir UserForm üzerinde mi?
Aşağıdaki çözüm UserForm üzerindeki TextBox8–TextBox47 içindir.
Amaç
  • TextBox8 ile TextBox47 arasındaki değerleri al
  • Aynı olanları tek sefer yaz
  • ListBox’a ekle
En temiz VBA çözümü (Dictionary ile)
VBA’da Dictionary, tekrarları engellemek için en doğru yoldur.
1️⃣ Önce referans ekle
VBA editörde:

Tools > References

✔ Microsoft Scripting Runtime işaretle
2️⃣ Kod


Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

Dim i As Integer
Dim deger As String

For i = 8 To 47
deger = Trim(Me.Controls("TextBox" & i).Text)

If deger <> "" Then
If Not dict.Exists(deger) Then
dict.Add deger, Nothing
End If
End If
Next i

Me.ListBox1.Clear

Dim key As Variant
For Each key In dict.Keys
Me.ListBox1.AddItem key
Next key

Ne yapıyor bu kod?

✔ Boş TextBox’ları almaz

✔ Aynı değeri 1 kere ekler

✔ 2 tane de olsa, 10 tane de olsa fark etmez

✔ Otomatik çalışır
Alternatif (Referans eklemeden – basit yöntem)


Dim i As Integer
Dim deger As String
Dim varItem As Variant

Me.ListBox1.Clear

For i = 8 To 47
deger = Trim(Me.Controls("TextBox" & i).Text)

If deger <> "" Then
On Error Resume Next
varItem = Application.Match(deger, Me.ListBox1.List, 0)
If IsError(varItem) Then
Me.ListBox1.AddItem deger
End If
On Error GoTo 0
End If
Next i
Küçük ama önemli ipuçları
  • Trim → boşluk sorunlarını çözer
  • "abc" ile "ABC" aynı kabul edilsin dersen söyle, ekleyelim
  • İstersen kaç kere tekrar ettiğini de ListBox’ta gösterebiliriz
İstersen bir üst seviye yapalım:
  • 🔹 Sadece en çok tekrar edenleri listeleyelim
  • 🔹 Yanına adet sütunu ekleyelim
  • 🔹 TextBox’lar yerine dinamik kontrol yapalım
Hangisini istiyorsun? 😊
 
Katılım
24 Temmuz 2019
Mesajlar
482
Excel Vers. ve Dili
EXCEL 2010 TÜRKÇE
Altın Üyelik Bitiş Tarihi
19-12-2025
Chatgpt çözümü;
Evet 👍 VBA ile gayet rahat yapılır.
(Muhtemelen Excel VBA kullanıyorsun, ona göre anlatıyorum.)
Ama önce netleştireyim:
👉 TextBox’lar bir UserForm üzerinde mi?
Aşağıdaki çözüm UserForm üzerindeki TextBox8–TextBox47 içindir.
Amaç
  • TextBox8 ile TextBox47 arasındaki değerleri al
  • Aynı olanları tek sefer yaz
  • ListBox’a ekle
En temiz VBA çözümü (Dictionary ile)
VBA’da Dictionary, tekrarları engellemek için en doğru yoldur.
1️⃣ Önce referans ekle
VBA editörde:

Tools > References

✔ Microsoft Scripting Runtime işaretle
2️⃣ Kod


Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

Dim i As Integer
Dim deger As String

For i = 8 To 47
deger = Trim(Me.Controls("TextBox" & i).Text)

If deger <> "" Then
If Not dict.Exists(deger) Then
dict.Add deger, Nothing
End If
End If
Next i

Me.ListBox1.Clear

Dim key As Variant
For Each key In dict.Keys
Me.ListBox1.AddItem key
Next key

Ne yapıyor bu kod?

✔ Boş TextBox’ları almaz

✔ Aynı değeri 1 kere ekler

✔ 2 tane de olsa, 10 tane de olsa fark etmez

✔ Otomatik çalışır
Alternatif (Referans eklemeden – basit yöntem)


Dim i As Integer
Dim deger As String
Dim varItem As Variant

Me.ListBox1.Clear

For i = 8 To 47
deger = Trim(Me.Controls("TextBox" & i).Text)

If deger <> "" Then
On Error Resume Next
varItem = Application.Match(deger, Me.ListBox1.List, 0)
If IsError(varItem) Then
Me.ListBox1.AddItem deger
End If
On Error GoTo 0
End If
Next i
Küçük ama önemli ipuçları
  • Trim → boşluk sorunlarını çözer
  • "abc" ile "ABC" aynı kabul edilsin dersen söyle, ekleyelim
  • İstersen kaç kere tekrar ettiğini de ListBox’ta gösterebiliriz
İstersen bir üst seviye yapalım:
  • 🔹 Sadece en çok tekrar edenleri listeleyelim
  • 🔹 Yanına adet sütunu ekleyelim
  • 🔹 TextBox’lar yerine dinamik kontrol yapalım
Hangisini istiyorsun? 😊
Üstadım size ne kadar teşekkür etsem azdır. TextBoxlar UserForm üzerindedir.
İfade ettiğiniz:
  • Trim → boşluk sorunlarını çözer
  • "abc" ile "ABC" aynı kabul edilsin dersen söyle, ekleyelim
  • İstersen kaç kere tekrar ettiğini de ListBox’ta gösterebiliriz
Şu özellikleri de eklesek muazzam bir şey olacaktır. Saygılar sunarım.
 
Son düzenleme:
Katılım
24 Temmuz 2019
Mesajlar
482
Excel Vers. ve Dili
EXCEL 2010 TÜRKÇE
Altın Üyelik Bitiş Tarihi
19-12-2025
@hamitcan hocam
varItem = Application.Match(deger, Me.ListBox3.List, 0) şu satırda "Type Mismach hatası veriyor.
VBA çözümü (Dictionary ile) olan kod düzgün çalıştı.
 
Son düzenleme:

hamitcan

Uzman
Uzman
Katılım
1 Temmuz 2004
Mesajlar
7,763
Excel Vers. ve Dili
Excel 2019 Türkçe
Listbox ismini kontrol ettiniz mi ? her yerde ListBox3 mü ?
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,591
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Tekrar sayıları için aşağıdaki kodu deneyebilirsiniz.

C++:
Option Explicit

Private Sub CommandButton1_Click()
    Dim My_Array() As Variant, X As Long
    Dim Txt As String, No As Byte, X_Time As Double
    
    X_Time = Timer
    
    ListBox1.Clear
    
    With CreateObject("Scripting.Dictionary")
        .CompareMode = vbTextCompare
    
        For X = 8 To 47
            Txt = Trim(Me.Controls("TextBox" & X).Text)
            If Txt <> "" Then
                If Not .Exists(Txt) Then
                    No = No + 1
                    .Add Txt, No
                    ReDim Preserve My_Array(1 To 2, 1 To No)
                    My_Array(1, No) = Txt
                    My_Array(2, No) = 1
                Else
                    My_Array(2, .Item(Txt)) = My_Array(2, .Item(Txt)) + 1
                End If
            End If
        Next
        
        If .Count > 0 Then
            ListBox1.ColumnCount = 2
            ListBox1.Column = My_Array
        End If
    End With

    MsgBox "İşlem süresi ; " & Format(Timer - X_Time, "0.00") & " Saniye"
End Sub
 
Katılım
24 Temmuz 2019
Mesajlar
482
Excel Vers. ve Dili
EXCEL 2010 TÜRKÇE
Altın Üyelik Bitiş Tarihi
19-12-2025
@Korhan Ayhan üstadım çok teşekkür ederim. Korhan hocam ikinci sütundaki rakamları bir textboxta toplayabilir miyiz*
 
Son düzenleme:

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,591
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Deneyiniz.

TextBox50 olarak ayarladım. Siz kendi dosyanıza göre düzenlersiniz.

C++:
Option Explicit

Private Sub CommandButton1_Click()
    Dim My_Array() As Variant, X As Long, Total As Long
    Dim Txt As String, No As Byte, X_Time As Double
    
    X_Time = Timer
    
    ListBox1.Clear
    
    With CreateObject("Scripting.Dictionary")
        .CompareMode = vbTextCompare
    
        For X = 8 To 47
            Txt = Trim(Me.Controls("TextBox" & X).Text)
            If Txt <> "" Then
                If Not .Exists(Txt) Then
                    No = No + 1
                    .Add Txt, No
                    ReDim Preserve My_Array(1 To 2, 1 To No)
                    My_Array(1, No) = Txt
                    My_Array(2, No) = 1
                    Total = Total + 1
                Else
                    My_Array(2, .Item(Txt)) = My_Array(2, .Item(Txt)) + 1
                    Total = Total + 1
                End If
            End If
        Next
        
        If .Count > 0 Then
            ListBox1.ColumnCount = 2
            ListBox1.Column = My_Array
        End If
    End With

    TextBox50 = Format(Total, "#,##0")

    MsgBox "İşlem süresi ; " & Format(Timer - X_Time, "0.00") & " Saniye"
End Sub
 
Katılım
24 Temmuz 2019
Mesajlar
482
Excel Vers. ve Dili
EXCEL 2010 TÜRKÇE
Altın Üyelik Bitiş Tarihi
19-12-2025
Deneyiniz.

TextBox50 olarak ayarladım. Siz kendi dosyanıza göre düzenlersiniz.

C++:
Option Explicit

Private Sub CommandButton1_Click()
    Dim My_Array() As Variant, X As Long, Total As Long
    Dim Txt As String, No As Byte, X_Time As Double
   
    X_Time = Timer
   
    ListBox1.Clear
   
    With CreateObject("Scripting.Dictionary")
        .CompareMode = vbTextCompare
   
        For X = 8 To 47
            Txt = Trim(Me.Controls("TextBox" & X).Text)
            If Txt <> "" Then
                If Not .Exists(Txt) Then
                    No = No + 1
                    .Add Txt, No
                    ReDim Preserve My_Array(1 To 2, 1 To No)
                    My_Array(1, No) = Txt
                    My_Array(2, No) = 1
                    Total = Total + 1
                Else
                    My_Array(2, .Item(Txt)) = My_Array(2, .Item(Txt)) + 1
                    Total = Total + 1
                End If
            End If
        Next
       
        If .Count > 0 Then
            ListBox1.ColumnCount = 2
            ListBox1.Column = My_Array
        End If
    End With

    TextBox50 = Format(Total, "#,##0")

    MsgBox "İşlem süresi ; " & Format(Timer - X_Time, "0.00") & " Saniye"
End Sub
Çok teşekkür ederim Korhan Bey emeğinize sağlık
 
Üst