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.
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..
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?
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..
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
Synes godt om
Ny brugerNybegynder
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.