İki Ayrı Formda Listbox Double Click olayı Sorunu

Cevapla
Mehmet Ş.
Mesajlar: 1
Kayıt: Cum Tem 18, 2025 10:31 pm
Lokasyon: Ankara
Adınız: Mehmet
Soyadınız: Şşş

İki Ayrı Formda Listbox Double Click olayı Sorunu

Mesaj gönderen Mehmet Ş. »

Merhabalar iyi akşamlar;
Bir yardım programı yapmaya çalışıyorum
Herşey muntazam bitme noktasında ama şu an bir yerde bir sıkıntı gördüm çözemedim bir türlü

Şöyleki İki tane Form var Biri KayitFormu adında diğeri userform1 adında her isinde de birer tane listbox var KayitFormu'ndakinin adı Listbox1 Userform1 içindeki ise lstmydata adında

Sorunum şu:
Öncelikle genel olarak frmAnamenu diye bir form üzerinden ilk kez uerform1 açıldığında oradan lstmydata üzerinden herhangi bir satıra çift tıklama yaptığımda KayitFormu benm istediğim şekilde yeni bir kayıt oluşturmak üzere açılıyor. Ancak kayıtformu kapatılıp tekrar frmanamenu ye geçildiğinde oradan userform1 açıldığında ve oradan bir başka satır ya da aynı satır seçildiğinde ve double clik olayı çağrıldığında bu kez KayitFormu içindeki listbox1 içindeki 3. satırda yer alan (bu değişmiyor hep 3. satır geliyor) bilgiler Kayyitformunda görünüyor. Oysa KayıtFormu'nda hiç bir şekilde listbox1 de öncesinde ya da sonrasında satıl seçilmemişken

İstediğim ise double click olayı yapıldığında KAyitFormu açılsın ve yeni kayıtyapılacak şeilde bilgiler oraya düzenli gelsin ve formun kilitli olan alanları açılsın. Dediğim ibi bu programın ilk açılışında harika çalışıyor sonradan sıkıntı oluyor. Ben KayitFormu initialize kısmı ya da acvtivate kısmından şüpheleniyorum ama bir türlü çözemedim siz değerli üstatların yardımını alayım istedim. (Karışık anlattıysam kusura bakmayın)

KayitFormu initialize ve Userform1 Lstmydata double click prosedürlerini ekliyorum buraya umarım yardımcı olabilirsiniz

Kod: Tümünü seç

Private Sub UserForm_Initialize()
    Dim yol As String
    Dim i As Long, j As Long
    Dim d As Long, sonSatir As Long, SonSatiry As Long
    Dim yilAralik As Range, hucre As Range
    Dim ws As Worksheet
    Dim veri As Variant, tersVeri() As Variant
    Dim satirSayisi As Long, sutunSayisi As Long
    
   On Error Resume Next
    ListBox1.ListIndex = -1 ' Seçimi sıfırla
    On Error GoTo 0
    '====LAbelBildirimiçin ön ayar
