Avatar billede bejerholm Nybegynder
14. november 2007 - 16:10 Der er 5 kommentarer

Udvælge datasæt samt output i løkke

Altså nu er det nok mig som vil have Excel til at opføre sig som en SQL database, men det kan jo være følgende kan lade sig gøre..

Jeg er ved at lave et fakturasystem til mit lille firma. Jeg vil gerne have det hele til at fungere i samme excel dokument, men under forskellige ark. Dokumentet er derfor delt op i tre ark, som hver i sær har sin funktion.

kunde_db: Kundedatabse med 6 kolonner - 1) kundenummer, 2) Navn, 3) Adresse, 4) By, 5) CVR 6)Att.

faktureringer: Faktureringsdatabase med 6 kolonner - 1) Faktura nr., 2) Kunde nr., 3) Faktura dato, 4) Antal enheder, 5) Enhedspris, 6) Tekst

faktura: Her vil jeg gerne samle oplysninger fra mine databaser ved hjælp af referance numre dvs. henholdsvis Kundenr. og Fakturanr. Med andre ord, efter indtastning af kun to numre, vil jeg gerne have min faktura er klar til print. Men hvordan? Her kommer spørgsmålet..

Faktura arket indeholder naturligvis en celle til henholdsvis Kundenr. (celle C12) og Fakturanr. (celle C10). Det jeg gerne vil til at at starte med er at bruge kontaktoplysninger fra kunde_db. Dvs. arket skal inputte adressen for kundenummer XX i en celle, By i en anden, CVR i en tredje osv. Hvad er formlen/funktionen til dette?

Hernæst skal arket bruge det indtastede Fakturanr. til, først at udvælge og kopiere (lave et array) alle rækker med svarende fakturanr i arket faktureringer (der kan jo godt være flere poster på samme faktura). Hernæst lave en løkke hvor en ny række udfyldes med de hentede data en for en. Hvordan laves sådan en funktion?

Jeg ved godt dette var en ordentlig mundfuld og måske kan det hele slet ike lade sig gøre, men dette ville uden problemer kunne foregå i SQL så jeg håber også Excel måske kan. Pga. det store spørgsmål ligger jeg også en del point i puljen..
Avatar billede x-lars Novice
14. november 2007 - 16:38 #1
Prøv at kigge på funktionen Lopslag(). Syntaksen er =lopslag(kundenummer;dit_array;kolonnenummer i arrayet;falsk), altså 4 parametre. Kundenummer er din reference, dit_array er den tabel, du ønsker at slå op i, kolonnenummer angiver, hvilken kolonne i tabellen, der indeholder den ønskede information og "falsk" angiver, at værdien skal findes i tabellen, men at denne ikke nødvendigvis behøves være sorteret i stigende orden.

Den anden del af dit spm. forstår jeg ikke rigtig. Kan du uddybe?
Avatar billede supertekst Ekspert
15. november 2007 - 09:23 #2
Må det være VBA?
Avatar billede bejerholm Nybegynder
15. november 2007 - 15:39 #3
Selvfølgelig må det være i VBA, jeg forstår bare ingenting af VBA syntax, da jeg normalvis koder i PHP. Men hvis du har et kodeeksempel, vil jeg meget gerne prøve at forstå det..

Er du med på hvad jeg mener?
Avatar billede supertekst Ekspert
15. november 2007 - 15:42 #4
Ok - jeg vender tilbage - skal lige have skrevet koden først...
Avatar billede supertekst Ekspert
15. november 2007 - 18:10 #5
Et udkast - koden indsætes i Arket Faktura - faktura of kundenr indtastes i C10 & C12 - så skulle der ske noget - i givet fald er du velkommen til at få min model - send evt. en mail til: pb@supertekst-it.dk

(Hvis tiden havde tilladt det - ville det nok være mere hensigtsmæssigt - hvis du kunne vælge kunde & faktura i en Userform)

Dim flag As Boolean
Dim celle, kNr, fNr
Private Sub Worksheet_Activate()
    flag = False
    kNr = 0
    fNr = 0
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo fejl

    If Target <> "" And IsNumeric(Target) = True Then
        If flag = True Then
            If celle = "$C$10" Then
                fNr = Target
                flag = False
            Else
                If celle = "$C$12" Then
                    kNr = Target
                    flag = False
                End If
            End If
           
            If kNr > 0 And fNr <> 0 Then
                If hentKundeData(kNr) > 0 Then
                    hentFaktData fNr, kNr
                End If
            End If
        End If
    End If
    Exit Sub
   
fejl:                                              'opstår når range.slettes
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim adr
    adr = ActiveCell.Address
   
    If adr = "$C$10" Or adr = "$C$12" Then
        flag = True
        celle = ActiveCell.Address
    Else
        flag = False
    End If
End Sub
Private Function hentKundeData(kNr)
Dim kRæk
    kRæk = findKunde("Kunde_DB", kNr)
    If kRæk > 0 Then
        Set kdata = ActiveWorkbook.Sheets("Kunde_DB")
        With kdata
            Cells(12, 5) = .Cells(kRæk, 2)  'navn
            Cells(13, 5) = .Cells(kRæk, 3)  'adresse
            Cells(14, 5) = .Cells(kRæk, 4)  'by
            Cells(15, 5) = .Cells(kRæk, 5)  'CVR
            Cells(16, 5) = .Cells(kRæk, 6)  'Att
        End With
    Else
Rem Slet gl. indhold, da dette ikke overskrives
        Cells(12, 5) = ""  'navn
        Cells(13, 5) = ""  'adresse
        Cells(14, 5) = ""  'by
        Cells(15, 5) = ""  'CVR
        Cells(16, 5) = ""  'Att
        MsgBox ("Kundenr.: " + CStr(kNr) + " kunnde ikke findes!")
        kNr = 0
    End If
   
Rem Slet fakturerings-linie området
    Range("A18:h100").Delete
   
    hentKundeData = kRæk
End Function
Private Sub hentFaktData(fNr, kNr)
Dim faktRæk
    faktRæk = 19
   
    Set fark = ActiveWorkbook.Sheets("Faktureringer")
    For ræk = 2 To 65000
        With fark
            If .Cells(ræk, 1) = "" Then
                Exit Sub
            Else
                If .Cells(ræk, 1) = fNr And .Cells(ræk, 2) = kNr Then
                    Cells(faktRæk, 3) = .Cells(ræk, 3)                  'faktdato
                    Cells(faktRæk, 3).NumberFormat = "m/d/yyyy"

                    Cells(faktRæk, 4) = .Cells(ræk, 4)                  'antal enheder
                    Cells(faktRæk, 5) = .Cells(ræk, 5)                  'enhedspris
                    Cells(faktRæk, 6) = .Cells(ræk, 6)                  'tekst
                    faktRæk = faktRæk + 1
                End If
            End If
        End With
    Next ræk
End Sub
Private Function findKunde(ark, nr)
    With Worksheets(ark).Range("a2:a65000")
        Set c = .Find(nr, LookIn:=xlValues, LookAt:=xlWhole)
        If Not c Is Nothing Then
            findKunde = c.Row
        Else
            findKunde = 0
        End If
    End With
End Function
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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