• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Voorkomen van _Change event bij leeg maken Combobox.

Status
Niet open voor verdere reacties.

Andre175

Gebruiker
Lid geworden
2 feb 2018
Berichten
351
goedemorgen


In een Form heb ik meerdere tekstboxen en een combobox staan.
Wanneer er een keuze gemaakt wordt dmv de combobox, worden de tekstboxen ingevuld.
Indien de tekstbox Datum leeg is, komt er een kalender in beeld om een datum te kiezen.
Code:
Private Sub CbDebiteur_Change()
    Converteren
'   NIEUW FAKTUURNR INVULLEN
    TbFaktNrOut.value = Sheets("Fakturen_Overzicht").Range("G2").value
    
   If TbDatumFakOut.value = vbNullString Then
        datevariable = CalendarForm.GetDate( _
        DateFontSize:=10, _
        ShowWeekNumbers:=False, _
        SubHeaderColor:=RGB(238, 238, 238), _
        SubHeaderFontColor:=RGB(0, 0, 0), _
        DateHoverColor:=RGB(192, 192, 192), _
        TodayFontColor:=RGB(192, 0, 0), _
        PositionTop:=(105), _
        PositionLeft:=(20))
        If datevariable <> 0 Then TbDatumFakOut.value = datevariable
    End If
        
'   TEXTBOXEN MET GEGEVENS VULLEN
    With Sheets("Debiteuren")
        For i = 2 To .Range("C" & Rows.Count).End(xlUp).Row
            If Sheets("Debiteuren").Cells(i, 3) = CbDebiteur.List(CbDebiteur.ListIndex, 0) Then
                Me("TbTavFakOut") = .Cells(i, 8).value
                Me("TbMailFakOut") = .Cells(i, 9).value
                Me("TbNaamFakOut") = .Cells(i, 3).value
                Me("TbAdresFakOut") = .Cells(i, 4).value
                Me("TbHuisnrFakOut") = .Cells(i, 5).value
                Me("TbPostcodeFakOut") = .Cells(i, 6).value
                Me("TbPlaatsFakOut") = .Cells(i, 7).value
                Me("TbDebiteurnrFakOut") = .Cells(i, 2).value
            End If
        Next
    End With
    TbOmschr1.SetFocus
End Sub

De comandoknop "Reset" moet alle boxen leeg maken zonder iets op te slaan. (zodat er dus een blanco formulier zichtbaar is)

Code:
Private Sub CmdbReset_Click()
'   ALLE TXT EN COMBOBOXEN LEEG MAKEN
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        Select Case TypeName(ctrl)
            Case "TextBox", "ComboBox": ctrl.value = ""
        End Select
    Next ctrl

            
    Call UserForm_Initialize
'
End Sub

In principe werkt het, echter door het leegmaken van CbDebiteur treedt het event CbDebiteur_Change() op.
En komt dus de kalender naar voren.


Is er een mogelijkheid om het event "CbDebiteur_Change()" (tijdelijk) buiten werking te zetten wanneer de Reset knop wordt gebruikt ?



Andrë
 
zo?
Code:
Private Sub CmdbReset_Click()
'   ALLE TXT EN COMBOBOXEN LEEG MAKEN

Application.EnableEvents = False
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        Select Case TypeName(ctrl)
            Case "TextBox", "ComboBox": ctrl.Value = ""
        End Select
    Next ctrl

Application.EnableEvents = True

    Call UserForm_Initialize
'
End Sub
 
Ik weet er niet veel van maar als je code eens met F8 doorloop,
zie je misschien waar het fout gaat.
 
Vervang Private Sub CbDebiteur_Change() door Private Sub CbDebiteur_Click()
 
:thumb:
dat werkt.

dat ik daar zelf niet op kwam....

iig bedankt maar weer.


André
 
Setfocus is overbodig als je de tabvolgorde van de 'controls' goed instelt.

zo vaak lezen uit een werkblad is geen handige aanpak:

Code:
sn= Sheets("Debiteuren").rows(CbDebiteur.ListIndex).specialcells(2)
Me("TbTavFakOut") = sn(1, 8)
Me("TbMailFakOut") = sn(1, 9)
Me("TbNaamFakOut") = sn(1, 3)
Me("TbAdresFakOut") = sn(1, 4)
Me("TbHuisnrFakOut") = sn(1, 5)
Me("TbPostcodeFakOut") = sn(1, 6)
Me("TbPlaatsFakOut") = sn(1, 7)
Me("TbDebiteurnrFakOut") = sn(1, 2)

en met een handiger naamgeving van de controls kan dit ook nog in een simpele lus plaatsvinden.
 
Ik geef toe dat er nog wel het 1 en ander verbeterd kan worden.... en dat ga ik ook zeker doen.
Ik had niet gedacht dat dit bestand zo uitgebreid ging worden.... kreeg de smaak te pakken... steeds weer nieuwe ideeën.
Het zal zeker wel geoptimaliseerd moeten worden, dus alle tips zijn welkom.

Code:
sn= Sheets("Debiteuren").rows(CbDebiteur.ListIndex).specialcells(2)
for j = 2 to 9
Me("TbFakOut" & j) = sn(1, j)
next j

Als dit dus zo in een lus gezet wordt, werkt het dan sneller?


PS....
als ik de code zo doe, krijg ik......
bij keuze 1 uit keuzelijst een ERROR
bij keuze 2 uit keuzelijst de kopteksten van de tabel
 
Laatst bewerkt:
Code:
if CbDebiteur.ListIndex>-1 then 
  sn= Sheets("Debiteuren").rows(CbDebiteur.ListIndex+2)

  for j = 2 to 9
     Me("TbFakOut" & j) = sn(1, j)
  next
End if

NB. Gebuik inspringing om de code beter leesbaar te maken.
 
oke.

dit werkt idd wel.

wat is nu dan het verschil tussen
sn= Sheets("Debiteuren").rows(CbDebiteur.ListIndex).specialcells(2) en
sn= Sheets("Debiteuren").rows(CbDebiteur.ListIndex+2)

met andere woorden.... wat doet "specialcells(2)"?
 
Cruciaal is hier: +2
De ondergrens van een listbox of combobox =0 (zoals het hoort in een 10-tallig stelsel).
specialcells kun je opzoeken in de hulpfunktie van de VBEditor ( ook hier F1 )
 
Bedankt tot zover....

ga dit ff proefondervindelijk uit proberen.

Ik zal vast nog wel een keer met een andere vraag terug komen.



Prettige dag verders.... en tot een volgende ronde.


Thanks, André
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan