Avatar billede rene_andersen Nybegynder
06. august 2010 - 14:11 Der er 8 kommentarer og
1 løsning

If sætning - hvis en af 12 måneder OK, ellers FEJL

Hej

Jeg har lavet en kommando-knap i Excel der skal bruges til at opdatere en given periodes salg. Når brugeren trykker på knappen bliver vedkommende bedt om at indtaste den måned der skal opdateres. Jeg vil gerne at dette bliver valideret og hvis det er en gyldig måned opdateres denne måneds fane. Hvis det er forkert indtastet, skal der gives en besked herom..

Dette kan jeg sådan set godt finde ud af, men jeg vil meget gerne undgå at skulle skrive 12 If og ElseIf sætninger, så jeg håber at der er nogen der har en løsning til denne problemstilling i stil med nedenstående:

If Måned = {"januar", "februar", "marts", "april", osv.} Then
    OK - Call koden..
    Else: MsgBox "Ugyldig måned"
    Exit Sub
End If
Avatar billede janmanden Nybegynder
06. august 2010 - 15:09 #1
Hvorfor overhovedet give brugeren mulighed for at taste noget, når du bare kunne lave en liste eller kombinationsboks med alle månederne?
Avatar billede Ialocin Novice
08. august 2010 - 22:30 #2
Hej Rene


Kan følgende evt. bruges:

Jeg har lavet en comboboks (cboMåneder) på Sheet1.

Og i ThisWorkbook´s Open_hændelse har jeg følgende kode, som fylder comboboksen med årets 12 måneder:


Private Sub Workbook_Open()

    With Sheet1.cboMåneder
       
        .AddItem ("Januar")
        .AddItem ("Februar")
        .AddItem ("Marts")
        .AddItem ("April")
        .AddItem ("Maj")
        .AddItem ("Juni")
        .AddItem ("Juli")
        .AddItem ("August")
        .AddItem ("September")
        .AddItem ("Oktober")
        .AddItem ("November")
        .AddItem ("December")
   
    End With

End Sub


Samtidig har jeg følgende kode i comboboksens Change_hændelse:


Private Sub cboMåneder_Change()
Dim måned As String


måned = Me.cboMåneder.Value


    Select Case måned
   
        Case "Januar"
       
            'Opdater januar fanebladet
           
        Case "Februar"
       
            'Opdater februar fanebladet
           
        Case "Marts"
       
            'osv .............
           
        Case "April"
           
        Case "Maj"
           
        Case "Juni"
           
        Case "Juli"
           
        Case "August"
           
        Case "September"
           
        Case "Oktober"
           
        Case "November"
       
        Case "December"
           
    End Select

End Sub



Under hver Case kan du så placere din kode, som opdaterer de respektive faneblade.


Alternativt:
Du kan evt. flytte din "opdateringskode" over i en selvstændig procedure, som du så kalder fra comboboksens Change_hændelse med valget fra comboboksen som argument.

Håber det gi´r mening ?? ... ellers giv lyd :o)

mvh Nicolai
Avatar billede rene_andersen Nybegynder
10. august 2010 - 12:22 #3
Hey

Tak for input og det lyder som en god idé med at lave en liste/kombinationsboks med de tilgængelige valgmuligheder..

Men jeg har ikke rigtig brugt disse før, så har brug for lidt hjælp til hvorledes man gør dette - og muligheden skal helst først komme frem når man trykker på knappen "Opdater", da filen først og fremmest brugest til at indtaste og bearbejde data og kun lejlighedsvis til at danne rapporter på disse data (via kommando-knappen "Opdater)
Avatar billede Ialocin Novice
10. august 2010 - 14:52 #4
Hej Rene

Forsøger mig lige, at forklare mig skriftligt :o)

I Excel:
- åbn Excelfilen
- find fanebladet med din knap
- gå i "design mode" ... ikonet med blå linial og blyant
- dobbeltklik på din knap el. tast ALT + F11 for at komme til VBA

