Avatar billede denero Juniormester
06. marts 2012 - 10:48 Der 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.
Avatar billede molet Nybegynder
06. marts 2012 - 22:48 #1
'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
Avatar billede molet Nybegynder
06. marts 2012 - 23:16 #2
'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
Avatar billede denero Juniormester
07. marts 2012 - 14:28 #3
Tak for dit forslag. Det varer lige lidt, inden jeg får tid til at prøve det af. Håber det er i orden?
Avatar billede denero Juniormester
08. marts 2012 - 09:18 #4
Hej igen

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.

På forhånd tak.
Avatar billede molet Nybegynder
08. marts 2012 - 13:54 #5
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).
Avatar billede denero Juniormester
12. marts 2012 - 08:41 #6
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).
Avatar billede denero Juniormester
12. marts 2012 - 08:44 #7
Jeg glemte lige, at ved oprettelse af ny, må det ikke være et nummer i kolonne 1, som allerede er brugt.
Avatar billede molet Nybegynder
15. marts 2012 - 09:01 #8
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.
Avatar billede denero Juniormester
15. marts 2012 - 14:33 #9
Måske du har overset det, men jeg kan ikke få skrevet data i kolonne A ved oprettelse af ny. Søg er nu ok.
Avatar billede denero Juniormester
15. marts 2012 - 15:00 #10
Lige en ting mere - række 1 er overskrifter i min database, så de skal ikke med i søgning.
Avatar billede molet Nybegynder
15. marts 2012 - 23:39 #11
.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")
Avatar billede denero Juniormester
18. marts 2012 - 08:18 #12
Hej Molet

Så skulle den vist være i skabet. Tusind tak for hjælpen. Lægger du et svar?
Avatar billede molet Nybegynder
18. marts 2012 - 19:49 #13
Fint du kunne bruge det.
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