Avatar billede hubertus Seniormester
23. februar 2008 - 09:12 Der er 11 kommentarer og
1 løsning

Userform - overførsel af info om optionsboxe mellem to userforms

Jeg har 5 optionsbutton samlet i en frame - i en userfom, hvor jeg i forbindelse med en søgning åbner en anden form..I den form, som jeg anvender til søgning, har jeg brug for at kende indstillingen i framen med de 5 optionsbuttons. Hvordan får jeg den oplysning med over i den nye form?
Avatar billede word-hajen Nybegynder
23. februar 2008 - 10:23 #1
Placér følgende på form nr. 2:
*************************
Private m_blnChoice1 As Boolean
Private m_blnChoice2 As Boolean
Private m_blnChoice3 As Boolean
Private m_blnChoice4 As Boolean
Private m_blnChoice5 As Boolean

Public Property Get Choice1() As Boolean
    Choice1 = m_blnChoice1
End Property

Public Property Let Choice1(ByVal blnChoice1 As Boolean)
    m_blnChoice1 = blnChoice1
End Property

Public Property Get Choice2() As Boolean
    Choice2 = m_blnChoice2
End Property

Public Property Let Choice2(ByVal blnChoice2 As Boolean)
    m_blnChoice2 = blnChoice2
End Property

Public Property Get Choice3() As Boolean
    Choice3 = m_blnChoice3
End Property

Public Property Let Choice3(ByVal blnChoice3 As Boolean)
    m_blnChoice3 = blnChoice3
End Property

Public Property Get Choice4() As Boolean
    Choice4 = m_blnChoice4
End Property

Public Property Let Choice4(ByVal blnChoice4 As Boolean)
    m_blnChoice4 = blnChoice4
End Property

Public Property Get Choice5() As Boolean
    Choice5 = m_blnChoice5
End Property

Public Property Let Choice5(ByVal blnChoice5 As Boolean)
    m_blnChoice5 = blnChoice5
End Property
****************************

Det gør, at du kan sætte true/false på form nr. 2 i forhold til, hvad der er valgt på form nr. 1, hvor du placerer følgende kode som "kald" til form 2:

************************
    Dim objForm2 As UserForm2
   
    Set objForm2 = New UserForm2
   
    With objForm2
        .Choice1 = Me.OptionButton1
        .Choice2 = Me.OptionButton2
        .Choice3 = Me.OptionButton3
        .Choice4 = Me.OptionButton4
        .Choice5 = Me.OptionButton5
        .Show
    End With
   
    Set objForm2 = Nothing
***************

Ved at lave en ny instans af form 2 på form 1 i stedet for blot af loade form 2 derfra, har du adgang til de forskellige controller osv. på form 2. Nu ved jeg ikke, hvordan form 2 skal bruges oplysningerne fra form 1, så det er muligt, at du kan bruge dem direkte i stedet for at erklære et "helt sæt" af variabler.

Vær i øvrigt opmærksom på, at de ting, som du "sætter" ved kald af form 2, reelt først er tilgængelige i Activate-eventet og ikke Initialize-eventet (Initialize-eventet fyres af i samme øjeblik, du laver formen (ny instans), hvorimod Activate-eventet fyres i luften i det øjeblik, at formen bliver vist).
Avatar billede hubertus Seniormester
24. februar 2008 - 09:16 #2
Formålet med userform2 er, at brugeren skal søge i eksisterende data, som er fordelt på forskellige sheets. Med valget i optionsbuttons på userform1, vælger navnet på den som skal søges, samt hvilket ark der skal søges i, derfor har jeg brug for at få overført deles navnet, disse valg. Kan det ikke gøres via en variabel?
Avatar billede hubertus Seniormester
24. februar 2008 - 10:15 #3
Jeg har lige nogle afklarende spørgsmål til din kode:

1. Skal erklæringen: Private m_blnChoice1 As Boolean ikke havde været
  dim m_blnChoice1 As Boolean? og placeres i toppen af koden?

2. Skal linien: Public Property Let Choice1(ByVal blnChoice1 As Boolean)forstås
  således, at værdien i choice1 lægges over i blnChoice1?

3. Når userform2 kaldes på den måde, så er userform1 stadig i hukommelsen, og de
  værdier, som evt. er indtastet i userform1 intakte?

sidste spørgsmål blot for fremtidig brug.
mvh. Hubertus.
Avatar billede word-hajen Nybegynder
24. februar 2008 - 10:40 #4
1. Nej. Hvis du erklærer din boolean på den måde, er den tilgængelig alle steder i dit projekt, og det skal den ikke være. Den skal kun være tilgængelig i forbindelse med formen. Jo (hvor jeg har placeret den).

2. Jeg ved ikke lige, hvad du mener. Men du har 2 funktioner for hver private erklæret variable - 1, der skriver til variable og 1, der henter værdien fra variablen.

3. Ja.
*********************
Med din yderligere kommentar 09:16:37 kunne det se ud til, at du reelt ikke har behov for at få overført værdien fra dine optionbuttons, men den tekst, der står i dem (havde været lidt rart at vide inden).

Bør dine optionbuttons være en listbox i stedet for? Hvis du reelt ikke har behov for værdien true/false, men en tekststreng i stedet, lyder det til at en listbox er det rigtige.

Jo, du kan godt overføre tekststrenge i stedet. Så skal du slette al koden omkring de booleans, som jeg har angivet og i stedet følge samme procedure for at oprette en string-variabel.
Avatar billede hubertus Seniormester
24. februar 2008 - 11:58 #5
hej igen - tak for dine kommentarer.
Jeg har i mellemtiden læst noget om objekter, så jeg har nu styr på 1, 2 og  3. Grunden til at jeg har optionbuttons i userform1 er, at her har jeg brug for true/false, det har jeg ikke i userform2, her skal jeg blot bruge resultatet, som i mit tilfælde er hvis f.eks. optionbutton3 er true, så skal søgningen foregå på et bestemt sheet. tilsvarende for de andre knapper.
Hvordan skal koden se ud hvis jeg vil overføre valget i mon optionbutton, som en tekststreng?
Avatar billede word-hajen Nybegynder
24. februar 2008 - 12:35 #6
Så skal du erklære en private string-variabel og lave de 2 Property Get/Let på samme måde som jeg har gjort med dine booleans. Derefter er det nemt at tilgå din "form-variabel" fra form 1.
Avatar billede hubertus Seniormester
24. februar 2008 - 14:10 #7
Kan den laves simplere?

userform1

Private Sub CommandButton1_Click()
    Dim var As String
       
    If Me.OptionButton1 = True Then var = "AAA"
    If Me.OptionButton2 = True Then var = "BBB"
    If Me.OptionButton3 = True Then var = "CCC"
     
  Dim objForm2 As New UserForm2
 
    With objForm2 ' procedurekald til userform2.
        .streng = var
        .Show
    End With
     
    Set objForm2 = Nothing
End Sub

Userform2
Private pstreng As String

Public Property Get streng() As String
    streng = pstreng
End Property

Public Property Let streng(værdi As String)
    pstreng = værdi
End Property

Private Sub UserForm_Activate()
  txtbox1 = streng
End Sub

mvh. Hubertus
Avatar billede word-hajen Nybegynder
24. februar 2008 - 19:48 #8
Kode på form 1:
*********
    Dim objForm2 As UserForm2
   
    Set objForm2 = New UserForm2
   
    Select Case True
        Me.OptionButton1
            objForm2.SheetName = "AAA"
        Me.OptionButton2
            objForm2.SheetName = "BBB"
        Me.OptionButton3
            objForm2.SheetName = "CCC"
    End Select
   
    objForm.Show
   
    Set objForm2 = Nothing
***********

Et par råd omkring navngivning:
- streng siger ikke ret meget om, hvad den variabel rent faktisk indeholder/bør indeholde (umiddelbart så det ud til for mig at du skulle bruge værdierne til at søge på et specifikt ark - derfor har jeg navngivet det med SheetName; du er selvfølgelig velkommen til at lave det om)
- at erklære en string med en var som navngivning kan være forvirrende, idet var normalt bruges til variabler af typen Variant

Tilbage til dine optionbuttons - som det ser ud for mig, ville jeg stadig have brugt en listbox og ikke optionbuttons.
Avatar billede hubertus Seniormester
24. februar 2008 - 21:59 #9
Det er også korrekt, at jeg skal bruge værdien til at søge i et specefikt ark. Den værdi overfører jeg via variablen var. Men din måde at navngive på er meget mere sigende, og den vil jeg selvfølgelig tage til mig. Jeg er stadig en novice inden for dette område, men øvelse gør mester.
Det er korrekt i forhold til min brug af optionsbuttons at jeg i denne situation kunne have anvendt en listebox - men det gælder kun i forhold til userform2. Når det gælder userform1, så ser verden anderledes ud.

Opgaven er løst, så jeg vil gerne sige tak for din indsats, den har været meget lærerrigt for mig. :O))

Lægger du et svar?

ps. Jeg laver lige et nyt sprøgsmål med nogle flere point - du har ærligt fortjent dem - og endnu engang tak for hjælpen.
Avatar billede hubertus Seniormester
24. februar 2008 - 22:01 #10
Hvordan ser userform2 ud i forhold til din kommentar 19:48?
Avatar billede word-hajen Nybegynder
24. februar 2008 - 22:26 #11
Option Explicit
Private m_strSheetName As String

Public Property Get SheetName() As String
    SheetName = m_strSheetName
End Property

Public Property Let SheetName(ByVal strSheetName As String)
    m_strSheetName = strSheetName
End Property
***************
Der findes et ret godt værktøj til at lave ovenstående - MZ Tools, som er et add-in til vba. http://www.mztools.com/v3/mztools3.aspx

Hvis du installerer det, kan du ved at bruge funktionen Add procedure (4. knap fra venstre), få lavet disse Get/Let inkl. erklæring af variabler nemt og hurtigt.
Avatar billede vejmand Juniormester
25. februar 2008 - 06:57 #12
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester