06. august 2010 - 14:11Der 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
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.
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)
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:
- 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)
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:
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??)
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:
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)
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.