23. februar 2008 - 09:12Der 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?
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).
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?
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.
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?
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.
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.
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.
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.
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.