Avatar billede JAHT Nybegynder
15. juli 2011 - 10:34 Der er 26 kommentarer og
1 løsning

Ændre / Slet data via Userform

Hej....
Jeg har en Userform, som laver et opslagt på nogle værdier som jeg har i et ark. Jeg vil høre om der er mulighed for, at man kan ændre de værdier som bliver opslået eller slette dem. Det er nok lidt nemmer at forklare det vha. et eksempel.

Kode op opslagsfunktionen:

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

Dim counter As Integer
Dim curcell As Range 

Application.ScreenUpdating = False

    For counter = 2 To Sheets("Køb").Range("A65536").End(xlUp).row
        Set curcell = Worksheets("Køb").Cells(counter, 1)
            If curcell.Text = UserForm4.TextBox1.Text Then
                UserForm4.TextBox26.Text = curcell.Offset(0, 1)
                UserForm4.TextBox2.Text = Format(curcell.Offset(0, 2), "dd. mmmm yyyy")
              UserForm4.TextBox3.Text = Format(curcell.Offset(0, 3), " #,##0.00")
                UserForm4.TextBox4.Text = Format(curcell.Offset(0, 4), " #,##0.00")
                UserForm4.TextBox5.Text = Format(curcell.Offset(0, 5), " #,##0.00")
                UserForm4.TextBox6.Text = Format(curcell.Offset(0, 6), " #,##0.00")
                UserForm4.TextBox25.Text = curcell.Offset(0, 0)
                Exit Sub
            End If
    Next
Application.ScreenUpdating = True
End Sub


Eksempel:
Opslagsværdi er et bilagsnr. Opslagsværdien tastet ind i TextBox1, og befinder sig i arket "Køb" / Kolonne A.

På baggrund af opslagsværdien, bliver følgende vist i Userformen:
- Dato (TextBox2 / Kolonne C)
- Beholdning (TextBox3 / Kolonne D)
- Værdi (TextBox4 / Kolonne E)
- Omkostninger (TextBox6 / Kolonne F)
- Renter (TextBox 7 / Kolonne G)
- Bilagsnr. (TextBox 25 / Kolonne A)
- Navn (TextBox26 / Kolonne B)

F.eks. hvis jeg laver et opslag på bilagsnr. 2001, bliver følgende vist:
- Dato: 1. juni 2011
- Beholdning: 60.000
- Værdi: 100.000
- Omkostninger: 10.000
- Renter: 1.000
- Bilagsnr. 2001
- Navn: Nordea

Nu kunne jeg godt tænke mig, at man havde mulighed for at ændre i ovenstående værdier, som efterfølgende vil blive gemt/overskrevet i arket "Køb". Når man ændre værdierne, må tal værdierne gene vises "0,00" og dato "dd. mmmm åååå".

Det kunne også være super, hvis man havde mulighed for at slette ovenstående værdier i arket "Køb".

På forhånd tak

/Jacob
Avatar billede Ialocin Novice
15. juli 2011 - 22:21 #1
Hej Jacob

Det kan sikkert lade sig gøre :o)

spørgsmål:
Skal det forståes således, at du eksempelvis ændrer "omkostninger" /TextBox6, hvorefter cellen i kolonne F tager den nye værdi ??

Og skal bilagsnummeret og kunne ændres ??

Og hvordan skal det med talværdi formaterne forståes ?

Med hensyn til at slette ... vil en "Slet" knap på userformen være okay ?

Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
15. juli 2011 - 23:25 #2
Hej Jacob

Med hensyn til at ændre værdier på dit Ark "Køb" via rettelser i dine textBoxe på din userform ... så prøv følgende:

1.
I din Userforms properties, skal værdien "ShowModal" være FALSE for, at du kan få lov til at redigere i dit underliggende ark mens userformen er åben.

2.
Flyt deklarationen Dim curcell As Range fra din textbox1 procedure ... ud i Userformens [b] generelle sektion [/b) - (øverst i kodevinduet) ... hvilket gør at andre procedurer også kan se/tilgå den aktuelle celle "curcell".

3.
Under hver af dine textboxe, hvori du ønsker at kunne ændre værdier, kan du bruge nedenstående koder under textboxens Exit hændelse.