Set MesajKuyrugu = New Collection
    LabelMesajGosteriliyor = False
    
    ' LabelBildirim başta gizli olsun
    LabelBildirim.Visible = False
     
    
    ' ====LAbelBildirimiçin ön ayar sonu
    
    
    ' === Kilit görseli
    yol = ThisWorkbook.Path & "\icons\KilitKapali.gif"
    If Dir(yol) <> "" Then
        Image2.Picture = LoadPicture(yol)
    End If

    ' === Başlangıç kilit ayarı
    With Me.ToggleButton4
        .Value = True
        .Caption = "Kilitli"
        .Enabled = True
    End With

    ' === GlobalYil ayarı
    If Not isNumeric(GlobalYil) Or Len(GlobalYil) <> 4 Then
        If IsDate(Sheets("AnaSayfa").Range("C2").Value) Then
            GlobalYil = CStr(Year(Sheets("AnaSayfa").Range("C2").Value))
        Else
            MsgBox "AnaSayfa!C2 hücresinde geçerli bir tarih bulunamadı!", vbCritical
            Exit Sub
        End If
    End If

    ' === ComboBox yılı doldur
    cmbYilSec.Clear
    On Error Resume Next
    Set yilAralik = ThisWorkbook.Names("YilListesi").RefersToRange
    On Error GoTo 0
    If Not yilAralik Is Nothing Then
        For Each hucre In yilAralik
            If isNumeric(hucre.Value) Then cmbYilSec.AddItem hucre.Value
        Next hucre
    End If
    cmbYilSec.Value = GlobalYil

    ' === Etiket
    Label22.Caption = "Çalışılan Dönem: 01.01." & GlobalYil & " - 31.12." & GlobalYil

    ' === Verileri listele
    If YuklenenYil <> GlobalYil Or Not VeriYuklendi Then
        'Call KayitlariListele(GlobalYil)
        Call ListeyiYukle
        YuklenenYil = GlobalYil
        VeriYuklendi = True
    End If

    ' === ListBox verileri yükle (ters)
    Set ws = ThisWorkbook.Sheets("AnaSayfa")
    For d = 2 To 100000
        If ws.Range("A" & d).Value = "" Then
            sonSatir = d - 1
            Exit For
        End If
    Next d

    If sonSatir >= 2 Then
        satirSayisi = sonSatir - 1
        veri = ws.Range("A2:N" & sonSatir).Value
        sutunSayisi = UBound(veri, 2)
        ReDim tersVeri(1 To satirSayisi, 1 To sutunSayisi)
        For i = 1 To satirSayisi
            For j = 1 To sutunSayisi
                If j = 3 Then
                    tersVeri(i, j) = Format(veri(satirSayisi - i + 1, j), "dd.mm.yyyy")
                Else
                    tersVeri(i, j) = veri(satirSayisi - i + 1, j)
                End If
            Next j
        Next i
        With ListBox1
            .Clear
            .ColumnCount = sutunSayisi
            .List = tersVeri
            .ColumnWidths = "0;30;60;70;60;80;60;140;40;160;0;40;0;0"
        End With
    Else
        ListBox1.Clear
    End If

    ' === Formun yılına göre kilit kontrolü
    Call YilKontroluUygula

    ' === Yardım listesi
    'Sheets("SORGU").Range("A2:M5000").ClearContents
    SonSatiry = WorksheetFunction.CountA(Sheets("SORGU").Range("A:A")) + 1
    With LstYardim
        .ColumnCount = 13
        .RowSource = "SORGU!A2:M" & SonSatiry
        .ColumnWidths = "0;30;0;0;0;0;0;0;50;160;0;0;0"
        .ColumnHeads = True
    End With

    ' === Admin kontrolü
    Me.btnDepo.Visible = (LCase(GirisYapanKullanici) = "admin")

    ' === Başlangıç ayarları
    baslangicBagisVerildi = True
    OpBgsVerildi.Value = True
    OpBgsYapildi.Value = False
    Label14 = ListBox1.ListCount & " adet kayıt listelendi."

    ToggleButton4.Value = True
    ToggleButton4.Enabled = True
    Call UpdateToggleButtonState

    Me.cmbBagisci.Visible = False
    Me.LabelBagisci.Visible = False

    ' Giriş yapan kullanıcı boşsa VERİ sayfasından çek
    If GirisYapanKullanici = "" Then
        GirisYapanKullanici = ThisWorkbook.Sheets("VERİ").Range("M19").Value
    End If

    ' === ComboBox arama için Aile verileri
    Dim wsAileler As Worksheet
    Dim veriAd As Variant, veriTC As Variant

    Set wsAileler = ThisWorkbook.Sheets("Aileler")
    sonSatir = wsAileler.Cells(wsAileler.Rows.count, "C").End(xlUp).Row

    If sonSatir >= 2 Then
        veriAd = wsAileler.Range("C2:C" & sonSatir).Value
        veriTC = wsAileler.Range("D2:D" & sonSatir).Value

        Me.CmbAd.Clear
        Me.CmbTC.Clear

        For i = 1 To UBound(veriAd, 1)
            Me.CmbAd.AddItem veriAd(i, 1)
            Me.CmbTC.AddItem veriTC(i, 1)
        Next i

        Me.CmbAd.ListIndex = -1
        Me.CmbTC.ListIndex = -1
    End If

cmbBagisci.Clear
For idx = 2 To lastRow
    bagisciAdi = Trim(wsBagiscilar.Cells(idx, "C").Value)
    If bagisciAdi <> "" Then
        cmbBagisci.AddItem UCase(bagisciAdi) ' TAMAMEN BÜYÜK HARF
    End If
Next idx

