IT Fjernundervisning

VBA kode

Beskrivelse

VBA kode omkring userforms

Det sidste vi mangler at lave omkring userforms er at kode hændelsesprocedurer, så der også kommer til at ske noger når brugeren trykker på knappen.

Hændelsesprocedure til knap

Hvis man dobbeltklikker på en knap i en userform bliver der oprettet en hændelsesprocedure til knappen. Det ser sådan her ud (når knappen hedder opret):

Excel VBA kursus - userform hændelsesprocedure - fjernundervisning

I hændelsesproceduren kan du skrive al den VBA kode du har lært. De kontrolelementer der er på userformen er objekter, der kan adresseres med deres navn. Findes der en tekstbox på userformen, der hedder txtNavn kan indholdet trækkes ud og afleveres i regnearket med koden:

Range("A1").Value = txtNavn.Value

Og på samme måde kan man også hente værdier ud af de øvrige kontrolelementer. Dog er det lidt specielt, hvis man skal hente værdier ud af en listbox, hvor multiselect egenskaben er sat true - så kan brugeren jo vælge flere elementer i listen. Her følger lidt kode, der kan bruges som inspiration for det tilfælde:

For i = 0 To ListBox1.ListCount - 1   If ListBox1.Selected(i) = True Then     MsgBox ListBox1.List(i, 0)   End If Next 

Hændelsesprocedurer på userformen selv

I toppen af arbejdsvinduet er der to dropdown bokse. Vælger man UserForm i den første kan man vælge forskellige hændelsesprocedurer i den anden.

Excel VBA kursus - userform eventhandler - fjernundervisning

Initilize hændelsesprocedurern kan bruges til at få kode afviklet når UserFormen bliver vist første gang - det kunne f.eks. være at fylde indhold på en dropdownkontrol. Det kunne se sådan her ud (forudsat dropdownkontrollen hedder cboGruppe)

Private Sub UserForm_Initialize()   cboGruppe.AddItem "Vælg gruppe"   cboGruppe.AddItem "PC"   cboGruppe.AddItem "Skærm"   cboGruppe.ListIndex = 0 End Sub

Hændelsesprocedurer på de øvrige kontrolelementer (datavalidering)

De enkelte kontrolelementer har også hændelsesprocedurer, der f.eks. kan bruges til at validere de data brugeren indtaster/vælger. Vælg kontrollen i venstre dropdownkontrol og Exit i den højre - så får du den viste hændelsesprocedure:

Excel VBA kursus - userform validering - fjernundervisning

Bemærk, at der overføres en parameter Cancel, der kan bruges til at styre om brugeren må komme videre. Det kan bruges til validering - det kunne se sådan her ud:

Private Sub txtAntal_Exit(ByVal Cancel As MSForms.ReturnBoolean)   If Not IsNumeric(txtAntal.Value) Then     MsgBox "Her skal du skrive et tal"      Cancel = True    End If End Sub

Luk userform

Når du gerne vil lukke userformen efter brugeren har indtastet de ønskede informationer og du har placeret dem i regnearket skriver du

Unload Me

 


Øvelse

Download dette regneark og opret denne userform

Sørg for at de informationer brugeren indtaster i userformen bliver tilføjet i bunden af datasættet. Opret validering på felterne, så der kommer fornuftige informationer ind i datasættet.

Ekstraopgave

Kan du skrive kode, så userformen automatisk foreslår det næste fakturanummer i rækken?


Løsning

Se mit løsningsforslag her.

Koden til userformen følger her:

Private Sub butOpret_Click()     Range("A1").End(xlDown).Offset(1, 0).Value = txtFakturanummer.Value     Range("B1").End(xlDown).Offset(1, 0).Value = txtDato.Value     Range("E1").End(xlDown).Offset(1, 0).Value = cboSælger.Value     Range("F1").End(xlDown).Offset(1, 0).Value = cboGruppe.Value     Range("H1").End(xlDown).Offset(1, 0).Value = txtStykpris.Value     Range("I1").End(xlDown).Offset(1, 0).Value = txtAntal.Value     Range("I1").End(xlDown).Offset(0, 1).Value = chkFaktureret.Value     If optBud Then         levering = "Bud"     Else         levering = "Post"     End If     Range("I1").End(xlDown).Offset(0, 2).Value = levering     Unload Me End Sub
Private Sub txtAntal_Exit(ByVal Cancel As MSForms.ReturnBoolean)     If Not IsNumeric(txtAntal.Value) Then         MsgBox "Du skal skrive et tal!"         Cancel = True     End If End Sub
Private Sub txtDato_Exit(ByVal Cancel As MSForms.ReturnBoolean)     If Not IsDate(txtDato.Value) Then         MsgBox "Du skal skrive en dato!"         Cancel = True     End If End Sub
Private Sub txtStykpris_Exit(ByVal Cancel As MSForms.ReturnBoolean)     If Not IsNumeric(txtStykpris.Value) Then         MsgBox "Du skal skrive et tal!"         Cancel = True     End If End Sub
Private Sub UserForm_Activate()     Range("A1", Range("A1").End(xlToRight).End(xlDown)).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes     nummer = Range("A1").End(xlDown).Value     txtFakturanummer.Value = nummer + 1 End Sub

Brug for hjælp til VBA, VSTO eller SQL?

Scient Data tilbyder professionel IT-konsulentbistand

Kontakt Scient Data →