Forfatter |
Emne Søg Emne funktioner
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Emne: Userform Sendt: 11.Maj.2015 kl. 08:51 |
Hej Jeg har et problem med denne userform1, den skal indsætte data i ark1. Men den kommer med følgende fejl: Compile error: Sub or Function not defined. uploads/1212/Bogføring.xlsm
|
Søren Hansen, anvender Excel 2007.
|
|
|
|
|
EXCELGAARD
Platin bruger
Medlem: 27.Dec.2012
Land: Denmark
Status: Offline
Point: 5419
|
Sendt: 11.Maj.2015 kl. 09:24 |
Du har lavet en stavefejl!
Du har skrevet 'RangeA' i stedet for 'Range' i makroen...
Du kan let finde sådanne fejl, hvis du vælger menu punktet 'Compile VBAProject' under 'Debug' menuen i VBA Editoren..
|
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 11.Maj.2015 kl. 13:54 |
EXCELGAARD skrev:
Du har lavet en stavefejl!
Du har skrevet 'RangeA' i stedet for 'Range' i makroen...
Du kan let finde sådanne fejl, hvis du vælger menu punktet 'Compile VBAProject' under 'Debug' menuen i VBA Editoren..
|
Ok, men selvom det er rettet kommer der en fejl. Se vedhæftet fil. uploads/1212/Bogføring_1.xlsm
|
Søren Hansen, anvender Excel 2007.
|
|
EXCELGAARD
Platin bruger
Medlem: 27.Dec.2012
Land: Denmark
Status: Offline
Point: 5419
|
Sendt: 11.Maj.2015 kl. 14:06 |
Øh, ja... selvfølgelig... Du skriver:
Cells(NyRække, 5).Value = Konto.Value |
...men, du har ingen tekstboks, der hedder 'Konto'. Den tekstboks, hvor du indtaster konto nummeret hedder 'TextBox1', så enten skal du omdøbe din tekstboks til at hedde 'Konto', eller også skal du ændre din kode til at benytte 'TextBox1' i stedet:
Cells(NyRække, 5).Value = TextBox1.Value |
Og, det samme med dine øvrige kontrolfelter i din UserForm, for øvrigt.
|
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 11.Maj.2015 kl. 14:18 |
EXCELGAARD skrev:
Øh, ja... selvfølgelig...
Du skriver:
Cells(NyRække, 5).Value = Konto.Value | ...men, du har ingen tekstboks, der hedder 'Konto'.
Den tekstboks, hvor du indtaster konto nummeret hedder 'TextBox1', så enten skal du omdøbe din tekstboks til at hedde 'Konto', eller også skal du ændre din kode til at benytte 'TextBox1' i stedet:
Cells(NyRække, 5).Value = TextBox1.Value | Og, det samme med dine øvrige kontrolfelter i din UserForm, for øvrigt.
|
Tak, nu faldt tiøren.
|
Søren Hansen, anvender Excel 2007.
|
|
EXCELGAARD
Platin bruger
Medlem: 27.Dec.2012
Land: Denmark
Status: Offline
Point: 5419
|
Sendt: 11.Maj.2015 kl. 14:22 |
Den faldt vist i 1-ører, hva'? Godt, du fik det til at virke
|
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 13.Maj.2015 kl. 08:23 |
Jo, nu går det fremad, men hvis jeg får indtastet en ny post og finder udaf at en tidligere skal slettes, hvad skal der så stå i koden?
|
Søren Hansen, anvender Excel 2007.
|
|
EXCELGAARD
Platin bruger
Medlem: 27.Dec.2012
Land: Denmark
Status: Offline
Point: 5419
|
Sendt: 13.Maj.2015 kl. 10:26 |
Soeren49 skrev:
hvis jeg får indtastet en ny post og finder ud af at en tidligere skal slettes, hvad skal der så stå i koden? |
Det må du forklare lidt nærmere???
|
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 13.Maj.2015 kl. 15:16 |
EXCELGAARD skrev:
Soeren49 skrev:
hvis jeg får indtastet en ny post og finder ud af at en tidligere skal slettes, hvad skal der så stå i koden? | Det må du forklare lidt nærmere???
|
Hvis jeg sletter i en række længere oppe, vil excel ikke efterfølgende indsætte en ny række. Et andet spørgsmål er hvad er koden til at resætte userform, når man har indtastet en post og trykket ok, så vil jeg gerne have rydet felterne så de er klar til en ny post.
|
Søren Hansen, anvender Excel 2007.
|
|
froksen
Sølv bruger
Medlem: 21.Maj.2011
Land: DK
Status: Offline
Point: 196
|
Sendt: 14.Maj.2015 kl. 10:14 |
Hej Søren
Til den første del du spørger om. Kunne du da lægge en opdateret version af dit ark ud? Det kan måske gøre det lettere at fejlfinde.
Til den sidste del, om hvordan man nulstiller felterne. Det kan gøres på mange måder. Nogle foretrækker, at sætte felternes værdi til "blanke". Altså efter du har trykket "Tilføj", da sættes
TextBox1.value="" TextBox2.value="" osv....
|
Dette kan naturligvis også lægges ind i en subrotine :-)
Andre foretrækker, at "unloade" og derefter åbne UserFormen igen. Det kan f.eks. gøres ved at tilføje følgende subrotine i din UserForms-codebase
Sub LukOgAabenUserform() 'Lukker UserFormen ned. Unload UserForm1
'Åbner den op igen. UserForm1.Show End Sub
|
Fordelen ved den første metode er, at den er hurtigere og lettere for dig at kontrollere hvilke formularfelter der rent faktisk skal nulstilles. Du har altså mere kontrol! Det er også lettere at fejlfinde :-)
Fordelen ved den anden metode er, at den er let og ALT vil blive nulstillet. Den fungere altså lidt ligesom, at du har lukket userformen ned og startet den op igen.
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 14.Maj.2015 kl. 19:51 |
froksen skrev:
Hej Søren
Til den første del du spørger om. Kunne du da lægge en opdateret version af dit ark ud? Det kan måske gøre det lettere at fejlfinde.
Til den sidste del, om hvordan man nulstiller felterne. Det kan gøres på mange måder. Nogle foretrækker, at sætte felternes værdi til "blanke". Altså efter du har trykket "Tilføj", da sættes
TextBox1.value="" TextBox2.value="" osv....
|
Dette kan naturligvis også lægges ind i en subrotine :-)
Andre foretrækker, at "unloade" og derefter åbne UserFormen igen. Det kan f.eks. gøres ved at tilføje følgende subrotine i din UserForms-codebase
Sub LukOgAabenUserform() 'Lukker UserFormen ned. Unload UserForm1
'Åbner den op igen. UserForm1.Show End Sub
|
Fordelen ved den første metode er, at den er hurtigere og lettere for dig at kontrollere hvilke formularfelter der rent faktisk skal nulstilles. Du har altså mere kontrol! Det er også lettere at fejlfinde :-)
Fordelen ved den anden metode er, at den er let og ALT vil blive nulstillet. Den fungere altså lidt ligesom, at du har lukket userformen ned og startet den op igen. |
Hej Den sidste version af filen er her: uploads/1212/Bogføring_2.xlsm. Hvordan laver du det som en subrutine?
|
Søren Hansen, anvender Excel 2007.
|
|
froksen
Sølv bruger
Medlem: 21.Maj.2011
Land: DK
Status: Offline
Point: 196
|
Sendt: 15.Maj.2015 kl. 08:18 |
Hej
Først og fremmest. En Subrutine eller Subroutine (som det vidst hedder rigtigt, min fejl :-)) er en af VBA´s måder at lave "metoder/funktioner" på. Det er altså groft sagt, alle de steder hvor du har skrevet:
"Sub" er en forkortelse af Subroutine :-)
Dernæst til dit problem. Jeg har forsøgt at løse dit problem ved at indføre en ID-kolonne. Denne kolonne _skal_ udfyldes, da det er her regnearket finder ud af hvad den næste frie celle er. Uanset hvad, siger min erfaring, at det altid er godt, at have et unikt ID på sine optegnelser. Hvis du engang skal lave en "søge" eller "opslagsfunktion", da er ID´et næsten uunværligt :-)
Jeg har ændret lidt i dine variabler og UserFormFeltnavne. Desuden har jeg fået din "Initialize" funktion til at virke :-)
Koden i arket er her, men se også det vedhæftede ark. Håber det kan bruges.
'Subroutinen hedder altid UserForm_Initialize uanset hvad du har navnet userformen :-) Private Sub UserForm_Initialize() 'Tilføjer Kontonummerne til Comboxen With cmbKonto .AddItem ("1000") .AddItem ("1050") End With 'Sætter Standardteksterne tbDato.Value = "dd-mm-åååå" tbTekst.Value = "Hvad er der købt!" tbUdgift.Value = "" tbIndtaegt.Value = "" End Sub
Private Sub btnAfslut_Click() 'Afslutter UserFormen Unload Me End Sub
Private Sub cmbTilføj_Click() Dim NuvarrendeMaksId As Integer Dim NytId As Integer Dim NyCelle As Range
'Aktiverer Hovedarket. "shHovedArk" er arkets kodenavn, som jeg har givet det. Det gør, at du kan ændre teksten/navnet på arket som brugeren ser uden at det påvirker koden. Smart :-) shHovedArk.Activate 'Lidt tjek af data inden vi fortsætter If Not cmbKonto.ListIndex > -1 Then MsgBox "Du skal vælge en konto", vbOKOnly + vbCritical, "Fejl" Exit Sub End If If Not IsDate(tbDato.Value) Then MsgBox "Du skal skrive en gyldig dato. Format: dd-mm-åååå", vbOKOnly + vbCritical, "Fejl" Exit Sub End If If Not IsNumeric(tbIndtaegt.Value) Or Not IsNumeric(tbUdgift.Value) Then MsgBox "Indtægter og udgifter skal være tal", vbOKOnly + vbCritical, "Fejl" Exit Sub End If 'Finder ud af hvad den nuværrende maksimale værdi af ID er. NuvarrendeMaksId = WorksheetFunction.Max(Range("A:A")) 'Sætter det nye ID NytId = NuvarrendeMaksId + 1 'Finder ud af hvad den næste frie celle er, hvor der skal stå ID. Set NyCelle = Range("A9999").End(xlUp).Offset(1, 0) 'Skriver værdierne. Offset-Funktionen skal læses som. Tag cellen NyCelle, og gå 0-rækker til højre og hhv. 0,1,2,3,4,5 kolonner til højre. NyCelle.Offset(0, 0).Value = NytId NyCelle.Offset(0, 1).Value = cmbKonto.Value NyCelle.Offset(0, 2).Value = tbDato.Value NyCelle.Offset(0, 3).Value = tbTekst.Value NyCelle.Offset(0, 4).Value = tbUdgift.Value NyCelle.Offset(0, 5).Value = tbIndtaegt.Value 'Til respons MsgBox "Tilføjet ny bon", vbOKOnly + vbInformation, "Tilføjet" 'Gøres når alt overstående er gennemkørt NulstilAlleFelter End Sub
Private Sub NulstilAlleFelter() cmbKonto.ListIndex = -1 ' Nulstiller comboboxen. Hvis sættes til 0, da vælges det første item i listen, 1 vælges det 2. item osv.
'Nulstiller alle felter tbDato.Value = "dd-mm-åååå" tbTekst.Value = "Hvad er der købt!" tbUdgift.Value = "" tbIndtaegt.Value = "" End Sub
|
|
|
froksen
Sølv bruger
Medlem: 21.Maj.2011
Land: DK
Status: Offline
Point: 196
|
Sendt: 18.Maj.2015 kl. 16:49 |
Fik du det til at virke? :-)
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 19.Maj.2015 kl. 09:06 |
froksen skrev:
Fik du det til at virke? :-) |
Ja, men jeg tænker på at udvide det se fil uploads/1212/Bogføring-ny.xlsm. Har du et bud på hvordan jeg får userform ændret sådan, at jeg kan vælge hvilken bank konto, der skal bogføres på? Jeg har endvidere problemmer med denne formel =HVIS(ELLER(F4="0";E4="0");"";SUM(F4-E4)+G3). Saldo cellen skulle gerne være blank, hvis der ikke står noget i udgift eller indtægt celen. Man kan jo godt stille spørgsmål til hvad jeg nu vil med sådan et ark, men det overordnet mål er at lave data udtræk i form af en privot tabel. Men det kommer senere.
|
Søren Hansen, anvender Excel 2007.
|
|
froksen
Sølv bruger
Medlem: 21.Maj.2011
Land: DK
Status: Offline
Point: 196
|
Sendt: 19.Maj.2015 kl. 17:50 |
Vedr. formlen, da har jeg fået det til at virke med følgende:
=HVIS(ELLER(IKKE(ER.TOM(F6));IKKE(ER.TOM(E6)));(F6-E6)+G5;"") |
Hvis du vil have trukket dine data ud i en pivottabel efterfølgende, da skal du _ikke_ stille dine data op på den måde du har gjort. Det er vigtigt, at du opfatter dine indtastninger som data/registeringer, altså et sæt data pr. række - altså groft sagt ingen formatering/beregning (eller så lidt som muligt).
Se evt. nemprogrammerings video om pivot: http://www.nemprogrammering.dk/Tutorials/excel/12-pivottabeller.php
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 20.Maj.2015 kl. 16:22 |
froksen skrev:
Vedr. formlen, da har jeg fået det til at virke med følgende:
=HVIS(ELLER(IKKE(ER.TOM(F6));IKKE(ER.TOM(E6)));(F6-E6)+G5;"") |
Hvis du vil have trukket dine data ud i en pivottabel efterfølgende, da skal du _ikke_ stille dine data op på den måde du har gjort. Det er vigtigt, at du opfatter dine indtastninger som data/registeringer, altså et sæt data pr. række - altså groft sagt ingen formatering/beregning (eller så lidt som muligt).
Se evt. nemprogrammerings video om pivot: http://www.nemprogrammering.dk/Tutorials/excel/12-pivottabeller.php
|
Nu virker det med formlen. Er der andre måder man kan udtrække data på, end pivottabel?
|
Søren Hansen, anvender Excel 2007.
|
|
froksen
Sølv bruger
Medlem: 21.Maj.2011
Land: DK
Status: Offline
Point: 196
|
Sendt: 20.Maj.2015 kl. 19:45 |
Hej Søren
Det jeg mente var, at du bare skulle stille dine data op anderledes. Jeg har vedhæftet et lille eksempel. Jeg har dog ikke tilpasset formularen eller ligende, men bare så du kan se hvordan man kunne gøre. uploads/271/Bogføring-ny_2.xlsm
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 20.Maj.2015 kl. 20:51 |
froksen skrev:
Hej Søren
Det jeg mente var, at du bare skulle stille dine data op anderledes. Jeg har vedhæftet et lille eksempel. Jeg har dog ikke tilpasset formularen eller ligende, men bare så du kan se hvordan man kunne gøre. uploads/271/Bogføring-ny_2.xlsm
|
Ja, det giver da mening. Jeg prøver at ændre userform sådan at indtastningen bliver lettere.
|
Søren Hansen, anvender Excel 2007.
|
|
Soeren49
Sølv bruger
Medlem: 14.Aug.2014
Land: Danmark
Status: Offline
Point: 105
|
Sendt: 21.Maj.2015 kl. 08:47 |
Kan man lave userform sådan at comBoxen (Konto) henter data fra et ark via lopslag? Dette ark kan evt. hedde kontoPlan. På dette ark skal der være 2 kolonner, foreksempel kan kolone A indeholde (1050) og kolonne B indeholder forklaring til værdien i celle/kolonne A. KontoPlanen vil komme til at indeholde flere rækker end der er vis nedenstående.
Kontonr. |
Beskrivelse |
1000 |
indtægt |
1050 |
køb |
|
Søren Hansen, anvender Excel 2007.
|
|
froksen
Sølv bruger
Medlem: 21.Maj.2011
Land: DK
Status: Offline
Point: 196
|
Sendt: 25.Maj.2015 kl. 13:02 |
Hej Søren
Jeg har også tilpasset din "UserForm_Initialize" funktion, så den får alle kontonr. med der står i arket "kontoPlan"
Herunder koden
Private Function findKontonavn(kontonr As Long) As String Dim rng As Range 'finder ud af hvor kontonr. står Set rng = Ark2.Range("A:A").Find(What:=kontonr, lookat:=xlWhole) 'Tjekker om der rent faktisk blev fundet noget If Not rng Is Nothing Then 'Retunerer værdien fra cellen ved siden af (altså beskrivelsen) findKontonavn = rng.Offset(0, 1).Value Else 'Hvis der ikke bliver fundet noget MsgBox "Der blev ikke fundet nogen konto, med kontonr " & kontonr, vbOKOnly + vbCritical, "Ingen konto fundet" findKontonavn = vbNullString Exit Function End If End Function
Private Sub cmbKonto_Change() 'Sætter teksten til label. lblKontonavn.Caption = findKontonavn(cmbKonto.Value) End Sub
|
Den nye "UserForm_Initialize"
'Subroutinen hedder altid UserForm_Initialize uanset hvad du har navnet userformen :-) Private Sub UserForm_Initialize() Dim kontonr As Variant
'Tilføjer Kontonummerne til Comboxen. Tilføjer alle de kontonr. som står i arket kontoPlan For Each kontonr In Ark2.Range("A2", Ark2.Range("A2").End(xlDown)) cmbKonto.AddItem kontonr Next kontonr 'Sætter Standardteksterne tbDato.Value = "" tbTekst.Value = "Hvad er der købt!" tbUdgift.Value = "" tbIndtaegt.Value = "" End Sub
|
|
|