10. november 2001 - 20:44Der 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?
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
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?
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.
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.
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?
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?
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
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
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.