06. marts 2012 - 10:48Der er
12 kommentarer og 1 løsning
"Database" i excel
Minidatabase
Har et regneark med ca. 500 rækker og 3 kolonner (skal kunne udvides).
I første kolonne er der et unikt nummer for hver række Det jeg skal bruge er flg.
1. En indtastningsformular til nye data, hvor der selvfølgelig er en tekstboks for hver kolonne. Den" første" tekstboks (den hvor nummeret indtastes i) skal ved indtastning sikre, at man ikke bruger et allerede forekommet nummer i kolonne 1.
2. En formular til at ændre data (ikke nummeret i kolonne 1), hvor man finder den række, man skal rette data i, ved at indtaste nummeret i den første tekstboks eller vælge fra en liste og så fremkommer øvrige data i rækken i de andre tekstbokse.
3. En formular, der sletter poster (rækker).
Som bruger skal man via disse formularer vedligeholde "databasen". Kan godt selv lave formularene, men mangler hjælp til koden bag ved disse.
'I eksemplet er anvendt en formular med 3 TextBoxe 'SoegeTekst,KolB og KolC '2 KommandoKnapper Soeg og Gem
Public Rekke As Integer
'Gem Er en KommandoKnap i din formular du bruger til at gemme 'ændrede data i tekstbokse Private Sub Gem_Click() 'KolB er en TextBox i din formular der skal modtage data til kollonne B ' do med KolC
With Worksheets("Ark1") .Cells(Rekke, 2) = KolB .Cells(Rekke, 3) = KolC End With End Sub
'Soeg er en knap du bruger til at starte søgning efetr teksten i en TextBox (SoegeTekst) Private Sub Soeg_Click() Dim X As Integer Static C
With Worksheets("Ark1").Range("A1:A500") Set C = .Find(SoegeTekst, LookIn:=xlValues) If Not C Is Nothing Then 'C.Address er den celle hvor data bliver fundet f.eks.$A$20 X = InStr(2, C.Address, "$") Rekke = Val(Mid(C.Address, X + 1, 3)) ' Finder den række hvor din søgning er fundet KolB = .Cells(Rekke, 2) KolC = .Cells(Rekke, 3) Else KolB = "" KolC = "" End If End With End Sub
'Jeg havde overset at du også vil oprette nye nr. fra formularen 'Jeg har tilføjet et par linier som går til første ledige celle 'hvis søgeteksten ikke bliver fundet. 'For at synliggøre hvilken række jeg står i, har jeg indsat en 'label RekkeNr, hvor jeg skriver den fundne række
Public Rekke As Integer
'Gem Er en KommandoKnap i din formular Private Sub Gem_Click() 'KolB er en TextBox i din formular der skal modtage data til kollonne B ' do med KolC
With Worksheets("Ark1") .Cells(Rekke, 1) = Val(SoegeTekst) .Cells(Rekke, 2) = KolB .Cells(Rekke, 3) = KolC End With End Sub
'Soeg er en knap du bruger til at starte søgning efetr teksten i en TextBox (SoegeTekst) Private Sub Soeg_Click() Dim X As Integer Static C
RekkeNr.Caption = ""
With Worksheets("Ark1").Range("A1:A500") Set C = .Find(SoegeTekst, LookIn:=xlValues) If Not C Is Nothing Then 'C.Address er den celle hvor data bliver fundet f.eks.$A$20 X = InStr(2, C.Address, "$") Rekke = Val(Mid(C.Address, X + 1, 3)) ' Finder den række hvor din søgning er fundet KolB = .Cells(Rekke, 2) KolC = .Cells(Rekke, 3) Else Set C = .Find("", LookIn:=xlValues) X = InStr(2, C.Address, "$") Rekke = Val(Mid(C.Address, X + 1, 3)) ' Finder den række hvor din søgning er fundet KolB = "" KolC = "" End If End With RekkeNr.Caption = Rekke End Sub
Det virker fint, men hvis der bliver trykket på "GEM" først uden først at søge, kommer denne fejlmelding op:
Run-time error´: Application-defined or objekt-defined error
Hvis man kommer til at trykke på "GEM" først - kunne men ikke lave en meddelse i stedet, evt. "Du skal søge først!"?
Det med label virker ikke. Har sat en label på formularen, navn "RekkeNr", men der står stadig efter afvikling af koden "Label1".
Med hensyn til at oprette en ny er det ikke hensigtsmæssigt, at først skal man søge, derefter indtaste en ny og så trykke gem. Det ville være bedre med en knap, der hed "Opret ny", hvor man så kunne skrive de relevante nye data ind. Som koden er nu, skrives der ikke et række nr. ind , hvilket jo også er rigtigt, når koden skal bruges til at rette i et bestående nr., men ikke ved oprettelse af nyt nr. Ved oprettelse af ny, må nummeret ikke være brugt i kolonne 1, da disse skal være unikke. Kan du evt. give et eks. på en udvidelse til 4 kolonner i koden - dels gem, dels søg, dels opret ny.
1. Hvis du vil sikre dig mod fejlen i "Gem" kan du gøre to ting. Som første linie i Sub Gem_Click kan du skrive
If Rekke = 0 then exit sub eller If Rekke = 0 then msgbox("Du skal søge først!"):exit sub
2. Du må have lavet en fejl i det med Label1 Har du navngivet Label1 til RekkeNr. ellers kan du skrive Label1.Caption = Rekke Har du husket kommandoen RekkeNr.caption = RekkeNr
3. Du er nødt til at finde første ledige række når du vil oprette en ny record. Ved at bruge det viste eksempel, sikrer du samtidigt, at søgeordet kun findes een gang, ellers vil det blive vist som fundet. Du kan også søge med et tomt søgefelt, så finder du første ledige, men du får ikke søgt om søgekriteriet allerede eksisterer. Du kan godt lave en "Opret ny" knap, så skal du blot kopiere der der står under Soeg, og så rette Set C = .Find(SoegeTekst, LookIn:=xlValues) til Set C = .Find("", LookIn:=xlValues) og fjerne else med indhold.
4. Skal du indsætte flere kolonner, sætter du så mange Textboxe du har brug for i formularen. og kalder dem f.eks. KolD, KolE osv. Så indsætter du .Cells(Rekke, 4) = KolD osv. i Gem og ColD = .Cells(Rekke,4) osv. i Søg. Rekke i parantesen er den række vi er i og tallet den kolonne vi skal hente/gemme i. 1 = kolonne A, 2 er B osv.
Når du du skal føre tal over i din TextBox skal du huske at bruge f.eks. ColD.value, ellers kommer de som en tekst. og når du flytter tal fra en Textbox skal du sørge for at de kommer over som et tal, f.eks. ved at valuere, som vist i Gem .Cells(Rekke, 1) = Val(SoegeTekst).
Søgefunktionen er ikke helt præcis. Hvis man søger på 1 tager den det føste tal, der begynder med 1 - eks. 10, selvfølgelig hvis ikke 1 er på listen. Kunne man bruge en comboboks i stedet med Rowsource i Kol.1 + MatchRequired.På den måde undgår man også søgninger uden resultat.
Jeg har lavet "Opret ny" knappen, men får ikke gemt det nye nummer i kolonne 1. Derfor mener jeg ikke, man umiddelbart kan bruge den samme gem knap, da den jo kun må gemme nye data til et eksisterende nummer.
Flg. forstår jeg ikke helt:
Når du du skal føre tal over i din TextBox skal du huske at bruge f.eks. ColD.value, ellers kommer de som en tekst. og når du flytter tal fra en Textbox skal du sørge for at de kommer over som et tal, f.eks. ved at valuere, som vist i Gem .Cells(Rekke, 1) = Val(SoegeTekst).
Jeg glemte LookAt:=xlWhole for at søge på hele cellen. Set C = .Find(SoegeTekst, LookIn:=xlValues, LookAt:=xlWhole
Når du skal oprette en ny record, skal du først finde den første ledige række. Det kan du gøre ved at søge efter "", og derefter finde rækken som vist, og kalde den Rekke. Det er det jeg gør ved at bruge søgeknappen, hvis dit søgekriterie allerede findes, vises det (du kan altså ikke optrette dubletter). Hvis dit søgekriterie ikke findes, søges der efter første ledige række.
Rekke er defineret som Public, og vil derfor være aktiv i alle funktioner, men den skal naturligvis findes først. Også hvis det er en tom række til en ny record.
"Flg. forstår jeg ikke helt:" Glem det, og brug nedenstående i stedet,hvis du får problemer med decimaltal. Når du flytter et decimaltal fra en TextBox til en celle, kommer tallet over som en tekst, hvis du bruger komma som decimaltegn. (Hvis VBA er engelsk og Excel er Dansk) Derfor kan det være fornuftigt at indsætte f.eks.
.cells(Rekke,2) = Replace(KolB.Value,",",".")
hvis dit indhold i KolB er et decimaltal, så får du altid værdien rigtig i cellen.
.Cells(Rekke, 1) = SoegeTekst Kopierer det der står i TextBox "SoegeTekst" til kolonne A.
Brug SoegeTekst.Value, hvis det er et tal i kolonne A
Du kan sikre dig mod at overskrive en evt. eksisterende tekst/tal i kolonne A, således:
If .cells(Rekke, 1) = "" then .Cells(Rekke, 1) = SoegeTekst end if .Cells(Rekke, 2) = KolB .Cells(Rekke, 3) = KolC
Hvis du har overskrifter i række 1, kan du rette søgeområdet således: With Worksheets("Ark1").Range("A1:A500") rettes til With Worksheets("Ark1").Range("A2:A500") ligesom du kan udvide antallet af rækker således With Worksheets("Ark1").Range("A2:A1000")
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.