Focus terugzetten

Status
Niet open voor verdere reacties.
Dat stukje code weet helemaal niks van de variabele Cancel en zal daar ook niets mee doen. Cancel is een parameter van een Event macro. Waar je bij het gebruik van SetFocus op moet letten is dat van het actieve object het Exit event in werking treedt en van het object dat focus krijgt het Enter event. Daardoor kan je al heel gauw de weg kwijt raken. Zeker als in die Events ook weer ergens SetFocus opdrachten worden gebruikt. Mijn advies: Haal alle SetFocus opdrachten weg en handel de controles op de juiste wijze in de juiste events af.
 
Laatst bewerkt:
Dan gaat de plaatsing denk ik alhier toch plaatsvinden. Het is inderdaad het stukje Setfocus wat weer een ander probleem kan geven. Ik heb alleen wel bij bijvoorbeeld de Combobox een focus geplaats om de tekst in de box te selecteren.

Onderstaand staat in de "algemene" sub StandaardWaarden

Code:
     With ComboBox1
        For i = 11 To Sheets.Count
            ComboBox1.AddItem Sheets(i).Name
        Next
        
        .Value = strCombo1
        .SelStart = 0
        .SelLength = Len(.Value)
        .SetFocus
    End With

Doe ik dat niet dan wordt er niet volledig geselecteerd en dit vind plaats in een "Algemene" Private Sub.

Zodra er dan een keuze is gemaakt in ComboBox dan wordt via:

Code:
Private Sub ComboBox1_Click()
    TextBox2.SetFocus
    
End Sub

De focus weer verschoven naar Textbox2, maar dat kan ik denk ik weer in de instellingen van AutoTab van Combobox1 bewerken.

Ik ga eens kijken of ik toch nog iets over het hoofd zie. Heb er wel 1 en ander uit weten te halen en anders kunnen onderbrengen.
 
Laatst bewerkt:
Dat is een voorbeeld van hoe je SetFocus wel kan gebruiken, zolang je binnen hetzelfde object blijft. Maar ik zou het alleen gebruiken als je een reden hebt om de tekst in de combobox te highlighten.
 
vooruit dan maar:

Code:
sub M_snb()
  for each sh in sheets
    c00=c00 & "|" & sh.name
  next

  with combobox1
    .list=split(mid(c00,2),"|")
    .listindex=0
  end with
End Sub
 
Ik ben nu op het ogenblik het stukje in een Exit te plaatsen van de Combobox. Kijken hoe dat uitpakt. Dit omdat de SetFocus wordt aangesproken zodra ik de Resetknop heb aangeklikt.

Hiermee kan ik ook weer voorkomen, zolang de waarde strCombo1, de rest niet toegankelijk is en sla ik daar in ieder geval wel weer een ander probleem mee uit de wind.
 
Ik zou overal de SetFocus weghalen en zaken op een andere wijze regelen, maar dat moge inmiddels duidelijk zijn. Kijk ook even naar het stukje dat snb plaatste in #44 voor het highlighten van een waarde in een combobox zonder SetFocus te gebruiken.
 
Snb ???? Dank je, maar wat doe jij daar dan met die worksheets? Volgens mij begin jij ergens bij het eerste sheet, terwijl er vanaf Sheet 11 gestart moet worden.
 
Het is maar een voorbeeldje van een combobox met alle bladnamen van een document als waarden. Dit voorbeeld kan je uiteraard eenvoudig aan je eigen waarden per combobox aanpassen.
 
Laatst bewerkt:
Ik krijg hem eerlijk gezegd ook niet geplaatst en daarbij wordt de inhoud dan alsnog niet gehighlight, maar dat zal aan overige instellingen of Events liggen.
 
Als dit al niet lukt, zou ik toch eerst maar eens met de basis van VBA beginnen. Dit wordt anders een gebed zonder eind.
In VBA bestaat er geen sheet 11. Het indexnummer van een werkblad is vluchtig.
 
Snb. Als je goed leest, zeg ik ook dat het dan aan overige instellingen zal kunnen liggen. Dat lukt mij heus wel.

In VBA zal er geen Sheet 11 bestaan, maar met mijn code begin ik wel vanaf Sheet 11 te tellen. Daarmee beweer ik niet dat jij ongelijk hebt. Tevens heb ik het vluchtige gedrag nog niet meegemaakt van de index tenzij er ineens tussen door bladen worden toegevoegd of worden verschoven. En dat is iets wat jij met jouw code weer zal opvangen, maar in plaats van mij af te vallen, kun je of niets antwoorden of daarin dan een oplossing geven.

