Avatar billede lillehans Nybegynder
10. november 2001 - 20:44 Der er 19 kommentarer og
1 løsning

VBA - opbevare data i hukommelsen inden overføring til regneark

I form1 har jeg 3 tekstfelter til henholdsvis nummer, navn og adresse på en person.
Når jeg har indtastet 1. person, skal der spørges, om der skal indtastet flere personer.
Hvis ja, skal tekstfelterne i formen cleares til brug for næste indtastning, men nummer, navn og adresse på person 1 må ikke overføres til regnearket endnu, idet jeg skal have mulighed for at gennemse det indtastede og eventuelt rette i dette, forinden overføring sker til regnearket, dvs. at dataene skal opbevares i hukommelsen indtil videre, men skal altså kunne genfremkaldes til brug for eventuelt rettelse.
Hvis nej, skal de indtastede data for (det ukendte antal personer) overføres således, at nummeret på personen havner på det tilsvarende ”arknr.” på regnearket. Den først  indtastede behøver ikke at have nr. 1, det kan være, at personen har nr. 45. Person nr. 45 skal altså til ark 45 , person nr. 2 til ark2 osv.
Kan man virkelig det i Excel?
10. november 2001 - 21:06 #1
ja - det kan man godt.

Jeg bruger ofte denne metode.
I modulet ØVERST (dog under Option Explicit, hvis du bruger det) definerer jeg nogle offentlige variabelnavne. Det kunne se således ud:
Dette afhænger nok lidt af, hvad du laver - kan gøre godt og skidt.

Public sNr() As String
Public sNavn() As String
Public sAdr() As String
Public iCounter As Integer

Nå så brugeren svarer ja til en ekstra person, så kunne din kode se således ud:
iCounter=iCounter + 1
Redim Preserve sNr(iCounter)
Redim Preserve sNavn(iCounter)
Redim Preserve sAdr(iCounter)
sNr(iCounter) = txtnummer
sNavn(iCounter) = txtnavn
sAdr(iCounter) = txtadresse

nu har du gemt oplysninger under det nummer, som iCounter antog lige på dette tidspunkt. Oplysningern kan let kaldes frem igen. f.eks.
For iX = 1 To iCounter
    Range(\"A\" & iCounter).Value = CInt(sNr(iX)
    Range(\"B\" & iCounter) = sNavn(iX)
    Range(\"C\" & iCounter) = sAdr(iX)
Next iX

Håber min lille frihåndsskitse er forståelig.
Avatar billede lillehans Nybegynder
10. november 2001 - 22:28 #2
1)Jeg har nu to gange svaret ja til at indtaste flere personer. Nu er der ikke flere. Hvordan får jeg så tømt hukommelsen for disse 3 personers data over på ark1? Havner de i kolonnerne a-c?
Det virker sådan, hvis jeg forstår sidste led i dit svar rigtigt.
2)Sidste led i dit svar opfatter jeg således, at
data nu er sendt over på ark1? Er det rigtigt?

10. november 2001 - 23:39 #3
1) hvor har du defineret dine variabler ?
- i ThisWorrkbook eller i userformen ?
2) rigtigt
10. november 2001 - 23:47 #4
Nulstil variabler:

Redim sNr(0)
Redim sNavn(0)
Redim sAdr(0)
11. november 2001 - 02:30 #5
Dette er vist den rigtigste måde at gøre det på, men de virker begge.

Erase sNr
Erase sNavn
Erase sAdr
Avatar billede lillehans Nybegynder
11. november 2001 - 09:46 #6
Variabler er defineret i et modul General Declarations under option explicit.
Problemet er at få ført oplysningerne i hukommelsen over på de respektive regneark, styret
af nummeret på personen.
11. november 2001 - 13:20 #7
Den første jeg viste tager personerne udfra iCounter, men du kunne godt tænke dig det udfra sNr, rigtigt ?
kan du ikke sortere dit regneark efter indsættelse udfra iCounter ?

Det andet bliver rigtigt besværligt - for du ved jo ikke hvilke sNr der er blevet oprettet, og der skal et pænt sorteringsværktøj til for styre det nummer.
Avatar billede lillehans Nybegynder
11. november 2001 - 16:56 #8
Lad og sige jeg har 10 personer. Person 1\'s data ligger i ark 1 osv. Jeg skal nu ajourføre disse data. Jeg kan vælge at ajourføre person 1 og gemme disse data. Hvis der er 2 personers data, der skal ajourføres, ville det være smart at spørge: \"Er der flere, der skal ajourføres\". Der er en mere, nemlig nr. 5. Og så ikke mere.
Nu er jeg færdig, og person nr 1 skal altså til ark 1 og person nr. 5 skal altså til ark 5.
Det er nærmest en slags bogføring, hvor posteringerne skal ind på de respektive kontonumre. Forstår du dette?

11. november 2001 - 17:00 #9
jeg tror jeg forstår det, det viser sig jo om lidt...

For iX = 1 To iCounter
    Worksheets(\"Ark\" & sNr(ix).Range(\"A\" & iCounter).Value = CInt(sNr(iX)
    Worksheets(\"Ark\" & sNr(ix).Range(\"B\" & iCounter) = sNavn(iX)
    Worksheets(\"Ark\" & sNr(ix).Range(\"C\" & iCounter) = sAdr(iX)
Next iX

Hvad er så din vurdering - har jeg forstået det ?

11. november 2001 - 17:01 #10
UPS - der manglede lige en parantes...

For iX = 1 To iCounter
    Worksheets(\"Ark\" & sNr(ix)).Range(\"A\" & iCounter).Value = CInt(sNr(iX)
    Worksheets(\"Ark\" & sNr(ix)).Range(\"B\" & iCounter) = sNavn(iX)
    Worksheets(\"Ark\" & sNr(ix)).Range(\"C\" & iCounter) = sAdr(iX)
Next iX

Avatar billede lillehans Nybegynder
11. november 2001 - 20:43 #11
Gud, hvor er det svært. Det er vist unddraget min vulgære fatteevne.
Jeg satte endnu en parantes i første linie efter cint(snr(ix))sådan, men VBA kan ikke li\' linien overhovedet. Jeg har kopieret den over, men får alligevel mismatch. IX erklærede jeg som variant.
Er det i orden, at jeg har lagt hele proceduren:
For IX = 1 to icounter -- under en cmdGemkontrol?
11. november 2001 - 21:19 #12
ok lillehans - hvad med denne her ?

Sub cmdGem_Click()
Dim iX As Integer
For iX = 1 To iCounter
    Worksheets(\"Ark\" & CInt(sNr(ix))).Range(\"A\" & iCounter).Value = CInt(sNr(iX))
    Worksheets(\"Ark\" & CInt(sNr(ix))).Range(\"B\" & iCounter) = sNavn(iX)
    Worksheets(\"Ark\" & CInt(sNr(ix))).Range(\"C\" & iCounter) = sAdr(iX)
Next iX
End Sub
11. november 2001 - 21:35 #13
Du kan maile mig filen fd@win-consult.com
Avatar billede lillehans Nybegynder
11. november 2001 - 22:04 #14
Stakkels flemmingdahl
Mine øren er meget, meget røde. Jeg er ikke sikker på andet, end at det er mig, der har nulstillet de forskellige textbokse inden jeg begyndte at gemme data, af hvilken grund der kom en fejlmeddelelse om mismatch. Undskyld! Nu er jeg imidlertid blevet totalt forvirret, men her er hele min kode.Først indtaste og så gemme.
Jeg bruger 3 tekstbokse på en form. Gider du at rette min kode, så den virker?


Private Sub cmdindtast_Click()
MsgBox \"Flere\", vbYesNo
If vbYes = True Then
icounter = icounter + 1
ReDim Preserve snr(icounter)
ReDim Preserve snavn(icounter)
ReDim Preserve sadr(icounter)
snr(icounter) = txtnummer
snavn(icounter) = txtnavn
sadr(icounter) = txtadresse
Else
End If
End Sub

Private Sub cmdgem_Click()
Dim ix As Integer
For ix = 1 To icounter
    Worksheets(\"Ark\" & CInt(snr(ix))).Range(\"A\" & icounter).Value = CInt(snr(ix))
    Worksheets(\"Ark\" & CInt(snr(ix))).Range(\"B\" & icounter) = snavn(ix)
    Worksheets(\"Ark\" & CInt(snr(ix))).Range(\"C\" & icounter) = sadr(ix)
Next ix
End Sub

Avatar billede lillehans Nybegynder
11. november 2001 - 22:20 #15
Jeg mailer nu.
12. november 2001 - 12:52 #16
Forslag sendt.
12. november 2001 - 12:53 #17
Jeg fik ikke sat
Erase sNr
Erase sNavn
Erase sAdr
ind, men disse linier skal placeres lige inden
Unload Me

Er du med ?
12. november 2001 - 17:42 #18
Den sendte kode ser således ud:

Dim iX As Integer
Dim iRow As Integer

Private Sub cmdindtast_Click()
Dim sSvar As String
    sSvar = MsgBox(\"Flere\", vbYesNo)
    If sSvar = vbYes Then
        UpdatePublicArrays
       
        txtnummer = \"\"
        txtnavn = \"\"
        txtadresse = \"\"
        txtnummer.SetFocus
    Else
        If iCounter > 0 Then
            UpdatePublicArrays
            For iX = 1 To iCounter
                iRow = Worksheets(\"Ark\" & CInt(sNr(iX))).Range(\"A65000\").End(xlUp).Row + 1
                Worksheets(\"Ark\" & CInt(sNr(iX))).Range(\"A\" & iRow).Value = CInt(sNr(iX))
                Worksheets(\"Ark\" & CInt(sNr(iX))).Range(\"B\" & iRow) = sNavn(iX)
                Worksheets(\"Ark\" & CInt(sNr(iX))).Range(\"C\" & iRow) = sAdr(iX)
            Next iX
        Else
            If txtnummer <> \"\" Then
                iRow = Worksheets(\"Ark\" & CInt(txtnummer)).Range(\"A65000\").End(xlUp).Row + 1
                Worksheets(\"Ark\" & CInt(txtnummer)).Range(\"A\" & iRow).Value = CInt(txtnummer)
                Worksheets(\"Ark\" & CInt(txtnummer)).Range(\"B\" & iRow) = txtnavn
                Worksheets(\"Ark\" & CInt(txtnummer)).Range(\"C\" & iRow) = txtadresse
            End If
        End If
        Erase sNr
        Erase sNavn
        Erase sAdr
        Unload Me
        End
    End If
End Sub

Private Sub UpdatePublicArrays()
    iCounter = iCounter + 1
    ReDim Preserve sNr(iCounter)
    ReDim Preserve sNavn(iCounter)
    ReDim Preserve sAdr(iCounter)
        sNr(iCounter) = txtnummer
        sNavn(iCounter) = txtnavn
        sAdr(iCounter) = txtadresse
End Sub
Avatar billede lillehans Nybegynder
12. november 2001 - 22:13 #19
NU virker det. Mange tak for indsatsen.
12. november 2001 - 22:22 #20
:-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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