Eksempler ... forsæt selv rækken af textboxe.

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
curcell.Offset(0, 1).Value = UserForm1.TextBox2.Value
End Sub

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
curcell.Offset(0, 2).Value = UserForm1.TextBox3.Value
End Sub

--------

Kan du bruge det ??

Jeg kigger lige på det med at slettet hele rækker ?
Og så er der det med værdi formaterne, som jeg ikke helt forstår ...

Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
15. juli 2011 - 23:34 #3
Hej Jacob

Hermed en kode, som kan slette rækken, hvori den aktuelle celle er.
Jeg har oprettet en knap på min test userform, som med et klik aktiverer koden.


Private Sub cmdSletRække_Click()

'slet hele række, hvori den aktuelle celle findes
curcell.EntireRow.Delete

    'tøm textboxe på userformen
    With UserForm4
   
        .TextBox1.Text = ""
        .TextBox2.Text = ""
        .TextBox3.Text = ""
   
    End With

End Sub



-------

Så er der kun det med talværdi formaterne tilbage ???


Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
16. juli 2011 - 00:11 #4
Hej Jacob

Omkring det med formaterne ... er det så noget i retningen af nedenstående kode fra tidligere, blot tilrettet med Format funktionen.

Hermed burde Userformens texkboxe sende den formaterede værdi til cellerne i Køb arket. Koden holder bare ikke for om brugeren har tastet noget volapyk ind i textboxen ??

Det ideelle vil være, hvis de enkelte textboxe kunne tilbyde brugerne den ønskede formatering, så snart textboxene blev aktiveret ... men jeg har ikke kunnet finde en måde til dette ???

----------
Kode med format funktionen ...

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

  curcell.Offset(0, 1).Value = Format(UserForm1.TextBox2.Value, "dd. mmmm yyyy")

End Sub


Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)

  curcell.Offset(0, 2).Value = Format(UserForm1.TextBox3.Value,"#,##0.00")

End Sub


Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
16. juli 2011 - 14:34 #5
Hej Nikolai,

Du er virkelig en gud - Mange tak for hjælpen :-)

Har lige enkelte kommentarer/spørgsmål:

Kommentar til #2:
Det virker som det skal. Er det dog muligt at tilføje en knap, som indholde koden, således at når brugeren først trykker på knappen, at ændringen bliver overført til arket fremfor det sker ligeså snart at man har ændret værdien i TextBox'en?

Det kunne være super, at vis ovenstående var muligt, at man også kunne tilføje en MsgBox, som kommer og fortæller brugeren, at ændringen er gennemført.

Lige nu kommer der også en fejl, når man direkte "hopper" ned i en af de tomme TextBox, inden man har søgt efter en værdi!

Mht. formatering menten jeg, at hvis man skulle ændre en talværdi f.eks. fra 1.000 til 2.000, så skulle teksteboksen vise 2.000,00 frem for 2000. Jeg har dog selv løst dette problem ved at indsætte følgende kode (markeret med fed):

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
curcell.Offset(0, 3).Value = UserForm4.TextBox3.Value
TextBox3.Value = Format(CDbl(TextBox3.Value), " #,##0.00")
End Sub

Kommentar til #3:
Det virker super. Jeg har forsøgt at lave en MsgBox som advarer brugeren i at, man er ved at slette indholdet. Jeg får dog en fejl, måske du lige kunne hjælpe mig:

Private Sub CommandButton3_Click()

ans = MsgBox("Du er ved at slette købet. Bemærk at handlingen ikke kan fortrydes efterfølgende!" & vbCr & "  " & vbCr & _
            "Ønsker du at slette købet?", 32 + vbYesNoCancel, "Slet køb")
  If ans = vbYes Then

curcell.EntireRow.Delete

    'tøm textboxe på userformen
    With UserForm4
   
        .TextBox1.Text = ""
        .TextBox2.Text = ""
        .TextBox3.Text = ""
        .TextBox4.Text = ""
        .TextBox5.Text = ""
        .TextBox6.Text = ""
        .TextBox25.Text = ""
        .TextBox26.Text = ""
   
    End With

  ElseIf ans = vbNo Then
    Undload.Me

End Sub

Kommentar til #4:
Fungere perfekt.

Mvh. Jacob
Avatar billede Ialocin Novice
16. juli 2011 - 17:10 #6
Hej Jacob

Vender stadig tilbage i aften med din knap.
Men med hensyn til kommunikation med brugerne, så prøv at udskifte din msgbox med en inputbox ... Som jeg lige husker det ?

Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
16. juli 2011 - 22:57 #7
Fejlen i koden skyldes at jeg havde glemt End If

Hilsen Jacob
Avatar billede Ialocin Novice
17. juli 2011 - 00:48 #8
Hej Jacob

Hermed lidt rettelser + kommentarer ...

Knappen til at gemme ændringer:
Du må lige selv tilrette diverse textbox navne + userformens navn.


Private Sub cmdGemÆndringer_Click()

    'gem kun, hvis textbox1 er forskellig fra tom = der er søgt på et bilagsnummer
    If UserForm1.TextBox1.Text <> "" Then

            'gem ændringer i arket Køb ... foretaget i textboxene på userformen
            curcell.Offset(0, 1).Value = Format(UserForm1.TextBox2.Value, "dd. mmmm yyyy")
           
            curcell.Offset(0, 2).Value = Format(UserForm1.TextBox3.Value, "#,##0.00")
            TextBox3.Value = Format(CDbl(TextBox3.Value), " #,##0.00")
 
            '..... forsæt selv nedad med dine textboxe, ark celler og formateringer ...
   
    End If


        MsgBox "Du har nu fortaget ændringer i bilagsnummer: " & curcell.Text, vbInformation

End Sub


Fejlen når der hoppes til en tom textbox:
Fejlen der kommer, når man hopper ud af en tom textbox, skyldes, at den objektvariabel (curcell), som indeholder bilagsnummeret og som samtidig er reference i forhold til at levere data til textboxene, IKKE er erklæret, da der ikke er søgt på et bilagsnummer!

Fejlen kommer du udover, hvis du benytter ovenstående knap + sletter textboxenes EXIT hændelser (som indtil nu har sørget for at ændringerne sker i regnearket) ... Håber det gi´r mening ?? ... ellers spø´r :o)

Evt. forbedringsforslag
Uden at vide, hvordan din applikation er skruet sammen, så har jeg måske en idé som du kan bruge.

Som det er nu, hvor brugeren kan søge efter et bilagsnummer og taste ENTER, styres selve søgningen ikke specielt, da der i princippet kan søges via fritekst = alle tegn, tal og bogstaver!
Dertil kan det faktisk lade sig gøre ... efter søgningen er udført og de korrekte data fundet ... at slette bilagsnummeret i textboxen og taste på GEM ÆNDRINGER knappen, hvorved intet bliver ændret!

En måde at styre brugerinput på, kunne være at tilføje en liste på Userformen, hvori de enkelte bilagsnumre var til rådighed ... og kun dem = ingen mulighed for at skrive noget fritekst fikomdik ind :o)

Listen kan sættes om til at søge på 1. tal i bilagsnummeret eller på det eksakte bilagsnummer, så snart brugeren klikker i listen og begynder at skrive/søge. .... Når der rette bilagsnummer er fundet kan man tabulere ud af listen, hvorefter textboxene på userformen bliver fyldt med de tilhørende data.

Denne løsning sikrer bilagsnummer + minimerer eventuelle fejlmuligheder.

Har jeg glemt noget, så lad høre ?

Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
17. juli 2011 - 15:36 #9
Hej Nikolai,

Kommentarer til #8:
Så lykkedes det at tilføje en knap, således at ændringen først træder i kraft, når brugeren har trykket på knappen.

Det giver god meningen mht. fejlen.

Med hensyn til dit forbedringsforslag lyder det meget smart, men det ligger nok over hvad jeg kan finde ud af.

Vil da gerne oprette en opgave, så du kan få nogle yderligere point for dette, hvis du har mod på at hjælpe?

Kommentarer til #4:
Var nok lidt for hurtig da jeg skrev at koden virkede.

Når man foretager ændringer, så bliver talværdierne formateret til tekst i arket "køb", således så det ikke er muligt at laven en sum (foregår over i et andet ark).
Avatar billede Ialocin Novice
17. juli 2011 - 19:36 #10
Hej Jacob
Jeg kigger på det med formaterne i aften, når ungerne er gået kolde :0)
Det du gerne vil, er det, at uanset hvad, så vil du ha' dine data ens både i ark og userform ?

Med hensyn til oprettelse af en liste, så laver jeg lige en test.

Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
17. juli 2011 - 22:47 #11
Hej Jacob

