Skip to main content

AccessTr.neT


Listbox Da Verilerin Listelenmesi Hakkında.

Oğuz Türkyılmaz
Oğuz Türkyılmaz
12
1651

Listbox Da Verilerin Listelenmesi Hakkında.

#7
kodun son hali aşağıdaki gibidir
başlıkları da alıyor ama yanılmıyorsam Excel userformdaki listboxlar başlığı sadece Excel sayfasından alırken kullanabiliyor onun için başlığı da diziye ekledim. bu durumda listboxta aşağı indiğinizde başlık alanı da dizi içinde olduğundan kayboluyor
listbox'ın header özelliği HAYIR yapılmalı
Private Sub UserForm_Initialize()
   
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sqlSorgusu As String

' Bağlantıyı hızlı şekilde aç
Set cn = New ADODB.Connection
cn.ConnectionString = "Driver={ODBC Driver 17 for Sql Server};" & _
                      "Server=OĞUZ\SQLEXPRESS;" & _
                      "Database=db_Personel;" & _
                      "Trusted_Connection=Yes;" & _
                      "Connect Timeout=5"  ' Bağlantıyı 5 saniyede tamamla

cn.Open

' Hızlı veri çekme için Sql sorgusunu hazırlama
sqlSorgusu = "SELECT * FROM [tbl_Personel] WITH (NOLOCK);" ' Kilitlemeyi önleyerek hızlı okuma sağlar

Set rs = New ADODB.Recordset
rs.CursorType = adOpenForwardOnly ' İleriye doğru en hızlı okuma için
rs.LockType = adLockReadOnly ' Veriyi sadece okuma modunda açarak hızlandırma
rs.Open sqlSorgusu, cn
lstPersonel.ColumnCount = rs.Fields.Count
' Veriyi diziye aktar
    If Not rs.EOF = True Then
    Dim dz As Variant, dzS As Variant
    dz = rs.GetRows
    ReDim dzS(LBound(dz) To UBound(dz), LBound(dz, 2) - 1 To UBound(dz, 2))
        For x = LBound(dz) To UBound(dz)
            For y = LBound(dz, 2) To UBound(dz, 2)
                dzS(x, y) = dz(x, y)
            Next y
        Next x
    For x = 0 To rs.Fields.Count - 1
        dzS(x, -1) = rs(x).Name
    Next x
  lstPersonel.Column = dzS
  End If
' Temizlik
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
    Exit Sub

HataBaglanti:
    MsgBox "Veritabanına bağlanırken bir hata oluştu: " & Err.Description, vbCritical
    ' Hata durumunda bağlantı nesnelerini temizle
    If Not cn Is Nothing Then
        If cn.State = adStateOpen Then cn.Close
        Set cn = Nothing

HataVeriOku:
    MsgBox "Personel verilerini okurken bir hata oluştu: " & Err.Description, vbCritical
    ' Hata durumunda kayıt kümesi nesnesini temizle
    If Not rs Is Nothing Then
        If rs.State = adStateOpen Then rs.Close
        Set rs = Nothing
    End If
    ' Bağlantıyı da kapatmayı unutmayın (eğer açıksa)
    If Not cn Is Nothing Then
        If cn.State = adStateOpen Then cn.Close
        Set cn = Nothing
    End If
End If

End Sub
eğer başlıkların başlık formatında görünmesini istiyorsanız verileri excl sayfasına ekleyip oradan çekmelisiniz
Cevapla
#8
(16/05/2025, 19:20)berduş yazdı: kodun son hali aşağıdaki gibidir
başlıkları da alıyor ama yanılmıyorsam Excel userformdaki listboxlar başlığı sadece Excel sayfasından alırken kullanabiliyor onun için başlığı da diziye ekledim. bu durumda listboxta aşağı indiğinizde başlık alanı da dizi içinde olduğundan kayboluyor
listbox'ın header özelliği HAYIR yapılmalı
Private Sub UserForm_Initialize()
   
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sqlSorgusu As String

' Bağlantıyı hızlı şekilde aç
Set cn = New ADODB.Connection
cn.ConnectionString = "Driver={ODBC Driver 17 for Sql Server};" & _
                      "Server=OĞUZ\SQLEXPRESS;" & _
                      "Database=db_Personel;" & _
                      "Trusted_Connection=Yes;" & _
                      "Connect Timeout=5"  ' Bağlantıyı 5 saniyede tamamla

cn.Open

' Hızlı veri çekme için Sql sorgusunu hazırlama
sqlSorgusu = "SELECT * FROM [tbl_Personel] WITH (NOLOCK);" ' Kilitlemeyi önleyerek hızlı okuma sağlar

Set rs = New ADODB.Recordset
rs.CursorType = adOpenForwardOnly ' İleriye doğru en hızlı okuma için
rs.LockType = adLockReadOnly ' Veriyi sadece okuma modunda açarak hızlandırma
rs.Open sqlSorgusu, cn
lstPersonel.ColumnCount = rs.Fields.Count
' Veriyi diziye aktar
    If Not rs.EOF = True Then
    Dim dz As Variant, dzS As Variant
    dz = rs.GetRows
    ReDim dzS(LBound(dz) To UBound(dz), LBound(dz, 2) - 1 To UBound(dz, 2))
        For x = LBound(dz) To UBound(dz)
            For y = LBound(dz, 2) To UBound(dz, 2)
                dzS(x, y) = dz(x, y)
            Next y
        Next x
    For x = 0 To rs.Fields.Count - 1
        dzS(x, -1) = rs(x).Name
    Next x
  lstPersonel.Column = dzS
  End If
