Just nu i M3-nätverket
Jump to content

Mera problemas; combobox.additem


Micke_Sthlm

Recommended Posts

Stött på patrull igen, suck!

 

Lägger enligt vba-hjälpen och efter att ha läst exempel hos XL-dennis in följande i "allmänna + deklarationer" under det aktuella arbetsbladet;

 

Private Sub ComboBox1_DropButtonClick()

ComboBox1.DropDown

End Sub

 

 

Private Sub UserForm_Initialize()

ComboBox1.AddItem "Turkey"

ComboBox1.AddItem "Chicken"

ComboBox1.AddItem "Duck"

ComboBox1.AddItem "Goose"

ComboBox1.AddItem "Grouse"

End Sub

 

Har provat att lägga koden "överallt" under blad, arbetsbok och moduler...

 

men kan för mitt liv inte få fram listan i comboboxen när jag klickar på den!!!

 

Har till punkt och pricka följt instruktionerna i vb-hjälpen... men icke att det fungerar!!!

 

Tänker jag fel eller???

 

/Micke

 

Link to comment
Share on other sites

Ja, du. Det ser ju rätt ut. Undrar dock vad du menar med denna kod:

[color="#0000ff"]Private[/color] [color="#0000ff"]Sub[/color] ComboBox1_DropButtonClick()
ComboBox1.DropDown
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

kommandot DropDown öppnar dropdown menyn, precis det som automatiskt sker när du klickar på knappen under vars Event du skrivit in raden...

 

Men kan det tänka sig att ditt UserForm inte initialiseras om? Fast det borde det då VBA editorn borde märka av om ändrar i koden där... Fast för säkerthets skull kanske du ska köra en

Unload UserForm1 

(eller vad du kaller det)

 

Eller om du inom UserForm modulen:

Unload Me

 

 

och låt mig tipsa om en trevlig kod-hjälp:

[color="#0000ff"]Private[/color] [color="#0000ff"]Sub[/color] UserForm_[color="#0000ff"]Initialize[/color]()
    [color="#0000ff"]With[/color] Me.ComboBox1
        .AddItem [GRÅ]"Hej"[/GRÅ]
        .AddItem [GRÅ]"då"[/GRÅ]
        .AddItem [GRÅ]"lisa"[/GRÅ]
    [color="#0000ff"]End[/color] [color="#0000ff"]With[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

Ja - försäkerhets skull - nyttja ordet Me som hänvisar tillbaka till objektet du arbetar inom, dvs i detta fall ditt UserForm. Då är du säker på vad du accessar.

 

En bra debug är förövrigt att lägga in några

[color="#0000ff"]MsgBox[/color] [GRÅ]"Oj, nu är jag HÄR"[/GRÅ] 

rader på kritiska ställen i koden. Då är det enkelt att följa vad som händer i programmet.

Eller sätta brytpunkter, det går även bra det...

 

Edit:

Många små saker tillsammans blir något stort. Vad är det du bygger på?

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2005-12-14 21:24:59 av Monshi]

Link to comment
Share on other sites

Hej. Vet inte om jag förstår dig rätt, men OM jag fattar din post så vill du använda en ComboBox på excelbladet, inte i Ett VBA-formulär; eller?

 

Det finns 2 typer. Dels den som ingår i Excels formulärfunktion och dels den som egentligen är en kontroll till VBA-formulär/activeX (i princip finns det 3, om man räknar den som hör till verifiering också).

 

Hur har du infogat din Box? med:

Visa->verktygsfält ->formulär (excels)

eller

Visa->verktygsfält ->kontroller (VBA/activeX)

 

excels= kallas "Drop down" och ingår i shapes. heter någonting i stil med : ActiveSheet.Shapes("drop down x").

 

Använd en kod i den här stilen för att ta reda på namnet på din excel-kontroll:

 

[color="#0000ff"]Sub[/color] test()
[color="#0000ff"]Dim[/color] sak As Shape
    [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] sak [color="#0000ff"]In[/color] ActiveSheet.Shapes
        sak.[color="#0000ff"]Select[/color]
        [color="#0000ff"]MsgBox[/color] (sak.Name)
        [color="#006400"]'MsgBox (sak.Name & [GRÅ]"av Typ nr: "[/GRÅ] & sak.FormControlType)[/color]
    [color="#0000ff"]Next[/color] sak
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

VBA:s/aciveX = kallas Combobox och nås via :

ActiveSheet.ComboboxX

eller

ActiveSheet.OLEObjects.ComboboxX

 

Borde gå att bläddra med följande kod:

[color="#0000ff"]Sub[/color] blabla()
[color="#0000ff"]Dim[/color] sak As Variant
    [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] sak [color="#0000ff"]In[/color] ActiveSheet.OLEObjects
        [color="#0000ff"]MsgBox[/color] (sak.Name)
    [color="#0000ff"]Next[/color] sak
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

 

Om du vill använda händelser VBA/ActiveX kontrollen så "håller" den i sin egen kod. Dvs du går in i designläget (Visa->verktygsfält ->kontroller, designläge i vänstra hörnet). Sedan högerklickar du och väljer "visa kod". Då får du möjligheten att lägga in "ComboBox1_DropButtonClick()" osv.

 

