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 )
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.
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
Ş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.
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
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
(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ı.