Gezien het feit dat ik op het moment best aardig zaken zelfstandig voor elkaar krijg, want het is maar een deel wat er hier op het forum staat, vind ik dat ik aardig op weg ben. Ik ben jou niet en jij bent mij niet. Zo zijn wij allen verschillend en leren wij ieder op ons eigen manier. Of moet ik jou bijvoorbeeld de NEN1010 etc maar gaan voordragen terwijl jij wellicht weer een schijntje basis kent van elektrotechniek. Wat ik hier mee wil zeggen is dat het afgeven op elkaars kunnen en kennis niet echt bevorderlijk werkt.
Elkaar helpen werkt ook in een leerproces. Daarbij is de ene goed in theorie en niet in de praktijk of omgekeerd of juist in beide goed. En misschien val jij wel met dit in de laatste categorie. Dat heb ik namelijk met mijn vak.
 
Laatst bewerkt:
Even nog terugkomend op deze topic.

Probleem opgelost op 1 klein puntje na.

Voor bovenstaand probleem op gebied van het SetFocus probleem. Dit kwam omdat tijdens het klikken op Reset alle textboxen werden geleegd en er in een tweetal textboxen een waarde werd ingevoerd. Hier werd dan de focus weer teruggezet en kreeg ik het probleem. Dit opgelost via het gebruikt van een checkbox en deze te verbergen. De waarde gaat op True zodra de de Reset wordt aangeklikt en daarna wordt alles gewist. Het op False zetten gaat weer via sub StandaardWaarde die ook met de Reset wordt aangeroepen.

Code:
Private Sub TextBox7_Enter()                 'Nog verwerken in de Exit
    TextBox7.Value = Left(Year(Date), 2)
    SendKeys "{RIGHT}"

End Sub

Private Sub TextBox7_Change()
    If Not CheckBox2 Then Call Nummeriek
    
    If Len(TextBox7) < 2 Or TextBox7 = vbNullString Then 'Zorgen dat de defaultwaarde niet kan worden gewist
        If Not CheckBox2 Then TextBox7_Enter
    End If
        
End Sub

Private Sub TextBox7_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Exit_TextBox Cancel
    
End Sub

Alle TextBox Exit en Change events gaan nu naar 1 sub. Dit om niet overal hetzelfde te moeten typen.

Code:
Private Sub Nummeriek()
    If TypeName(activecontrol) = "TextBox" Then
        
        With activecontrol
            If Not IsNumeric(.Value) And .Value <> vbNullString Then
                MsgBox strMsgbox4, vbInformation, strMsgBoxTitle
                .Value = Left(.Value, Len(.Value) - 1) 'Laatst ingevoerde waarde in de actieve TextBox wissen
            End If
        End With
    End If
    
End Sub

Private Sub Exit_TextBox(Optional ByVal Cancel As MSForms.ReturnBoolean)
    Dim tb As MSForms.textbox
    Set tb = activecontrol
    
    If CheckBox2 Then Cancel = False: Exit Sub
    
    With activecontrol
        If .Value = vbNullString Then Cancel = True: Exit Sub
        
        If .Name = "TextBox2" Or .Name = "TextBox5" Then
            If .Value < 1 Or .Value > 31 Then
                MsgBox strMsgBox1, vbInformation, strMsgBoxTitle
                .Value = vbNullString
                Cancel = True
            End If
        End If
        
        If .Name = "TextBox3" Or .Name = "TextBox6" Then
            If .Value < 1 Or .Value > 12 Then
                MsgBox strMsgBox2, vbInformation, strMsgBoxTitle
                .Value = vbNullString
                Cancel = True
            End If
        End If
        
        If .Name = "TextBox4" Or .Name = "TextBox7" Then
            If Len(.Value) = 2 Then Cancel = True: Exit Sub
            If Len(.Value) = 3 Then
                MsgBox strMsgBox3, vbInformation, strMsgBoxTitle
                Cancel = True
            End If
        End If
    End With
    
    tb.Value = Format(tb.Value, "00")
    
End Sub


Edmoor, of een ander. Dit gebruik van Active Control heb ik nog niet heel veel gedaan. Het werkt wel, maar als jullie het willen nazien en een eventuele correctie hier hebben aub. Voel je vrij. Kan ik enkel maar van leren.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan