[VBA] Een vbModeless userform in een ander userform

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Beste mensen,

Ik heb een VBA userform dat ik toon door middel van: MyUserform1.Show vbModeless. Dit omdat het voor de werking van het sjabloon belangrijk is dat de gebruiker een bestaand Word document kan openen en hier wat text uit kopieëren.

Is moet ik eigenlijk vanuit het reeds geopende userform een nieuw userform openen dat ook vbModeless werkt. Dit lukt opzich wel, maar m'n muis is helemaal kwijt in het nieuwe geopende userform. Pas na een aantal keer Ctrl + Tab heb ik eindelijk m'n cursor en muis in het nieuwe userform.

Ik heb al heel wat dingen geprobeerd, bijvoorbeeld handmatig met een stukje code het nieuwe userform te activeren, maar dat veranderd niets aan de situatie. Kan iemand mij hiermee helpen?

Acties:
  • 0 Henk 'm!

Verwijderd

probeer eens met application.activate en daarna objectnaamnieuweuserform.activate

mogelijkerwijze werkt bovenstaand niet omdat de parent van nieuwe userform de reeds eerder geopende userform is. in dat geval zou je met de windows api de parent van de nieuwe userform kunnen instellen op de applicationhandle (niet zo vanzelfsprekend, maar het kan).

[ Voor 6% gewijzigd door Verwijderd op 14-02-2012 16:50 ]


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Sorry, dat ik dit oude topic weer even nieuw leven inblaas maar ik heb in de tussentijd een aantal dingen geprobeerd maar het probleem nog niet opgelost:

Wat niet werk is het volgende:

setFocus naar een object in het nieuwe userform, ik kan nu wel een textbox selecteren en typen, maar de muis is nog steeds weg (op de achtergrond ergens). Wanneer ik ALT + TAB doe en weer terugkeer naar het Userform werkt alles naar behoren.

application.activate methode werkt ook bij mij niet helaas

Ik heb geprobeerd een tempForm te maken dat over het nieuw geopende userform heen valt, na 5 milliseconden verdwijnt. Dit lukt wel, maar helaas lost het 't probleem niet op.

Meer suggesties?

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Hoe open je dat tweede userform? Ik vraag me af op het probleem niet ergens anders zit; ik kan het hier iig niet naspelen met twee simpele userforms.
Enne voor de goede orde: in welke vba host speelt het probleem zich af en welke versie is het?

[ Voor 24% gewijzigd door Lustucru op 23-03-2012 19:35 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Dit is de code die ik gebruik om het 2e userform te openen. Het 2e useform opent wanneer er in het 1e userform een textbox wordt aangeklikt. UserForm2 neemt de tekst van een label in UserForm1 over.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 

Private Sub TextBoxEvents_MouseDown(ByVal Button As Integer, _
    ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    With TextBoxEvents
    
        Dim associatedLab As String
        associatedLab = Replace(TextBoxEvents.name, "Text", "Lab")
         
        For Each Ctl In UserForm1.Controls
            If TypeOf Ctl Is MSForms.Label And Ctl.name = associatedLab Then
         
                UserForm2.Label = Ctl.Caption
                UserForm2.Caption = Ctl.Caption
                UserForm2.Textbox = TextBoxEvents.Text
                UserForm2.strTextbox = TextBoxEvents.name
                
            End If
        Next Ctl
        
    End With
    UserForm2.Show vbModeless
End Sub

Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Iemand nog een briljant idee?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Welke applicatie/versie?

De code ziet er wat onoverzichtelijk uit. Die With gebruik je niet en kan gewoon weg. Je zoekt een control op met een bepaalde naam, mij lijkt Controls(associatedLab) handiger. UserForm2.Textbox = TextBoxEvents.Text hoort/hoeft niet in die If, en is wat onoverzichtelijk gebruik van default properties. Dan doe je altijd een .show van UserForm2, ook als die als zichtbaar is. Dat betekend dat je niet zo makkelijk iets kan invoeren in die tekstbox.... En misschien wil je de boel zichtbaar maken zonder focus te switchen ofzo? ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

idd. :) En de vraag welke applicatie het is, is ook al eerder gesteld...

Anyway: ik vermoed dat dat het misgaat door het gebruik van het mousedown event om een ander formulier te openen. Ik kan me zo voorstellen dat de hostapplicatie het spoor bijster raakt welke control nuj precies de focus moet krijgen...

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Sorry de applicatie waar het om gaat is Word 2010.

With TextBoxEvents was inderdaad overbodig die heb er dus nu uitgehaald.

[ Voor 44% gewijzigd door Maarten Kroon op 03-05-2012 16:50 ]


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Lustucru schreef op zaterdag 28 april 2012 @ 11:09:
idd. :) En de vraag welke applicatie het is, is ook al eerder gesteld...

