• DİKKAT

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

Userform içinde çalışan kodun fonksiyon çağrılınca çalışmaması

  • Konbuyu başlatan Konbuyu başlatan oweoweo
  • Başlangıç tarihi Başlangıç tarihi
Katılım
8 Aralık 2013
Mesajlar
9
Excel Vers. ve Dili
2016 Türkçe
Userform içinde textboxları otomatik temizleyen bir döngü kurdum, sorunsuz çalışıyor. Ancak bunu temizle() fonksiyonu içine alıp çağırdığımda fuction not defined hatası alıyorum. 1 saattir uğraşıyorum hatamı bulamadım. Yardımcı olabilen var mı?
Kod:
Option Explicit

Private Sub btKaydet_Click()
Dim i As Integer


Sheets("Sayfa3").Select
Rows("2:2").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    
For i = 1 To 4          ' BOXLARDAN SIRAYLA VERİ ÇEKME
Sheets("Sayfa3").Cells(2, i).Value = Controls("box" & i)
Next i

'Temizle (4)

For k = 1 To 4          ' BOXLARIN İÇİNİ TEMİZLEME USERFORM İÇİNDE ÇALIŞIYOR
Controls("box" & k) = ""
Next k

Bu da çalışmayan modül içindeki kod:

End Sub

Kod:
Option Explicit

Function Temizle(box_sayisi As Integer)
Dim k As Integer

For k = 1 To box_sayisi
Controls("box" & k).Value = ""

Next k

End Function
 
Sanki UserForm1.Controls("box" & k) ......... falan gibi birşey işe yarar gibi geldi bana.

.
 
Teşekkür ederim işe yaradı ancak; bu fonksiyonun bütün userformlarda çalışmasını istersem başına ne yazmam gerekir? Yani Userform1 yerine içinde bulunduğun userform diye birşey yazamam mı?
 
Ekte örnek bir dosya hazırladım, incelersiniz....

.
 
Çok daha kolay bir şekilde Me.Controls("box" & k) gibi bir şeyle hallolur sanmıştım. Sebebini anlamadığım bir şekilde invalid use of me hatası veriyor.
 
"Me" sadece UserForm modülünde kullanılabilir, standart veya class modüllerinde kullanılamaz...

.
 
Benzer bir alternatif..

Boş bir modüle;

C++:
Option Explicit

Sub Clear_Controls(Current_Form As Object)
    Dim My_Ctrl As Control
    
    For Each My_Ctrl In Current_Form.Controls
        If TypeName(My_Ctrl) = "TextBox" Then
            My_Ctrl.Value = ""
        ElseIf TypeName(My_Ctrl) = "ComboBox" Then
            My_Ctrl.Value = ""
        ElseIf TypeName(My_Ctrl) = "CheckBox" Then
            My_Ctrl.Value = False
        ElseIf TypeName(My_Ctrl) = "OptionButton" Then
            My_Ctrl.Value = False
        ElseIf TypeName(My_Ctrl) = "ListBox" Then
            My_Ctrl.Clear
        End If
    Next
End Sub

Aşağıdaki kodu formlarınızdaki temizleme butonuna ekleyiniz.

C++:
Private Sub CommandButton1_Click()
    Clear_Controls Me
End Sub
 
Alternatif olarak, 4 No'lu mesajdaki kodların yerine aşağıdakiler de kullanılabilir;

UserForm modülü:

C#:
Private Sub CommandButton1_Click()
    Call myProc(4, Me)
End Sub




Module1 içindeki kodlar:

C#:
Sub myProc(iCount As Integer, Form As UserForm)
    Dim i As Integer
 
    For i = 1 To iCount
        Form.Controls("TextBox" & i) = ""
    Next
End Sub


.
 
Benzer bir alternatif..

Boş bir modüle;

C++:
Option Explicit

Sub Clear_Controls(Current_Form As Object)
    Dim My_Ctrl As Control
   
    For Each My_Ctrl In Current_Form.Controls
        If TypeName(My_Ctrl) = "TextBox" Then
            My_Ctrl.Value = ""
        ElseIf TypeName(My_Ctrl) = "ComboBox" Then
            My_Ctrl.Value = ""
        ElseIf TypeName(My_Ctrl) = "CheckBox" Then
            My_Ctrl.Value = False
        ElseIf TypeName(My_Ctrl) = "OptionButton" Then
            My_Ctrl.Value = False
        ElseIf TypeName(My_Ctrl) = "ListBox" Then
            My_Ctrl.Clear
        End If
    Next
