Skip to main content

AccessTr.neT


Excel Userform Üzerinde Combobox Da Verileri Türkçe Alfabetik Sıralama.

Oğuz Türkyılmaz
Oğuz Türkyılmaz
29
2126

Excel Userform Üzerinde Combobox Da Verileri Türkçe Alfabetik Sıralama.

Çözüldü #1
Merhaba Userformdan Excele kayıt yaparken Firma Ünvanı Comboboxı aynı zamanda sayfadaki veriler üzerinde arama yapıyor ve veriye rastlarsa formun üstüne tüm verileri getiriyor. Sorun comboboxdaki veriler sayfadaki verilerin kayıt sırasına göre geliyor. Yani ben ARDA yazdığımda combobox da rastladığı ilk ARDA hangi kayıtsa o kaydı getiriyor ama ben 2.ARDA ile başlayan kaydı comboboxda göremiyorum sıralı dizilmediği için. Ben bunların Türkçe Alfabetik olarak sıralı gelmesini nasıl sağlarım.

( Ancak Tüm sayfayı ünvana göre alfabetik filtreleyip düzenlersem haliyle comboboxda A-Z ye sıralı geliyor ama bu tarz uygulama benim için kullanışlı olmuyor )
[Resim: do.php?img=11003]
[Resim: do.php?img=11004]
.rar WINPERAX.rar (Dosya Boyutu: 187,98 KB | İndirme Sayısı: 16)
Access Çekirgesi 
[Resim: img-cray.gif]


Cevapla
#2
Merhaba.
Kodu resimdeki gibi yere ekleyin.
Ado ile vs.. yapılır lakin Türkçe karakterler en sonda sıralanır biliyorum bu yüzden böyle tam sıralanır.
Çok fazla veri varsa combobxta biraz yavaş çalışabilir Ado ya göre.
Yavaş olursa yazın önce ado ile alıp sonra bu şekildede sıralatınca hızlı olur bence.

[Resim: do.php?img=11012]
https://resim.accesstr.net/do.php?img=11012


     Dim x As Long, y As Long, atla As String
    With ComboBox_FirmaUnvani
        If .ListCount = 0 Then Exit Sub
        For x = LBound(.List) To UBound(.List)
            For y = x To UBound(.List)
                If StrComp(.List(x, 0), .List(y, 0), vbTextCompare) = 1 Then
                    atla = .List(x, 0)
                    .List(x, 0) = .List(y, 0)
                    .List(y, 0) = atla
                End If
            Next
        Next
    End With
Cevapla
#3
Şuan 1200 satır veri var ve hızlı olsun diye .xlsb uzantılı kaydetmiştim canavar gibiydi. Bu koddan sonra formun yüklenmesi 3, 3.5 saniye kadar zaman almaya başladı ama comboboxda hiçbir yavaşlama yok. Total veri sayısıda zamanla 3000 civarı olur zaten çok artmayacak yani sıkıntı olacağını düşünmüyorum. Çok teşekkür ederim @feraz hocam.
Access Çekirgesi 
[Resim: img-cray.gif]


Cevapla
#4
recordsetle denemek isterseniz aşağıdaki kodu deneyebilirsiniz.
Not: referanslara ADO eklenmeli
ADO dan kast ettiğim; microsoft Activex Data Objects x.x
'hy____________________________AçılırKutu_Deneme
Dim Sql As String
Dim ADO_RS As ADODB.Recordset
Dim ADO_CN As ADODB.Connection

SQL = "SELECT [F1] " & _
      "FROM [Ana_Sayfa$C2:C] " & _
      "WHERE ([F1]<>"""") " & _
      "ORDER BY [F1];"

Set ADO_RS = New ADODB.Recordset
Set ADO_CN = New ADODB.Connection

ADO_CN.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;data source=" & ThisWorkbook.FullName & _
                          ";extended properties=""excel 8.0;hdr=No"""
ADO_CN.Open
ADO_RS.Open SQL, ADO_CN, 3, 1

If ADO_RS.RecordCount = 0 Then GoTo son

ADO_RS.MoveLast
ADO_RS.MoveFirst

ComboBox_FirmaUnvani.Column = ADO_RS.GetRows

son:
ADO_RS.Close
ADO_CN.Close
Set ADO_RS = Nothing
Set ADO_CN = Nothing
'hy_____________________________________________Bitti
    Application.AutoCorrect.AutoExpandListRange = True

    IlleriAktar
    TextBox_Tarih = Format(Date, "dd.mm.yyyy")

        With TextBox_Tarih
        .SelStart = 0
        .SelLength = .TextLength
        End With
Cevapla
#5
diğer yöntemde
önce bir modüle aşağıdaki fonksiyonu ekleyip
Option Compare Text
Function SortArrayAtoZ(myArray As Variant)

Dim i As Long
Dim j As Long
Dim Temp

'Sort the Array A-Z
For i = LBound(myArray) To UBound(myArray) - 1
    For j = i + 1 To UBound(myArray)
        If UCase(myArray(i)) > UCase(myArray(j)) Then
            Temp = myArray(j)
            myArray(j) = myArray(i)
            myArray(i) = Temp
        End If
    Next j
Next i

SortArrayAtoZ = myArray

End Function
sonra da form başlangıç kodunu aşağıdaki gibi düzenleyip dener misiniz?
Private Sub UserForm_Initialize()

    Dim sonTabloSatr As Long
    Dim Rng As Range
   
    With ThisWorkbook.Sheets("Ana_Sayfa")
        sonTabloSatr = .ListObjects("Tablo1").Range.Columns(1).Cells.Find("*", _
                        SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

        If sonTabloSatr = 2 Then
            ComboBox_FirmaUnvani.AddItem .Range("C2").Value
        ElseIf sonTabloSatr > 2 Then
            Set Rng = .Range("C2:C" & sonTabloSatr)
            Dim arr() As Variant
            x = -1
            For Each a In Rng.Cells
                ReDim Preserve arr(x + 1)
                x = x + 1
                arr(x) = a.Value
            Next
        End If

    End With
   
ComboBox_FirmaUnvani.List = SortArrayAtoZ(arr)
   
    Application.AutoCorrect.AutoExpandListRange = True

    IlleriAktar
    TextBox_Tarih = Format(Date, "dd.mm.yyyy")

        With TextBox_Tarih
        .SelStart = 0
        .SelLength = .TextLength
        End With

End Sub
Cevapla
#6
(12/05/2021, 15:54)berduş yazdı: Application.AutoCorrect.AutoExpandListRange = True
Bu ne işe yarıyor abey ,araştırmadan bir sorayım istedim.
Ado ile olanı denedim ve Ç,Ü,İ gibi harfleri en altta sıralıyordu verdiğiniz kodda normal sıraladı.
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da