'burası Aile kayıtformundan yardım yap ile geçildiğinde formun kilitli değil açık halde açılması için
 ' Eğer açılış "Duzenle" modundaysa kilidi aç
    If AcilisModu = "Duzenle" Or KayitFormuKilitliOlmasin = True Then
    ToggleButton4.Value = False
    UpdateToggleButtonState
    CmbYardimTuru.SetFocus
    Else
        ToggleButton4.Value = True
        UpdateToggleButtonState
    End If

'açılışta Yardım Türleri Comboboxa Listelensin
 
    
    Dim turler() As String
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    Set ws = ThisWorkbook.Sheets("StokTakip")
    sonSatir = ws.ListObjects("Tablo1").ListRows.count
    
    ' Türleri Dictionary ile benzersiz olarak alalım
    For i = 1 To sonSatir
        Dim tur As Variant
        tur = Trim(ws.ListObjects("Tablo1").DataBodyRange(i, 2).Value)
        If tur <> "" Then
            If Not dict.Exists(tur) Then dict.Add tur, Nothing
        End If
    Next i
    
    ' ComboBox'a benzersiz türleri ekle
    Me.CmbYardimTuru.Clear
    For Each tur In dict.Keys
        Me.CmbYardimTuru.AddItem tur
    Next tur
    
    DoldurVeSiralaCmbVERYAR
    
    ' Açılışta Birimler Combobox'a Listelensin
Dim birimler() As String
Dim dictBirim As Object
Set dictBirim = CreateObject("Scripting.Dictionary")

Set ws = ThisWorkbook.Sheets("StokTakip")
sonSatir = ws.ListObjects("Tablo1").ListRows.count

' Birimleri Dictionary ile benzersiz olarak alalım
For i = 1 To sonSatir
    Dim birim As Variant
    birim = Trim(ws.ListObjects("Tablo1").DataBodyRange(i, 6).Value) ' F sütunu
    If birim <> "" Then
        If Not dictBirim.Exists(birim) Then dictBirim.Add birim, Nothing
    End If
Next i

' ComboBox'a benzersiz birimleri ekle
Me.CmbBirim.Clear
For Each birim In dictBirim.Keys
    Me.CmbBirim.AddItem birim
Next birim


    Set ws = ThisWorkbook.Sheets("Sorgu")
    
    ' Sorgu sayfasında B2 hücresinde veri var mı kontrol et
    If ws.Cells(2, "B").Value <> "" Then
        ' Kayıt formu hazırlanıyor bildirimi
        ShowTemporaryLabel "Kayıt Formu sizin için hazırlanıyor...", RGB(255, 230, 153), vbBlack
        Pause 5
        DoEvents
        
        ' Kayıt formu iptal işlemini başlat
        Call IptalVeVeriGeriAl ' İptal işlemi ile verileri geri al

        ' Kayıt formu hazır bildirimi
        ShowTemporaryLabel "Kayıt Formu kullanıma hazır.", RGB(153, 255, 153), vbBlack
        Pause 3
        DoEvents
    End If


End Sub

Bu da userfom1 içindeki lstmydata doublue click prosedürü

Kod: Tümünü seç

Private Sub lstMyData_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim satir As Long

    ' Seçili satır yoksa çık
    If lstMyData.ListIndex = -1 Then
        MsgBox "Lütfen bir satır seçiniz.", vbExclamation
        Exit Sub
    End If

    satir = lstMyData.ListIndex

    ' Kayıt formunu aç
 KayitFormuKilitliOlmasin = True