Problemet är att den ligger i en "hållare" (shape) och jag blir inte klok på om något Form överhuvudtaget initialiseras.

 

Misstänker att det du hittat i hjälpen bara gäller om kontrollen ligger i en form, inte om den ligger på ett arbetsblad.

 

Hur tusan du skall trigga/fånga Initialize vet jag inte. Om den ligger i ett kalkylblad så vet jag inte om man kommer åt "formens" itialisering. Du kanske får lägga till värden när någon klickar? Typ:

 

[color="#0000ff"]Private[/color] [color="#0000ff"]Sub[/color] ComboBox1_DropButtonClick()
    ActiveSheet.ComboBox1.List = _
    [color="#0000ff"]Array[/color]([GRÅ]"Turkey"[/GRÅ], [GRÅ]"Chicken"[/GRÅ], [GRÅ]"Duck"[/GRÅ], [GRÅ]"Goose"[/GRÅ], [GRÅ]"Grouse"[/GRÅ])
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

(eller din AddItem variant)

 

 

Slutligen. Behöver du verkligen köra VBA? Excelvarianten av komboboxen har ju ett väldigt enkelt upplägg. högerklicka och välj formaterar kontroll. Du anger ett område på ett excelblad som innehåller alla värden du vill visa (indataområde) och du "dumpar" resultatet i en annan cell (celllänk).

 

Istället för att ha värdena i ett separat indataområde så skall det gå att lägga in en rad, men jag har alldeles glömt hur man gör...

"Turkey";"Chicken";"Duck";"Goose";"Grouse"

="Turkey";"Chicken";"Duck";"Goose";"Grouse"

="Turkey","Chicken","Duck","Goose","Grouse"

Turkey;Chicken;Duck;Goose;Grouse

ÄHHHHH om någon minns, hjälp... Misstänker att det är namngivna områden.

 

Link to comment
Share on other sites

Hej igen!

 

Tack för all hjälp! Var visst ute och cyklade angående vad egentligen userforms initialisering var. Lade man koden där den egentligen "hörde hemma" under tex Userform1 i VBA-editorn så fungerade den.

 

 

 

1. Håller på med ett beställnings "program" där man på blad 1 kan välja produkt, artikelnummer etc etc.

Vidare när man klickar på "knappen beställa" så ska man få signera beställningen som därefter dateras och läggs på ett annat blad.

Här summeras alla lagda beställningar och kan sedan exporteras eller skrivas ut och faxas direkt (hur den här biten ska fungera eller se ut exakt har jag inte bestämt, fyller nu på radvis)

 

2. Mitt nästa bekymmer blir den sk "signeringsrutinen" med "beställare" och lösenord

 

 

3. Mycket riktigt, jag vill lägga en combobox på arbetsbladet för att, förutom att välja från listan, även kunna skriva in, i det här fallet, en leverantör. Om beställaren skriver in en egen leverantör ska denne "promtas" att skriva in faxnummer.

 

Löste problemet såhär;

Lade in denna sub under "blad1"

 

Private Sub worksheet_open()

ComboBox1.Clear

ComboBox1.AddItem "Firma1"

ComboBox1.AddItem "Firma2"

ComboBox1.AddItem "Firma3" 'osv

End Sub

 

4. Egentligen skulle jag vilja ha ".additem" från en lista på ett arbetsblad som jag kallar "listor", där alla leverantörer ligger och där vem som helst lätt kan gå in och fylla på.

 

Detta är ju mycket enkelt att göra från "Formulär-combon", men har inte provat om det går från "kontroll-combon" i arbetsbladet.

 

Vet ni om det går att skriva tex .additem.list ("namn") eller något liknande?

 

5. Skulle för övrigt kunna få värdet direkt från en "formulär-combo" som jag även tänkt att använda;

 

vidare, om jag länkar en cell till combon kan jag lätt plocka värdet från cellen, vill dock helst inte ha några sådana rutor på arbetsbladen utan tex nå vädet såhär (KAN DOCK INTE FÅ TILL DEN HÄR KODRADEN);

 

let varde = ActiveSheet.Shapes("Drop Down 15") (.x) .Value

 

Använder jag bara value så blir det kodfel, men jag vet inte vad som ".x" ska vara???

 

Åter igen, tack för hjälpen!

 

Fler frågor lär komma...

 

/Micke

 

 

Link to comment
Share on other sites

1,2 Ingen kommentar

 

333333 och 444444444444444444444.

 

Antar att din lista ligger på Blad2 med en rubrik i första raden och leverantörsnamnen nedanför

 

Alternativ, om du använder .list istället (OBS! inte .additem.list). Lite märkligt eftersom hjälpen anger att man kan lägga till en endimentionell matris med hjälp av bara aditem.

[log]

[color="#0000ff"]Sub[/color] Utoka2()
[color="#0000ff"]Dim[/color] Lista As Range

[color="#0000ff"]Set[/color] Lista = Worksheets([GRÅ]"Blad2"[/GRÅ]).Range([GRÅ]"A2"[/GRÅ], _
Worksheets([GRÅ]"Blad2"[/GRÅ]).Range([GRÅ]"A2"[/GRÅ]).[color="#0000ff"]End[/color](xlDown))

