• DİKKAT

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

Basılan butonu bulma

Katılım
18 Aralık 2022
Mesajlar
53
Excel Vers. ve Dili
2010
Herkese iyi çalışmalar.
Captionu harf olan 29 adet Label var. Hepsinin click olayına "BUL" isimli makro koydum.
Sonra "BUL" isimli makro yazdım.
Hangisine basarsam basayım BUL makrosu çalışacak.
Fakat makronun içine; makronun hangisine bastığımı bulabileceği kodu nasıl yazabilirim.
Ben Label Click olayına çözüm olarak şöyle bir kod yazdım.
Önce Label enabled=false oluyor. Sonra BUL makrosuna gidiyor. BUL makrosu bittikten sonra Label tekrar enabled=true oluyor
Dolayısıyle for each döngüsüyle makro; enabled=false olan Label'ı bularak clicklemiş olduğum Label'ı buluyor
Makro, Label'ı daha kısa bulabilir mi?
İlginiz için şimdiden Teşekkür ederim.
 
label'ların activecontrol olayı yok diye biliyorum, bu neden doğrudan tıklama olayında o kullanabilmek için class oluşturmak gerekiyor ki bu da kodları olduğundan daha da uzatır
neden düğme kullanmıyorsunuz, özel bir nedeni var mı?
 
Merhaba,

@halily beyin bahsettiği gibi bu işlem için CLASS kullanmanız gerekir.

Çalışmanıza yeni bir CLASS MODUL ekleyiniz. Aşağıdaki kodu bu class içine uygulayınız.

C++:
Option Explicit
Public WithEvents My_Label As MSForms.Label

Private Sub My_Label_Click()
    MsgBox "Tıklanan Label: " & My_Label.Name
End Sub

Userformunuzun kod bölümüne aşağıdaki kodları uygulayınız. Eğer formunuzda daha fazla LABEL varsa ve bu işleme dahil olmayacaksa koda ekleme yapmak gerekecektir.

İlk önce boş bir excel dosyasında deneyip sonucu gözlemleyiniz. Sonra asıl dosyanıza uyarlarsınız..

C++:
Option Explicit
Private Labels As Collection

Private Sub UserForm_Initialize()
    Dim Ctrl As Control, My_Object As Class1
    
    Set Labels = New Collection
    
    For Each Ctrl In Me.Controls
        If TypeName(Ctrl) = "Label" Then
            Set My_Object = New Class1
            Set My_Object.My_Label = Ctrl
            Labels.Add My_Object
        End If
    Next
End Sub

Sub Bul(X As Label)
    MsgBox X.Name
End Sub
 
label'ların activecontrol olayı yok diye biliyorum, bu neden doğrudan tıklama olayında o kullanabilmek için class oluşturmak gerekiyor ki bu da kodları olduğundan daha da uzatır
neden düğme kullanmıyorsunuz, özel bir nedeni var mı?
özel bir nedeni yok. Bildiklerimle çalışıyorum.Fazla bilmiyorum
 
eğer label/etiket yerine button/düğme kullanırsanız bul fonksiyonunun içinde ActiveControl.Name ile ismi alınabilir yada ActiveControl.istediğinözellik istediğiniz özellik değiştirilebilir
 
Merhaba,

@halily beyin bahsettiği gibi bu işlem için CLASS kullanmanız gerekir.

Çalışmanıza yeni bir CLASS MODUL ekleyiniz. Aşağıdaki kodu bu class içine uygulayınız.

C++:
Option Explicit
Public WithEvents My_Label As MSForms.Label

Private Sub My_Label_Click()
    MsgBox "Tıklanan Label: " & My_Label.Name
End Sub

Userformunuzun kod bölümüne aşağıdaki kodları uygulayınız. Eğer formunuzda daha fazla LABEL varsa ve bu işleme dahil olmayacaksa koda ekleme yapmak gerekecektir.

İlk önce boş bir excel dosyasında deneyip sonucu gözlemleyiniz. Sonra asıl dosyanıza uyarlarsınız..

C++:
Option Explicit
Private Labels As Collection

Private Sub UserForm_Initialize()
    Dim Ctrl As Control, My_Object As Class1
   
    Set Labels = New Collection
   
    For Each Ctrl In Me.Controls
        If TypeName(Ctrl) = "Label" Then
            Set My_Object = New Class1
            Set My_Object.My_Label = Ctrl
            Labels.Add My_Object
        End If
    Next
End Sub

Sub Bul(X As Label)
    MsgBox X.Name
End Sub
Verdiğiniz kod çalıştı. Fakat benim çalışmam frmDeneme.Mpdeneme.Pages(x) de (x =Pages numarası)
Kod sadece bu sayfalar için olmalı.
şimdi Multipage bastığımda clik olayı olan
x=frmDeneme.Mpdeneme.Value olayında "x" için hata verdi. Yani sayfalar arsı gezinme iptal olmuş oldu. Normalde çalışıyordu.
 
Asıl dosyanızın durumunu bilemediğimiz için verdiğiniz bilgiye göre basit bir örnek vermiştim. Mümkünse örnek dosyanızı paylaşın durum daha net anlaşılır.
 
Verdiğiniz kod çalıştı. Fakat benim çalışmam frmDeneme.Mpdeneme.Pages(x) de (x =Pages numarası)
Kod sadece bu sayfalar için olmalı.
şimdi Multipage bastığımda clik olayı olan
x=frmDeneme.Mpdeneme.Value olayında "x" için hata verdi. Yani sayfalar arsı gezinme iptal olmuş oldu. Normalde çalışıyordu.
for each döngüsünü çalıştığım sayfa için kurdum. Ama sayfalar arası gezinme iptal
Kod:
Private Sub MpKoordinatör_Click(ByVal Index As Long)
X = frmDeneme1.MpDeneme.Value
isim = frmDeneme1.MpDeneme.Pages(X).Caption
If isim = "Deneme1" Then
Adene
ElseIf isim = "Deneme2" Then
Bdene
ElseIf isim = "Deneme2" Then
Cdene
End If
End Sub
 
Aslında yapmak istediğim filtreleme. A yazan Labela bastığımda sayfada A ile başlayan kelimeler listelenecek. B yazan Labela bastığımda B ile başlayan kelimeler listelenecek.Makro ister kodla olsun ister filtreleme olsun; Bastığım Labelin caption ını görecek. ve Captiondaki A ya da B ye göre Listbox da listelemyi yapacak.
 
Aslında yapmak istediğim filtreleme. A yazan Labela bastığımda sayfada A ile başlayan kelimeler listelenecek. B yazan Labela bastığımda B ile başlayan kelimeler listelenecek.Makro ister kodla olsun ister filtreleme olsun; Bastığım Labelin caption ını görecek. ve Captiondaki A ya da B ye göre Listbox da listelemyi yapacak.
Yanlış bilmiyorsam; Labela bastığımızda setfocus durumunda oluyor. eğer öyleyse Sub daki makronun içine setfocus olan Labeli buldurabilir miyiz. Bu kesin çözüm olur. Tabii böyle bir şey varsa.
 
Yanlış bilmiyorsam Labela setfocus olmuyor zaten o nedenle activecontrol çalışmıyor. Ya düğme olmalı yada açılırkutu
Madem filtreleme yapılacak ilk harfe göre bence en mantıklısı açılırkutu
 
Metin kutusu da olabilir, böylece birkaç harfe göre de işlem yapılabilir
yada BUL yordamı Bul(xLbl As String) gibi parametreli olarak kullanılabilir.

Kod:
Private Sub Label2_Click()
xBul "Label2"
End Sub

Sub xBul(xLbl As String)
Debug.Print Controls(xLbl).Name, Controls(xLbl).Caption
End Sub
 
Son düzenleme:
Label yerine textbox kullanırsam nasıl bir kodumuz olur? (Hangi textboxa basarsam basayım, makro o textboxı bulacak ve ona göre çalışacak)
 
Geri
Üst