Prøv at gange de textbox værdier med 1, som du sender til arket Køb ?

Følgende kode fungerer hos mig ... Userformens TextBox3 værdi ganges med 1 og sendes til regnearket ... hvor arkets/cellens formatering klarer format og højrestilling. Oveni hatten modtager cellen værdien, som en værdi fremfor en tekststreng.


curcell.Offset(0, 2).Value = UserForm1.TextBox3.Value * 1


Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
17. juli 2011 - 22:48 #12
Og så til listen ...

Hvor mange billagsnumre har du i din kolonne ??

Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
18. juli 2011 - 09:13 #13
Hej Nikolai,

Kommentarer til #11:
Nu fungerer det. Det er super :-)

Kommentarer til #12:
Det er svært at sige. Pt. er der 50 bilag som står anført i kolonne A2:A51, anført i arket "Køb". Der kan dog godt kommme mange flere bilag til. Derfor skal liste meget gerne være dynamist, således så de kan udvides automatisk.

Hilsen Jacob
Avatar billede Ialocin Novice
18. juli 2011 - 11:24 #14
Hej Jacob

Jeg har lavet en test ... som du kan prøve.
Den kommer senere i dag ... er nødt til at smutte :o)


Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
18. juli 2011 - 23:50 #15
Hej Jacob

Jeg bakser lidt med formateringen på userformen ...

Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
19. juli 2011 - 00:51 #16
Hej Jacob

Hermed lidt Liste kode + diverse tilretninger.


Listen
Opret en listbox på din userform og døb den noget sigende.
Min hedder: lstBilagsNr

kopier følgende markerede kode ind i Listboxens Change hændelse.

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

Private Sub lstBilagsNr_Change()

Dim counter As Integer 'tælle variabel til cellerne i kolonne A på arket Køb




    'for hver celle i kolonne A på arket Køb
    'start i celle A2
    For counter = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row

        'set curcell = den næste celle i kolonnen
        Set curcell = Worksheets("Køb").Cells(counter, 1)



            'hvis den aktuelle celleværdi = værdien i testbox1 på userformen
            If curcell.Text = UserForm1.lstBilagsNr.Value Then


                'sæt textbox1 = værdien i den aktuelle celle (bilagsnummer)
                UserForm1.TextBox1.Value = curcell.Text

                'sæt textbox2 = værdien i cellen 1 til højre for den aktive celle
                'formater værdien således: "dd. mmmm yyyy"
                UserForm1.TextBox2.Text = Format(curcell.Offset(0, 1), "dd. mmmm yyyy")


                'sæt textbox3 = værdien i cellen 2 til højre for den aktive celle
                UserForm1.TextBox3.Text = Format(CDbl(curcell.Offset(0, 2)), " #,##0.00")

                '..... fortsæt selv med dine resterende textboxe ....


                'forlad proceduren
                Exit Sub

            End If




    'næste celle i kolonne A på arket Køb
    Next

End Sub

------------
Koden fylder userformens textboxe med de værdier fra arket Køb, som hører sammen med det, på listen, valgte bilagsnummer.


Textboxen med bilagsnumre
Lås din textbox med bilagsnumre, så brugerne IKKE kan redigere i dem.
I textboxens properties sættes Locked = true


Textboxe med double talværdier
Skal formateringen forblive intakt efter eventuel rettelse i textboxen ? Kopier da følgende markerede kode ind i textboxens Exit hændelse.

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
UserForm1.TextBox3.Text = Format(CDbl(TextBox3.Text), " #,##0.00")
End sub


"Slet en række knappen"
Sletter du en række i arket køb, via knappen på Userformen ?, skal samme række (bilagsnummer) i listen også slettes.
Kopier derfor følgende markerede kode ind i SLET knappens klik hændelse.

Private Sub cmdSletRække_Click()

    'Hvis der ikke er valgt et bilagsnummer på listen
    If UserForm1.lstBilagsNr.ListIndex = -1 Then
       
        Exit Sub
   
    Else
       
        'slet hele række, hvori den aktuelle celle findes
        curcell.EntireRow.Delete
       
            'tøm textboxe på userformen
            With UserForm1
       
       
                .lstBilagsNr.RemoveItem (.lstBilagsNr.ListIndex)
       
                .TextBox1.Text = ""
                .TextBox2.Text = ""
                .TextBox3.Text = ""
             
                ' .... forsæt selv med dine resterende textboxe

       
       
            End With
       
       
       
            'sæt tom linie som default
            UserForm1.lstBilagsNr.ListIndex = -1

    End If

End Sub



Klargør listen og åbn Userformen
Kopier følgende markerede kode ind i den hændelse der åbner din userform.


Private Sub cmdVisUserForm_Click()

Dim a As Integer
Dim c As Range


    'fyld listen med bilagsnumre fra kolonne A på arket Køb
    For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
       
            'set C = den næste celle i kolonnen
            Set c = Worksheets("Køb").Cells(a, 1)
           
            UserForm1.lstBilagsNr.AddItem (c.Value)

    Next


    'giv listen fokus
    UserForm1.lstBilagsNr.SetFocus


    'vis userformen
    UserForm1.Show 0

 
End Sub



Modal status ??
Hvis din userforms ShowModal er = false (se i userformens properties), betyder det, at der kan arbejdes udenfor userformen, mens denne er åben/aktiv. Dette betyder at der i princippet kan tilføjes/slettes rækker i regnearket, hvorfor listen på userformen skal holdes a'jour.
Det kan gøres ved at kopiere følgende markerede kode ind i arket Køb´s (Worksheet) SelectionChange hændelse ...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim a As Integer
Dim c As Range

    UserForm1.lstBilagsNr.Clear

    'fyld listen med bilagsnumre fra kolonne A på arket Køb
    For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
       
            'set C = den næste celle i kolonnen
            Set c = Worksheets("Køb").Cells(a, 1)
           
            UserForm1.lstBilagsNr.AddItem (c.Value)

    Next

End Sub

--------
For hver ændring der sker på arket Køb opdateres listen på userformen.


Det var vist alt ? ... og dog.
Tjek endnu engang at alle dine navne på ark, userform, listboxe m.m. stemmer overens med de kopierede koder.

Et tip kunne være at lave en kopi at dit Excel ark, hvori du så kan rode rundt med ovenstående ... Så har du altid en version der virker, hvis der går fuldstændig ged i det :o)

Gi´ endelig lyd, hvis ??

Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
19. juli 2011 - 10:27 #17
Hej Nikolai,

Så lykkedes det at lave koden, og den virker :-)

Har dog nedenståenden kommentarer/forbedringsforslag.

Vedrørende listen
Lige nu er det sådan, at når man åbner userformen, så fremgår alle bilagene i listboksen, hvilket også er fint nok. Jeg har en TextBox1, hvor det var meningen at man skulle kunne søge på et bilagsnummer.

Vil høre om det var muligt at kombinere TextBox1 og Listboksen, således så når Userformen åbnes vises alle bilagsnummerne i listboksen (hvilket også er gældende nu), men så kunne jeg godt tænke mig, at man ved at skrive en talværdi i Textbox1, vil listboksens valgmuligheder blive formindsket ift. den værdi man har tastet ind. Her er et lille eksempel:

I Listboksen ser anført nedenstående værdier:
100
101
102
103
200
201
300

I TextBox1 tastet der nu 3, hvorefter listboksen kun vil vise de værdier som starter med 3 - altså vil kun 300 blive vist, hvorefter brugeren kan kilkke på 300 i listboksen. Herefter vil de enkelte textboxe blive udfyldt med indhold fra arket "køb"

Håber at det gav  mening?

-------------------- xxxxxxxxxxxxxxxxxxxxx ---------------------

Vedrørende Sletning af data

Jeg får en fejlmeddelses når jeg skal slette indholdet. Har følgende kode: (Har forsøgt at tilføje en MsgBox)

Private Sub cmdSletRækkeP1_Click()

'Hvis der ikke er valgt et bilagsnummer på listen
    If UserForm4.lstBilagsNr.ListIndex = -1 Then
       
        Exit Sub

    Else

ans = MsgBox("Du er ved at slette bilaget." & vbCr & _
"Bemærk at handlingen ikke kan fortrydes efterfølgende!" & vbCr & "  " & vbCr & _
            "Ønsker du at slette bilaget?", 48 + vbYesNo, "Slet køb")
           
  If ans = vbYes Then

'slet hele række, hvori den aktuelle celle findes
        curcell.EntireRow.Delete
       
            'tøm textboxe på userformen
            With UserForm4
           
            .lstBilagsNr.RemoveItem (.lstBilagsNr.ListIndex)
       
                .TextBox1.Text = ""
                .TextBox2.Text = ""
                .TextBox3.Text = ""
                .TextBox4.Text = ""
                .TextBox5.Text = ""
                .TextBox6.Text = ""
                .TextBox25.Text = ""
                .TextBox26.Text = ""
   
   
    End With
   
    'sæt tom linie som default
    UserForm4.lstBilagsNr.ListIndex = -1
   
     
    ElseIf ans = vbNo Then
   
    Unload Me
   
    End If
End Sub

Hilsen Jacob
Avatar billede Ialocin Novice
19. juli 2011 - 13:26 #18
Hej Jacob

Hvis der ikke allerede er gjort ? så kan du i listens properties vælge om listen skal søge på første tegn, hele værdien eller slet ikke søge ... Når man klikker i listen og begynder at taste ....

I dit eksempel:
Tastes der 1 ... Findes alle de værdier der starter med 1, hvis listen er sat op til at søge på første tegn.

Hvad punktet hedder i properties kan jeg ikke huske ... ? Da jeg pt. Sidder på min telefon.

Med hensyn til din fejlmeddelelse i slette koden, så tror jeg, at hunden ligger begravet i, at du benytter en msgbox ... Som kun er envejs kommunikation til brugerne ...
Fremfor en inputbox, som kan modtage et svar fra brugerne og efterfølgende handle derpå.

Mvh Nicolai
Avatar billede JAHT Nybegynder
19. juli 2011 - 19:48 #19
Hej Nikolai,

Spørgsmål vedr. #18
Er ikke helt med på hvad du mener. Lige pt. så sker der intet, når jeg taster noget ind i textBox1, som var den textbox, som før blev brugt til at søge værdierne frem:

Jeg har indsat følgende kode ind:

Private Sub lstBilagsNr_Change()

'slå skærmopdatering fra
Application.ScreenUpdating = False

Dim counter As Integer 'tælle variabel til cellerne i kolonne A på arket Køb




    'for hver celle i kolonne A på arket Køb
    'start i celle A2
    For counter = 2 To Sheets("Køb").Range("A65536").End(xlUp).row

        'set curcell = den næste celle i kolonnen
        Set curcell = Worksheets("Køb").Cells(counter, 1)



            'hvis den aktuelle celleværdi = værdien i testbox1 på userformen
            If curcell.Text = UserForm4.lstBilagsNr.Value Then


                'sæt textbox1 = værdien i den aktuelle celle (bilagsnummer)
                UserForm4.TextBox1.Value = curcell.Text

                'sæt textbox3 = værdien i cellen 1 til højre for den aktive celle
                UserForm4.TextBox26.Text = curcell.Offset(0, 1)
           
                'sæt textbox2 = værdien i cellen 2 til højre for den aktive celle
                'formater værdien således: "dd. mmmm yyyy"
                UserForm4.TextBox2.Text = Format(curcell.Offset(0, 2), "dd. mmmm yyyy")
               
                'sæt textbox3 = værdien i cellen 3 til højre for den aktive celle
                UserForm4.TextBox3.Text = Format(curcell.Offset(0, 3), " #,##0.00")
               
                'sæt textbox4 = værdien i cellen 4 til højre for den aktive celle
                UserForm4.TextBox4.Text = Format(curcell.Offset(0, 4), " #,##0.00")
               
                'sæt textbox4 = værdien i cellen 5 til højre for den aktive celle
                UserForm4.TextBox5.Text = Format(curcell.Offset(0, 5), " #,##0.00")
               
                'sæt textbox4 = værdien i cellen 6 til højre for den aktive celle
                UserForm4.TextBox6.Text = Format(curcell.Offset(0, 6), " #,##0.00")
               
                'sæt textbox4 = værdien i cellen 7 til højre for den aktive celle
                UserForm4.TextBox25.Text = curcell.Offset(0, 0)

                'forlad proceduren
                Exit Sub

            End If

    'næste celle i kolonne A på arket Køb
    Next

'slå skærmopdatering til igen
Application.ScreenUpdating = True


End Sub
Avatar billede Ialocin Novice
19. juli 2011 - 22:28 #20
Hej Jacob

Er heller ikke helt med på, hvad du mener ?

Min idé med at indlæse bilagsnumrene i en liste er, at brugerne kun skal ha´ mulighed for at søge på/vælge de numre der er til rådighed.
Det skal ikke være muligt at søge via "fritekst", hvor alle mulige tegn i princippet er i spil!

I min verden gi´r det ikke mening, sideløbene med listen, at kunne søge i textbox1 ... så er vi jo lige vidt, hvad angår muligheden for "fritekst" sægning ??

Som jeg skriver i #18:

Hvis der ikke allerede er gjort ? så kan du i listens properties vælge om listen skal søge på første tegn, hele værdien eller slet ikke søge ... Når man klikker i listen og begynder at taste ....

I dit eksempel:
Tastes der 1 ... Findes alle de værdier der starter med 1, hvis listen er sat op til at søge på første tegn.


Punktet i listens properties hedder: MatchEntry

Med andre ord, så kan brugerne søge direkte i listen.
Tastes der eksempelvis 1 vises Bilagsnummer 1 i userformes Textbox1 med tilhørende værdier i de resterende textboxe.

Tastes der 1 igen vises næste bilagsnummer startende med tallet 1 + de tilhørende værdier ... osv. osv.

Som skrevet i #17:

Lås din textbox med bilagsnumre, så brugerne IKKE kan redigere i dem.
I textboxens properties sættes Locked = true

Brug kun Textbox1 til at vise brugerne, at det er det bilagsnummer der er valgt.


Og så tilbage til starten ...
Jeg er ikke helt med på, hvad der fungerer/ikke fungere hos dig ?

Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
19. juli 2011 - 23:39 #21
Hej Igen,

Userformen indeholder følgende textBox m.v.

TextBox1 = Skal bruges til at indkredse sin søgning

lstBilagsNr(ListBox) = Skal vise alle bilag når UserFormen states, herefter skal listen tilpasse automatisk ift. hvad der tastes ind i TextBox 1

TextBox2 til 6 = Skal vise værdier fra arket "Køb", på baggund af det bilag som man har valgt i ListBoxen.

Kunne godt tænke mig at det fungerede som nedenstående eksempel

Et lille eksempel:

I Listboxen er nedenstående værdier vist, når man åbner Userformen:
100
101
102
103
200
212
300
302
201

Hvis jeg i TextBox1 tastet 2, så skal listboxen tilpasse til at vise følgende:
200
212
201

Og hvis jeg skrive 0 efter 2 tallet i textboxen, skal listboxen vise:
200
201

Når jeg så vælger et af bilagene i Listboxen, så skal der ske et opslag i de andre textboxe på baggrund af bilagsnummeret (fungere helt fint)

-------------------------------- xxxxx ----------------------

Årsagen til at jeg godt kunne tænke mig dette skyldes, at det skal være hurtigt at kunne tilpasse sin søgning, så brugeren ikke skal scroll en hel masse bilagsnummere igennem.

Selvfølgelig skal det være sådan, at hvis man taster forkert, så der ikke er noget match, så skal listboxen ikke foretage sig noget.

Jeg har beskyttet TextBox1 med følgende kode, så det kun er muligt at indtaste tal og ikke bogstaver:

Private Sub TextBox3_keypress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case Key
  Case 44 To 57
  Case Else
      KeyAscii = 0
End Select
End Sub

Håber det gav et bedere billed af, hvad jeg godt kunne tænke mig :-)

Hilsen Jacob
Avatar billede JAHT Nybegynder
19. juli 2011 - 23:43 #22
Glemte lige at tilføje, at arket Køb er skjult for brugeren, så der er ingen mulighed for at taste manuelt heri.
Avatar billede Ialocin Novice
20. juli 2011 - 00:01 #23
Hej Jacob

Nu tror jeg, at jeg er med ;o)
Jeg skal se, hvad jeg kan gøre ? - du hører nærmere.


Og så bare for nysgerrighedens skyld: Hvor i verden sidder du ?



Med venlig hilsen, Nicolai
Avatar billede Ialocin Novice
20. juli 2011 - 02:17 #24
Hej Jacob

Så prøver vi lige igen :o)

Flyt din kode fra listboxens Change hændelse til listboxens Click hændelsen i stedet, da der ikke skal hentes værdier til textboxene under selve søgningen ... Men først når brugeren klikker på det ønskede bilagsnummer.