Sheets([GRÅ]"blad1"[/GRÅ]).ComboBox1.List = Lista.Value
[color="#006400"]' behövs ingen clear[/color]

[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

XL down kan ge problem om det är för få företag i listan

Ett alternativ är att gå igenom listan steg för steg istället:

 

 

[color="#0000ff"]Sub[/color] UtokaListan()

Worksheets([GRÅ]"Blad2"[/GRÅ]).[color="#0000ff"]Select[/color]
Range([GRÅ]"A2"[/GRÅ]).[color="#0000ff"]Select[/color]

[color="#006400"]' Det är så dumt ordnat att du alltid _[/color]
[color="#006400"]' måste selecta, ?eller? aktivera en _[/color]
[color="#006400"]' sheet innan du kan selecta en cell, dumt.[/color]

Sheets([GRÅ]"blad1"[/GRÅ]).ComboBox1.Clear

[color="#0000ff"]Do[/color] Until IsEmpty(ActiveCell)
    Sheets([GRÅ]"blad1"[/GRÅ]).ComboBox1.AddItem _
     ActiveCell.Value
     ActiveCell.Offset(1, 0).[color="#0000ff"]Select[/color]
[color="#0000ff"]Loop[/color]
[color="#006400"]' skriver in värdet i varje cell och [/color]
[color="#006400"]' går ner ett snäpp ända tills den stöter på en tom cell[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

 

 

 

Hur skall du fånga upp att någon har skrivit i???

en variant är att försöka jämföra värdet vid "utgången" från Combon om värdet inte finns i listan så skall det läggas till och faxsnurran kall köras

 

[color="#0000ff"]Private[/color] [color="#0000ff"]Sub[/color] ComboBox1_LostFocus()
[color="#0000ff"]Dim[/color] foretag As Variant
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] foretag [color="#0000ff"]In[/color] Me.ComboBox1.List
    [color="#0000ff"]If[/color] foretag = Me.ComboBox1.Value [color="#0000ff"]Then[/color]
        [color="#0000ff"]Exit[/color] [color="#0000ff"]Sub[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color] foretag

annankod
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

 

[color="#0000ff"]Sub[/color] annankod()
[color="#0000ff"]Dim[/color] NyttForetag As Range
[color="#0000ff"]Dim[/color] FaxNummer As [color="#0000ff"]String[/color]

[color="#0000ff"]Set[/color] NyttForetag = Worksheets([GRÅ]"Blad2"[/GRÅ]).Range([GRÅ]"A2"[/GRÅ]).[color="#0000ff"]End[/color](xlDown).Offset(1, 0)
NyttForetag.Value = Sheets([GRÅ]"blad1"[/GRÅ]).ComboBox1.Value
FaxNummer = [color="#0000ff"]InputBox[/color]([GRÅ]"ange Faxnummer för företag"[/GRÅ] & NyttForetag.Value)
NyttForetag.Offset(0, 1).Value = FaxNummer
[color="#006400"]' obs antar att faxnumret till höger om firmanamnet. [/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

 

[/log]

 

5

[log]

 

Jag skrev a fel igår. Korrekt adressering för en excel kontroll är, håll i dig:

Worksheets(1).Shapes(1).ControlFormat

Dvs någonting i stil med

Sheets("blad1").Shapes("Drop Down 3").ControlFormat.Value

 

Ok, nu till det tråkiga. .value returnerar inte värdet, utan nummret på det du valt :-(

 

Om jag minns de javaSkript man skrev för några hundra år sen så fungerade det likadant, dvs du får använda numret för att tilldela värdet:

 

Set Kontroll = Sheets("blad1").Shapes("Drop Down 3").ControlFormat

Verkligt värde=Kontroll.List(Kontroll.ListIndex)

eller

Verkligt värde=Kontroll.List(Kontroll.value)

Samma sak om du vill skriva till:

Kontroll.List(Kontroll.value)=värde

Skumt? Jupp[/log]

 

Link to comment
Share on other sites

Stort TACK igen!!!

 

Många av mina problem är lösta för min första "Form1"-sida.

 

(Arbetsboken består för närvarande av tre Blad; "Form1" som är min inmatningssida, "Lista" där leverantörer, beställare etc ligger och "tabell", (bättre namn hade varit "sammanstallning") som kommer att innehålla alla beställningar, för utskrift och/eller export)

 

Blad1 etc använder jag i en parallell arbetsbok där jag testa rutinerna innan jag lägger in dom i den "skarpa"

 

Hade nog fått jobba hårt för att komma på;

 

".Shapes("Drop Down 3").ControlFormat.Value"

 

Nu kan jag instället för att "låsa upp" en cell-länk i "tabellbladet" använda värdet från formulär-combon direkt, PERFEKT!

 

Gammal rad;

 

Let L = Sheets("Tabell").Cells(1, 10).Value

 

Ny rad (efter dina tips);

 

Let L = Sheets("Form1").Shapes("Drop Down 15").ControlFormat.Value

 

MVH Micke

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...