KayitFormu.Show
KayitFormuKilitliOlmasin = False ' Açtıktan sonra tekrar kilitlenebilir olsun

    Me.Hide ' UserForm1'i gizle

    ' Verileri aktar
    With KayitFormu
        ' lstMyData'dan alınan verileri KayitFormu'na aktar
        .CmbAd.Value = lstMyData.List(satir, 2) ' Örnek: CmbAd'ye lstMyData'dan 2. kolonu aktar
        .CmbTC.Value = lstMyData.List(satir, 3) ' CmbTC'ye lstMyData'dan 3. kolonu aktar
        .TextBoxTEL.Value = lstMyData.List(satir, 4) ' TextBoxTEL'ye lstMyData'dan 4. kolonu aktar
        .ComboBoxILCE.Value = lstMyData.List(satir, 5) ' ComboBoxILCE'ye lstMyData'dan 5. kolonu aktar
        .TextBoxADRES.Value = lstMyData.List(satir, 6) ' TextBoxADRES'ye lstMyData'dan 6. kolonu aktar
        .TextBoxACIKLAMA.Value = lstMyData.List(satir, 7) ' TextBoxACIKLAMA'ya lstMyData'dan 7. kolonu aktar
        .ComboBoxDRM.Value = lstMyData.List(satir, 8) ' ComboBoxDRM'ye lstMyData'dan 8. kolonu aktar
    End With
    
    ' KayitFormu'nda yeni Tutanak No'yu oluştur
    Call YeniTutanakNoOlustur(KayitFormu)  ' KayitFormu formunu parametre olarak geçiriyoruz

    KayitFormu.Kilit_On
    KayitFormu.UpdateToggleButtonState
    KayitFormu.cmbKaydet.Visible = True
    KayitFormu.cmbKaydet.Enabled = True
    KayitFormu.btnIptal.Visible = True
    KayitFormu.btnIptal.Enabled = True
    KayitFormu.CmdTutanak.Visible = True
    KayitFormu.CmdTutanak.Enabled = True
    KayitFormu.cmbVERYAR.Visible = True
    KayitFormu.cmbVERYAR.Enabled = True
    KayitFormu.cmbVERYAR.SetFocus
    
End Sub
Şimdiden yardımlarını için teşekkür ederim
a_self_lion
Mesajlar: 9
Kayıt: Cum Ağu 29, 2025 8:34 pm
Meslek: Satın Alma Yöneticisi/Müdürü
Adınız: Özcan
Soyadınız: Özarslan

Re: İki Ayrı Formda Listbox Double Click olayı Sorunu

Mesaj gönderen a_self_lion »

Merhaba
Öneri olarak
1. KayitFormu_Initialize içinde ListIndex mutlaka sıfırlanmalı

Şunu biraz daha garantiye al:

Kod: Tümünü seç

With Me.ListBox1
    .ListIndex = -1
    .MultiSelect = fmMultiSelectSingle
End With

veya belki daha sonra da sıfırlamak gerekebilir.

2. KayitFormu_Activate içinde tekrar seçim sıfırlama ekleyin

Kod: Tümünü seç

Private Sub UserForm_Activate()
    Me.ListBox1.ListIndex = -1
End Sub

Bu şekilde form tekrar her aktif olduğunda ListBox1 seçili olmayacak.

3. ListBox1_Click, Change gibi olaylara da bir şey yazdıysanız kontrol edin
Eğer ListBox1 içinde bir satır seçildiğinde başka alanlar doluyorsa, Click veya Change event'leri altında kodlar varsa ve bu eventler istem dışı tetikleniyorsa, bu da istenmeyen veri gösterimine yol açabilir.

Örneğin

Kod: Tümünü seç

Private Sub ListBox1_Click()
    ' Otomatik veri doldurma yapılıyor mu? Kontrol edin.
    If Me.ListBox1.ListIndex >= 0 Then
        ' Alanları dolduruyor olabilir
    End If
End Sub

Bu varsa ve istemsiz çalışıyorsa, şu şekilde geçici olarak devre dışı bırakabilirsiniz:

Kod: Tümünü seç

' Form açılırken
Application.EnableEvents = False

' ... işlemler

Application.EnableEvents = True

Ancak bu sadece WorkSheet olaylarını etkiler. UserForm olaylarını kontrol için kendi bool değişkenlerinizi kullanabilirsiniz.

Önerdiğim şu ek kodları da ekleyebilirsin.
KayitFormu içinde

Kod: Tümünü seç

Private Sub UserForm_Initialize()
    ' ...
    Me.ListBox1.ListIndex = -1 ' Seçimi sıfırla
    ' ...
End Sub

Private Sub UserForm_Activate()
    Me.ListBox1.ListIndex = -1 ' Aktif olduğunda da seçimi sıfırla
End Sub
Ek olarak ListBox1_Click olayında:

Kod: Tümünü seç

Private Sub ListBox1_Click()
    If ListBox1.ListIndex < 0 Then Exit Sub
    ' Sonradan veri dolduruluyorsa burada dolduruluyor
End Sub
Bunları yaptıktan sonra bir deneyiniz. Sorun olursa yine burdan paylaşırsanız bakabiliriz.

İyi çalışmalar Dilerim.
Cevapla
  • Benzer Konular
    Cevaplar
    Görüntüleme
    Son mesaj