I VBA editoren ... opretter du en ny Userform:
- tast CTRL + R for at åbne projekt exploreren
- højreklik i projekt exploreren og vælg "Insert ... UserForm"
- højreklik på din nye UserForm og vælg properties
- i (Name) feltet døber du formen:  frmMåneder
- i Caption feltet finder du selv på en overskrift til formen

I VBA editoren ... opretter du en combobox på din nye Userform:
- via Toolboxen trækker du en Combobox ind på din nye form 
- i comboboxens (Name) felt døber du den: cboMåneder

Og så til koderne:
- dobbeltklik på din nye combobox
- i kodevinduets liste, øverst til højre ændres hændelsen til "Click"
- kopier følgende kode, som fanger den valgte måned på comboboxen, ind i din nye click_hændelse:



Dim måned As String

måned = Me.cboMåneder.Value


    Select Case måned
   
        Case "Januar"
       
            'Opdater januar fanebladet
           
                       
        Case "Februar"
               
            'Opdater februar fanebladet
                                   
        Case "Marts"
       
            'osv .............
           
        Case "April"
           
        Case "Maj"
           
        Case "Juni"
                   
        Case "Juli"
           
        Case "August"
                             
        Case "September"
           
        Case "Oktober"
           
        Case "November"
       
        Case "December"
           
    End Select
     

    'skjul formen
    frmMåneder.Hide

----------------------------------------------------

Som skrevet tidligere kan du nu, under hver Case, placere din kode, som opdaterer de respektive faneblade.

Og på Dansk.
Det du vil ha´ skal ske når der klikkes "Januar" ligger du ind under Case "Januar" ... osv.



Nu til den sidste kodestump:

- Din knap skal nu åbne din nye form og fylde comboboxen med månederne, derfor kopierer du følgende kode ind i knappens Click_hændelse:



    'fyld comboboksen med årets måneder
    With frmMåneder.cboMåneder
       
        .AddItem ("Januar")
        .AddItem ("Februar")
        .AddItem ("Marts")
        .AddItem ("April")
        .AddItem ("Maj")
        .AddItem ("Juni")
        .AddItem ("Juli")
        .AddItem ("August")
        .AddItem ("September")
        .AddItem ("Oktober")
        .AddItem ("November")
        .AddItem ("December")
   
    End With
   
   
    'sæt januar som default værdi
    frmMåneder.cboMåneder.ListIndex = 0
   
    'skjul formularen
    frmMåneder.Show
   
   
----------------------------------------------------------

- Når alt er kopieret ind, gemmes og lukkes VBA editoren.
- gå ud af "design mode" ... ikonet med blå linial og blyant
- gem Excelfilen
- klik på knappen og se hvad der sker ?

Håber det gi´r mening ?? ... ellers giv endelig lyd :o)


Mvh Nicolai
Avatar billede Ialocin Novice
10. august 2010 - 15:12 #5
Hej Rene

Alle veje fører til Rom :o)
Det kan faktisk også laves lidt simplere ...

Jeg har tilføjet 2 linier til koder fra min første kommentar, hvilket gør, at comboboksen er usynlig indtil der bliver trykket på knappen.
Efter et klik ¨på en måned, gøres boksen usynlig igen.


Gør som i min første kommentar og udskift koderne til:

-----------------------------------



Private Sub Workbook_Open()

    With Sheet1.cboMåneder
       
        .AddItem ("Januar")
        .AddItem ("Februar")
        .AddItem ("Marts")
        .AddItem ("April")
        .AddItem ("Maj")
        .AddItem ("Juni")
        .AddItem ("Juli")
        .AddItem ("August")
        .AddItem ("September")
        .AddItem ("Oktober")
        .AddItem ("November")
        .AddItem ("December")
       
        'skjul comboboksen
        .Visible = False
   
    End With

End Sub


------------------------------------------


Private Sub cmdOpdater_Click()
   
    'synliggør comboboksen
    Me.cboMåneder.Visible = True

End Sub


-------------------------------------------