Anyway: ik vermoed dat dat het misgaat door het gebruik van het mousedown event om een ander formulier te openen. Ik kan me zo voorstellen dat de hostapplicatie het spoor bijster raakt welke control nuj precies de focus moet krijgen...
Hmm, ik wil het nieuwe userform openen zodra ik op een bepaalde textbox in het hoofdformulier klik. Deze textbox heeft een tag om 'm te onderscheiden van de gewone textboxen. Volgens mij is dit de enige manier.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, dit werkt zoals verwacht, enkel ik vermoed dat je de focus wil terugverplaatsen. Iets als:
Visual Basic:
20
21
22
23
24
25
    If Not UserForm2.Visible Then
        UserForm2.Show vbModeless
        AppActivate UserForm1.Caption
        TextBox2.SetFocus
        TextBox1.SetFocus
    End If

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Maarten Kroon schreef op donderdag 03 mei 2012 @ 16:59:
[...]
hmm, ik wil het nieuwe userform openen zodra ik op een bepaalde textbox in het hoofdformulier klik. Deze textbox heeft een tag om 'm te onderscheiden van de gewone textboxen. Volgens mij is dit de enige manier.
Het blijft raar en verschrikkelijk contraintuitief. Normaliter verwacht je dat een textbox de focus krijgt als je er op klikt zodat je de inhoud kunt bewerken. Jij zorgt ervoor dat er een ander formulier geopend wordt. Maw, om bij de tekstbox zelf te komen moet de gebruiker met de tab-toets werken?

Als het helemaal niet de bedoeling is dat de gebruiker de inhoud van de tekstbox bewerkt, waarom maak je er dan geen label van? Anyway, ik denk niet dat mousedown op een textbox goed zal gaan werken, maar labels, buttons, any control met een click-event werkt probleemloos.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
pedorus schreef op donderdag 03 mei 2012 @ 17:47:
Tsja, dit werkt zoals verwacht, enkel ik vermoed dat je de focus wil terugverplaatsen. Iets als:
Visual Basic:
20
21
22
23
24
25
    If Not UserForm2.Visible Then
        UserForm2.Show vbModeless
        AppActivate UserForm1.Caption
        TextBox2.SetFocus
        TextBox1.SetFocus
    End If
Helaas, dit werkt niet in mijn situatie, heb nu ongeveer alle combinaties van AppActivate en SetFocus geprobeerd, maar het probleem blijft aanwezig.

Acties:
  • 0 Henk 'm!

  • Maarten Kroon
  • Registratie: Maart 2006
  • Laatst online: 04-04 16:53
Lustucru schreef op donderdag 03 mei 2012 @ 18:15:
[...]


Het blijft raar en verschrikkelijk contraintuitief. Normaliter verwacht je dat een textbox de focus krijgt als je er op klikt zodat je de inhoud kunt bewerken. Jij zorgt ervoor dat er een ander formulier geopend wordt. Maw, om bij de tekstbox zelf te komen moet de gebruiker met de tab-toets werken?

Als het helemaal niet de bedoeling is dat de gebruiker de inhoud van de tekstbox bewerkt, waarom maak je er dan geen label van? Anyway, ik denk niet dat mousedown op een textbox goed zal gaan werken, maar labels, buttons, any control met een click-event werkt probleemloos.
Hmm, misschien moet dit op een andere manier mogelijk zijn. Ik wil namelijk het volgende:

Ik heb een userform met TextFields, nu moet er in deze TextFields heel veel text. Ik heb dus een aantal TextFields gemaakt die een nieuwe UserForm openen met een label, TextField, en 2 buttons. De gebruiker kan het (grote) TextField op dit nieuwe UserForm invullen en op de OK knop klikken. De text die in het TextField is ingevuld wordt naar het kleine TextField op UserForm1 gekopieerd.

Ik moet dus een manier hebben om deze kleine TextFields op UserForm1 voor de gebruiker prettig werkbaar te maken. Ivm. een beperkte resolutie op de pc's hier is het niet mogelijk om gewoon m'n dialoogvenster groter te maken.

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dan zou ik eerder aan het enter_event denken dan aan het click_event. Heb je het probleem meteen niet meer. Maar ipv een extra formulier te openen zou ik overwegen om bij het enter event de textbox te vergroten / te verplaatsen en bij het exit_event alles weer in oude staat te herstellen.

In het onderstaande voorbeeld maak ik gebruik van de control tag om de gewenste postie en grootte op te geven als de gebruiker het control binnengaat. Bv 10;10;190;300

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
'zet een type klaar om control gegevens tijdelijk op te slaan
Private Type controlBuffer
    c As Control
    top As Single
    left As Single
    width As Single
    height As Single
 End Type
'variabele op moduleniveau om controlgegevens in op te slaan
Dim cb As controlBuffer

Private Sub TextBox1_Enter()
    zoomin Me.TextBox1
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    zoomuit
End Sub

Sub zoomin(c As Control)
    Dim sizes() As String
    
    'sla huidige afmetingen op.
    Set cb.c = c
    cb.top = c.top
    cb.left = c.left
    cb.height = c.height
    cb.width = c.width

    'breng het control naar de voorgrond
    c.ZOrder
    'lees uit de tag de gewenste nieuwe positie en afmetingen
    sizes = Split(c.Tag, ";")
    c.top = sizes(0)
    c.left = sizes(1)
    c.width = sizes(2)
    c.height = sizes(3)
End Sub

Sub zoomuit()
   'herstel alles
    cb.c.top = cb.top
    cb.c.left = cb.left
    cb.c.height = cb.height
    cb.c.width = cb.width
    cb.c.ZOrder 1
End Sub

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1