End Sub

Aşağıdaki kodu formlarınızdaki temizleme butonuna ekleyiniz.

C++:
Private Sub CommandButton1_Click()
    Clear_Controls Me
End Sub

Merhaba,
CommandButton'a yazılacak komutu KTF da olduğu gibi parametreli yazıp istediğimiz öğenin temizlenmesini sağlayabilir miyiz?
 
Verdiğimiz önerilerin neresi sizi tatmin etmedi..

Kafanızdan geçen kurguyu paylaşırsanız belki alternatif çözümler gelebilir..
 
Sayın @Korhan Ayhan,
Galiba yanlış anlaşıldım. Verdiğiniz kodlar son derece tatmin edici. Benzer kodları buradan öğrenmiştim ama farklı tiplerdeki nesneleri(TextBox, ListBox ...) temizlerken ayrı prosedürler yazıyordum. Sizin kodların hepsini birden temizlediğini görünce aklıma şöyle bir fikir geldi.
Kod:
Private Sub CommandButton1_Click()
    Clear_Controls Me
End Sub
kodunda nasıl bir değişiklik yapmalıyım ki, Sub Clear_Controls(Current_Form As Object) prosedürü benim istediğim nesneyi temizlesin. (Sadece TextBox, sadece ListBox gibi) Birkaç deneme yaptım ama olmadı.
Saygılar.
 
Sadece TextBox için;

C++:
Option Explicit

Sub Clear_Controls(Current_Form As Object)
    Dim My_Ctrl As Control
    
    For Each My_Ctrl In Current_Form.Controls
        If TypeName(My_Ctrl) = "TextBox" Then My_Ctrl.Value = ""
    Next
End Sub
 
@Korhan Ayhan hocamın kodunu aşağıdaki gibi düzenleyip dener misiniz?
Kod:
Sub Clear_Controls(Current_Form As Object, Optional ByVal xTur As String)
Dim My_Ctrl As Control, xTurT As String
        For Each My_Ctrl In Current_Form.Controls
        If xTur = "" Then xTurT = TypeName(My_Ctrl) Else xTurT = xTur
            If TypeName(My_Ctrl) = "TextBox" And xTurT = "TextBox" Then
                My_Ctrl.Value = ""
            ElseIf TypeName(My_Ctrl) = "ComboBox" And xTurT = "ComboBox" Then
                My_Ctrl.Value = ""
            ElseIf TypeName(My_Ctrl) = "CheckBox" And xTurT = "CheckBox" Then
                My_Ctrl.Value = False
            ElseIf TypeName(My_Ctrl) = "OptionButton" And xTurT = "OptionButton" Then
                My_Ctrl.Value = False
            ElseIf TypeName(My_Ctrl) = "ListBox" And xTurT = "ListBox" Then
                My_Ctrl.Clear
            End If
        Next

End Sub

tümünü temizlemek isterseniz Clear_Controls Me
belli bir türü temizlemek isterseni me den sonra virgül ekleyip tür adını girebilirsiniz
mesela OptionButton düğmelerini silmek için Me, "OptionButton"
Kod:
Clear_Controls Me, "OptionButton"
mesela ListBox düğmelerini silmek için Me, "ListBox " gibi
Kod:
Clear_Controls Me, "ListBox"
 
aklıma gelmişken sorayım; listbox ile comboboxın temizlenmesinden kastınız tam olarak nedir?
değer seçilmiş ise seçimin devre dışı bırakılması mı yoksa liste içeriklerinin tamamen boşaltılması mı?
 
Sayın @haliliyas,
Yanıt için teşekkürler.
Sayın @Korhan Ayhan 'ın #7 numaralı mesajını görünce aklıma Kullanıcı Tanımlı Fonksiyon(KTF) gibi bir uygulama yapılabilir mi? sorusu geldi. Amacım öğrenmekti. Biraz uğraştım ama yapamadım. Sizin koddaki " ... Optional ByVal ... ) " ifadesini yazmayı beceremedim. Şimdi olayı anladım. Bir kez daha teşekkür ederim.
Bu arada, ListBox'u temizlemek için kullanılan My_Ctrl.Clear ifadesi ListBox1.RowSource = "Sayfa1!A1:A12" şeklinde doldurulan ListBox'ta hata veriyor. (AddItem yöntemini denemedim) Bunun yerine My_Ctrl.RowSource = "" ifadesini kullanarak sorunu çözdüm.
 
rica ederim
iyi çalışmalar
 
Geri
Üst