' Temizlik
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
    Exit Sub

HataBaglanti:
    MsgBox "Veritabanına bağlanırken bir hata oluştu: " & Err.Description, vbCritical
    ' Hata durumunda bağlantı nesnelerini temizle
    If Not cn Is Nothing Then
        If cn.State = adStateOpen Then cn.Close
        Set cn = Nothing

HataVeriOku:
    MsgBox "Personel verilerini okurken bir hata oluştu: " & Err.Description, vbCritical
    ' Hata durumunda kayıt kümesi nesnesini temizle
    If Not rs Is Nothing Then
        If rs.State = adStateOpen Then rs.Close
        Set rs = Nothing
    End If
    ' Bağlantıyı da kapatmayı unutmayın (eğer açıksa)
    If Not cn Is Nothing Then
        If cn.State = adStateOpen Then cn.Close
        Set cn = Nothing
    End If
End If

End Sub
eğer başlıkların başlık formatında görünmesini istiyorsanız verileri Excel sayfasına ekleyip oradan çekmelisiniz

Berdus hocam Teşekkür ederim yanıtınız için. Verdiğiniz kod ile sorun halloldu. Kodunuzu tabiki herzaman ki gibi anlamadım ama demek ki 10 sütundan fazlası da Listboxda gösterilebiliyormuş.
Access Çekirgesi 
[Resim: img-cray.gif]


Son Düzenleme: 17/05/2025, 11:01, Düzenleyen: Oğuz Türkyılmaz.
Cevapla
#9
Benim internetten bulduğum çözümde şu şekilde. Sadece 10 adet sütun gösterilebiliyor ama koddan da anlaşılacağı üzere onları da seçme şansınız var.
Private Sub UserForm_Initialize()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sqlSorgusu As String
Dim i As Integer, j As Integer
Dim rowIndex As Long
Dim gosterilecekSutunlar As Variant
Dim sutunGenislikleri As String

' Hangi sütunlar gösterilecek (max 10)
gosterilecekSutunlar = Array(0, 1, 2, 3, 4, 7, 8, 10, 11, 12)

' Genişlikler: 10 değer olmalı
sutunGenislikleri = "15;110;70;70;60;80;130;70;70;90"

Set cn = New ADODB.Connection
cn.ConnectionString = "Driver={ODBC Driver 17 for Sql Server};" & _
"Server=OĞUZ\SQLEXPRESS;" & _
"Database=db_Personel;" & _
"Trusted_Connection=Yes;"
On Error GoTo HataBaglanti
cn.Open
On Error GoTo 0

sqlSorgusu = "SELECT * FROM tbl_Personel;"
Set rs = New ADODB.Recordset
On Error GoTo HataVeriOku
rs.Open sqlSorgusu, cn, adOpenStatic, adLockReadOnly
On Error GoTo 0

If rs.EOF Then GoTo TemizleHerşey

With lstPersonel
.Clear
.ColumnCount = UBound(gosterilecekSutunlar) + 1
.ColumnWidths = sutunGenislikleri
.MultiSelect = 0
End With

' Verileri ekle
Do While Not rs.EOF
lstPersonel.AddItem NzText(rs.Fields(gosterilecekSutunlar(0)).Value)
rowIndex = lstPersonel.ListCount - 1

For j = 1 To UBound(gosterilecekSutunlar)
lstPersonel.List(rowIndex, j) = NzText(rs.Fields(gosterilecekSutunlar(j)).Value)
Next j

rs.MoveNext
Loop

lstPersonel.ListIndex = -1

TemizleHerşey:
rs.Close: cn.Close
Set rs = Nothing: Set cn = Nothing
Exit Sub

HataBaglanti:
MsgBox "Veritabanına bağlanamadı: " & Err.Description, vbCritical
Resume TemizleHerşey

HataVeriOku:
MsgBox "Veri okunamadı: " & Err.Description, vbCritical
Resume TemizleHerşey
End Sub
Access Çekirgesi 
[Resim: img-cray.gif]


Cevapla
#10
Rekordsette de başlıklar ve sırası seçilebilir. Select * from tabloAdi yerine
Select alan5, alan2, alan7 feom tabloAdi gibi bir sorgu ihtiyacınızı görür.
Cevapla
#11
(17/05/2025, 11:12)berduş yazdı: Rekordsette de başlıklar ve sırası seçilebilir. Select * from tabloAdi yerine
Select alan5, alan2, alan7 feom tabloAdi gibi bir sorgu ihtiyacınızı görür.

Onu da deneyeceğim, çok teşekkür ederim yardımlarınız için.
Access Çekirgesi 
[Resim: img-cray.gif]


Cevapla
#12
rica ederim
iyi çalışmalar
Cevapla

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

Yorum yapmak için üye olmanız gerekiyor

ya da
Task