Derudover har jeg, for overskuelighedens skyld, oprettet et dedikeret søgefelt på min userform ... fremfor at benytte Textbox1 til samme formål, hvilket vil give anledning til en del forvirring om hvilket bilagsnummer der faktisk bliver vist ???

Så Textbox1 er "bare" en textbox, som alle de andre, der viser det aktuelle bilagsnummer ... Evt. Locked, så brugerne ikke kan slette/overskrive nummeret! ... Textbox1 har ingen underliggende kode.


Her er koden til søgefeltet som jeg har døbt txtSøgefelt ... og igen, må du lige koordinere diverse navne, så de passer med virkeligheden ...


Private Sub txtSøgefelt_Change()
Dim a As Integer                'tællevariabel
Dim c As Range                  'objekt variabel
Dim talstreng As String        'variabel til talstreng
Dim talstrengsLængde As Variant 'variabel til længden på talstrengen
Dim talstrengLeft As Variant    'variabel til talstrengen fra venstre mod højre
Dim status As String            'txtSøgefelt status

'set status = værdien i textbox1
status = Me.txtSøgefelt.Text


'vælg udfra status
Select Case status

    'hvis txtSøgefelt er tom
    Case ""
             
            'fyld listen med alle bilagsnumre fra kolonne A på arket Køb
            For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
               
                    'set C = den næste celle i kolonnen
                    Set c = Worksheets("Køb").Cells(a, 1)
                   
                    UserForm4.lstBilagsNr.AddItem (c.Value)
       
            Next
       
       
            'sæt tom linie som default
            UserForm4.lstBilagsNr.SetFocus
           
           
            'tøm alle textboxe på userformen
            With UserForm4
               
                .TextBox1.Text = ""
                .TextBox2.Text = ""
                .TextBox3.Text = ""
               
                ' !!!!! fortsæt selv med dine resterende textboxe  !!!!!

           
            End With
           
           
           


    'hvis txtSøgefelt ikke er tom
    Case Else
   
   
            'hele den aktuelle talstreng i txtSøgefelt
            talstreng = Me.txtSøgefelt.Text
           
            'aktuel talstrengs længde i txtSøgefelt
            talstrengsLængde = Len(talstreng)
           
            'aktuel talstreng fra venstre mod højre
            talstrengLeft = Left(talstreng, talstrengsLængde)
           
           
                'ryd listen
                Me.lstBilagsNr.Clear
           
           
                'fyld listen med bilagsnumre fra kolonne A på arket Køb
                For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
           
                        'set C = den næste celle i kolonnen
                        Set c = Worksheets("Køb").Cells(a, 1)
           
           
                            'Tjek cifre fra venstre i den aktuelle celleværdi på arket Køb
                            'Hvis de matcher de indtastede cifre i txtSøgefelt på userformen
                            If Left(c.Value, talstrengsLængde) = talstrengLeft Then
           
                                'tilføj den aktuelle celleværdi til listen
                                UserForm4.lstBilagsNr.AddItem (c.Value)
           
                            End If
           
                Next
           
           
           
           
                'giv txtSøgefelt fokus
                Me.txtSøgefelt.SetFocus
   
    End Select
End Sub




Og slutteligt, så tester jeg ikke for korrekt input (= tal) i søgefeltet ... men mon ikke du kan bruge din egen kode fra tidligere ?


Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
20. juli 2011 - 10:36 #25
Hej Nikloai,

Så lykkedes det :-)

Mange mange tak for hjælpen og din tålmodighed.

Jeg bor i storkøbenhavn.

Hilsen Jacob
Avatar billede Ialocin Novice
20. juli 2011 - 13:54 #26
Hej Jacob

Selv tak ... Det har været spændende :0)
Du er velkommen til poste en mail, hvis du mener jeg kan bidrage med et eller andet ?

Jeg residerer i Bjerringbro ..men der er trods alt internet forbindelse ;o)

Med venlig hilsen, Nicolai
Avatar billede JAHT Nybegynder
21. juli 2011 - 13:34 #27
Hej Nikolai,

Ja, det er godt der er noget der hedder internet.

Jeg har faktisk opretet en lille ny opgave, vedr. Sum af to textboxe.

Hvis du har mod på det :)?

Hilsen Jacob
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