Private Sub cboMåneder_Click()
Dim måned As String


måned = Me.cboMåneder.Value


    Select Case måned
   
        Case "Januar"
       
            'Opdater januar fanebladet
           
        Case "Februar"
       
            'Opdater februar fanebladet
           
        Case "Marts"
       
            'osv .............
           
        Case "April"
           
        Case "Maj"
           
        Case "Juni"
       
           
        Case "Juli"
           
        Case "August"
                             
        Case "September"
           
        Case "Oktober"
           
        Case "November"
       
        Case "December"
           
    End Select
   
    'usynliggør comboboksen
    Me.cboMåneder.Visible = False

End Sub


---------------------------------------------



mvh Nicolai
Avatar billede rene_andersen Nybegynder
11. august 2010 - 09:33 #6
Hej Nicolai

Det er fa*** smart med den formular der kaldes frem når man trykker på kommandoknappen og forsvinder igen når koden er kørt..

Jeg var dog lidt træt af, at jeg skulle dobbeltklikke på måneden i listen for at kalde koden (måske jeg gjorde noget forkert?), men det løste jeg ved at indsætte en OK-kommandoknap til at kalde koden når man har valgt måneden..

Men nu fungerer det også præcis som det skal - så hvis du smider et svar skal du få dine points!!

Dog må du meget gerne lige forklare hvad fidusen ved at bruge "Me." foran forskellige koder er..? Jeg troede jeg havde okay styr på selve VBA-delen men det udtryk har jeg ikke set før og kan ikke helt gennemskue hvorfor det er smart at bruge.

Eksempelvis:
Me.cboMåneder.Visible = False
(Kunne det ikke bare være cboMåneder.Visible = False??)
Avatar billede Ialocin Novice
11. august 2010 - 10:17 #7
Hej Rene

Det er sjovt ... i mit eksempelark virker formularen med comboboksen på et klik ??

Er du sikker på, at du ikke er kommet til at skrive comboboksens kode i dens dobbeltklikhændelse ???


Og med hensyn til ME ...
Så vil det virke, som du selv skriver :o)

Det er lidt "dovenskab" fra min side, men det er også en hjælp til mig selv, at bruge ME.

I dit eksempel: cboMåneder.Visible = False

Skal du taste hele ordet "cboMåneder" , og korrekt for at det efterfølgende virker !!
Når jeg bruger Me og taster . (punktum), så dukker de tilgængelige objekter på Me objektet (det aktive objekt!) op på en liste, hvorfra jeg så "bare" kan vælge uden at skulle tænke over at taste objektnavnet rigtigt!

Det er vist det der i VBA kaldes for Intellisense ?


Jeg har sakset VBA´s hjælpetekst omkring det reservered ord ME:

The Me keyword behaves like an implicitly declared variable. It is automatically available to every procedure in a class module. When a class can have more than one instance, Me provides a way to refer to the specific instance of the class where the code is executing. Using Me is particularly useful for passing information about the currently executing instance of a class to a procedure in another module. For example, suppose you have the following procedure in a module:

Sub ChangeFormColor(FormName As Form)
    FormName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
End Sub

You can call this procedure and pass the current instance of the Form class as an argument using the following statement:

ChangeFormColor Me



Med venlig hilsen, Nicolai :o)
Avatar billede rene_andersen Nybegynder
11. august 2010 - 11:20 #8
Hej Nicolai

Okay, det lyder sq meget smart. Det kunne være jeg skulle begynde at bruge den "funktionalitet" også - foretrækker også den dovne model og når det så samtidig øger sikkerheden for at skrive det rigtige objekt-navn er det jo ren win-win :o)

Men tusind tak for hjælpen med dette problem - jeg har allerede fundet en 2-3 andre steder jeg overvejer at skifte koden og indsætte en UserForm med en combobox :o)

Mvh
René
Avatar billede Ialocin Novice
11. august 2010 - 11:58 #9
Hej René

Det var så lidt, selv tak :o)


Mvh Nicolai
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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