22. august 2007 - 18:31Der er
68 kommentarer og 1 løsning
Word fakture, Bruge word til at lave faktura i
Hej, jeg er ved at lave en faktura skabelon i word, jeg sætter den op med formulare. selve udsenet er intet problem, og jeg tror oxe godt at jeg kan finde ud af at få formlerne til at regne pris og sådan noget ud.
Det der er mit problem er at jeg, ikke har nogle anelse om hvordan jeg kan generere en fortløbende faktura nummer, kalkulere mig frem til betalingsdatoen samt at "auto" gemme dokumentet med det genereret faktura nummer.
Er der nogle her der kan hjælpe ???
Kopi af fakturen kan hentes her (renset udgave)(designet er ikke færdigt men jeg gidder ikke gøre formeget ud af det hvis jeg ikke kan få det til at virke) www.kancaie.dk/fak.doc
Det er lige før jeg vil sige, hvis du har så mange transaktioner at du har behov for at lave den slags automatisk, så bør du kukke på f.eks. regnskabsprogrammet Summa Sumarum fra stones der dels kan dette og en del mere, ellers gør det manuelt
Glem lige det med betalingsbetingelserne. Kunne se af dit oplæg at det er lb. måned + 15 dage (men hvorfor angive selve datoen, når du har angivet betalingsbetingelserne?)
Jeg ved godt, at designet ikke er færdigt, men når du skal lave det færdigt, bør du overveje at ændre din opstilling med varenumre osv. til at være en tabel med en kolonne pr. oplysning.
Er der ikke en anden måde at gøre det på... Mere jeg ville gerne undgå at skulle indsætte et exel ark i dokumentet, kan man ikke via en makro gøre at on open add +1 to {faknr} and save to filename X:\faknr.doc
Fatter spasser af vb :-)så jeg kan ikke makro selv
Du skal nu ikke bruge noget Excel, men der var noget kode til at generere fakturanumre med. Hvis du ikke vil rode dig ud i nogle former for kode, står den på los manuelos.
Men jeg kan da også anbefale, at du kigger på summa summarum. Det har vi brugt på jobbet på et tidspunkt (hmm... måske bruger vi det stadig).
Jeg har ikke noget mod at benytte koder. Men jeg syntes ikke om måde at skulle gøre det på, altså at skulle hente et nyt doc for at læse et tal, jeg ville hellere bruge et "skjult" felt til det i skabelonen. Hvis det kunne lade sig gøre. /Rex
Du kan ikke bruge et felt til det. Den skal kunne tælle op, hvilket betyder, at du i givet fald skulle have et stort Word-dokument med alle dine fakturaer. Og det er sikkert ikke så smart.
Det er rigtig nok, kan må gøre det på anden måde ?? Den kode du refere til, kan man benytte en normal txt fil istedet for?, og gemmer den dokumentet med faktura nummeret ?
Ja, du kan godt bruge en txt-fil i stedet, men jeg synes måske, at det er lidt fjollet. Og nej, koden, som jeg har henvist til, gemmer ikke dokumentet med fakturanummeret. Men det kan tilføjes.
Din kommentar 14:23:46 - Hvad mener du? Opdatere et felt? Er det, fordi koden blot indsætter nummeret der, hvor markøren står og du gerne vil have det stående et andet sted? For i så fald skal det blot rettes, så nummeret bliver indsat i et bogmærke i stedet i din faktura.
Yeps opdatere det felt "formel" der hedder {faknr}, hvis det kan lage sig gøre... Og hvis det kan lade sig gøre at auto gemme dokumentet med fak nummer så er det bare 10-4, fakturaen bliver lavet som .dot, så ikke at der bliver gemt i orginalen.
evt. kan man gøre så det sker automatsk når man åbner skabelonen (altså at der bliver sat nyt fak. nr, og så bliver gemt) så man bare skal huske at sige ja til at gemme ændinger når man lukker
Det er ikke noget problem at generere fakturanummeret, indsætte det og gemme dokumentet, når det bliver åbnet. Du skal dog lige overveje en ting. Hvad nu, hvis man laver en ny faktura, som ikke er korrekt og den derfor ikke skal gemmes? Skal den altid det og så må brugeren bare skrive i den, at den ikke bliver brugt? For der er så også "brugt" et fakturanummer.
Så må brugeren, lade vær med at fejle :-), det er vel kun skabelonen der bliver opdatert (baseret på filnavn, if doc.name = fak.dot then update {faknr} else;) eller noget ligende
Der sker ingen former for opdatering af skabelonen. Der bliver indsat et nyt fakturanummer i det ny-oprettede dokument, som derefter gemmes i ovenstående sti med fakturanummeret som filnavn.
Filen med fakturanummer (se http://www.eksperten.dk/spm/777861) skal placeres i samme folder som skabelonen. Nedenstående kode skal placeres i skabelonens Document_New event.
Hvis der mangler noget undervejs (f.eks. bogmærket, eller filen med fakturanummer), får brugeren en meddelelse herom og dokumentet bliver lukket uden at være gemt.
******************* Private Sub Document_New() Dim objInvoiceDoc As Document Dim objDoc As Document Dim strNumber As String Dim strInvoiceFile As String Dim strSavePath As String Dim lngNumber As Long
strSavePath = "F:\data\Faktura"
If Dir(strSavePath, vbDirectory) <> "" Then If ActiveDocument.Bookmarks.Exists("faknr") Then Set objInvoiceDoc = ActiveDocument strInvoiceFile = objInvoiceDoc.AttachedTemplate.Path & "\Fakturanummer.doc"
If Dir(strInvoiceFile) <> "" Then Set objDoc = Documents.Open(strInvoiceFile) strNumber = objDoc.Range.Text
If IsNumeric(strNumber) Then lngNumber = CLng(strNumber) lngNumber = lngNumber + 1 objDoc.Range.Text = CStr(lngNumber) objDoc.Close True With objInvoiceDoc .Activate .Bookmarks("faknr").Range.Text = lngNumber .SaveAs strSavePath & "\" & CStr(lngNumber) & ".doc" End With Else MsgBox "Dokumentet med fakturanumre indeholder enten ikke et nummer eller også indeholder dokumentet " & _ "mere end blot et tal.", vbCritical, "Hent fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde filen med fakturanumre (" & strInvoiceFile & "). Kontakt administrator.", _ vbCritical, "Generér fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Bogmærke til indsættelse af fakturanr. mangler. Kontakt administrator.", vbCritical, "Indsæt fakturanummer" ActiveDocument.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde folderen, hvor fakturaen skal gemmes (" & strSavePath & "). Kontakt administrator", vbCritical, "Gem faktura" ActiveDocument.Close wdDoNotSaveChanges End If
Hvor finder jeg den der "skabelonens Document_New event." ting ?? Kan man evt. tilføje ordre nummeret til save path så filnavnet bliver. Ordre nummer-faknr.doc ??
Åbn skabelonen. Klik på Alt+F11. Du står nu i kodevinduet og umiddelbart bør din markør stå i det, der hedder ThisDocument (bør du kunne se til venstre i skærmbilledet). Dobbeltklik på ThisDocument. Du får nu 2 rulleliste samt noget, der ligner et blankt ark. Vælg Document i den første rulleliste. Der sker nu noget i selve kodevinduet, som kommer til at se således ud:
Private Sub Document_New()
End Sub
Det er skabelonens Document_New event, hvor koden skal placeres.
Mht. ordrenummeret, så bliver det jo indtastet, når koden er afviklet og dokumentet er derfor allerede gemt. Så der er lidt med rækkefølgen (men selvfølgelig kan det lade sig gøre; det skal bare gøres på en anden måde).
Jeg har prøvet at indsætte koden, men jeg kan ikke få det til at virke :-( Er der nogle speciele kunstner man skal for at det virker?, Jeg får ikke engang nogle fejlmeldinger.
Du har sat koden ind i skabelonen (altså en fil med .dot som "efternavn")? For når du har gjort det og efterfølgende laver et nyt dokument baseret på skabelonen, bliver koden afviklet. Medmindre dit sikkerhedsniveau er sat til højt og du ikke har placeret skabelonen i en skabelonfolder (som default bliver anset som trusted folder fra Office 2000 - 2003).
Tjek sikkerhedsniveau, hvis du har placeret koden i Document_New-eventet i en skabelon. Format - Makro - Sikkerhed..(et eller andet).
Det hjalp at sætte makro sikkerheden ned. Men nu får jeg følgende fejl, "Run-Time error '6124' You are not allowed to edit this region because document protection is in effect."
Og det er lige det, for jeg benytter jo felter og for at de virker er jeg nød til at låse resten af dokumentet...
Men det undre mig, da feltet faknr jo ikke er låst - og derfor bør kunne opdateres Kan dette omgås på nogle måder ?
Du beskytter jo hele dokumentet til det, der hedder Protected for forms. Det betyder, at man kun kan udfylde formularfelterne. Du skal undlade at beskytte din skabelon og derefter tilføje kode til Document_New-eventet, der beskytter det nye dokument, når fakturanummer er gemt.
Tilføj følgende linje kode:
ActiveDocument.Protect wdAllowOnlyFormFields
efter linjen .Bookmarks("faknr").Range.Text = lngNumber
"Mht. ordrenummeret, så bliver det jo indtastet, når koden er afviklet og dokumentet er derfor allerede gemt. Så der er lidt med rækkefølgen (men selvfølgelig kan det lade sig gøre; det skal bare gøres på en anden måde)."
:-) Hvordan ...? ved at gemme ved afslutning vil jeg gætte, men...
Njaeh, mere noget med at bede om ordrenummeret ved oprettelse af fakturaen. Men hvad vil du bruge ordrenummeret til - en slags søg? For så kunne der måske være en anden mulighed.
Nemmelig lige præsis, det er for at vi har mulighed for at lokalicere fakturaen, hvis den skulle bruges igen, og da vi ikke benyter faktura nummere til referancer men ordre nummere, ville det være fedt at kunne tilkoble ordre nummeret til faktura nummeret, det er nemmelig sådan at der kan ære et kæmpe spring mellem ordre nummere ifht. faktura nummeret da det kun er ordre der bliver sendt til ikke eu lande (norge og sååen) ((ikke spørge hvorfor )).
Og da alle faktura ender på et fælles drev, ville det gøre det meget nemmere for hvem der nu skulle benytte dem, at finde den korrekte.
Men hvis det ikke kan lade sig gøre, så er det oki, lidt øv,, men oki.
Alt kan som udgangspunkt lade sig gøre :-) - også dettte. Jeg ville bare høre hvorfor, fordi der så kan være en anden løsning end at bruge både fakturanummer og ordrenummer som filnavn.
Et dokument indeholder nogle dokumentegenskaber. Nogle af disse kan man se i stifinderen (man kan f.eks. tilføje en kolonne i stifinderen til at vise subject, som er en dokumentegenskab). På den måde kan du faktisk sortere i stifinderen på fakturanummer eller ordrenummer. Måske var det en fordel for dig/jer?
Nej for oftest bliver der søgt efter fakturaen gennem word, og vi er desværre meget begrænset hvad bruger dygtighed angår, samt at vi er begrænset mht. til søg i stifinder oglig. grundet system sikkerhed...
Det var der for at det ville, være fedest at det blev tilknyttet filnavnet...
Det her Q. er totalt ude i måske kan de(t egentlig ladesiggøre osv. Kan man via koder fjerne makroen fra de "færdige" faktura, det er mere kun af nysgeriehed end af praktis, og hvis man kan hvordan?)
Ok. Jeg synes bare, at det er en bedre idé at have 2 kolonner at kigge i. Du kan i øvrigt få vist nøjagtig det samme, når man bruger Word til at åbne med i stedet for stifinder.
Jeg har tilpasset proceduren, så brugeren bliver bedt om at indtaste ordrenummeret, når der genereres en ny faktura.
********* Private Sub Document_New() Dim objInvoiceDoc As Document Dim objDoc As Document Dim strNumber As String Dim strInvoiceFile As String Dim strOrderNumber As String Dim strSavePath As String Dim lngNumber As Long
strSavePath = "F:\data\Faktura"
If Dir(strSavePath, vbDirectory) <> "" Then If ActiveDocument.Bookmarks.Exists("faknr") Then Set objInvoiceDoc = ActiveDocument strInvoiceFile = objInvoiceDoc.AttachedTemplate.Path & "\Fakturanummer.doc"
If Dir(strInvoiceFile) <> "" Then Set objDoc = Documents.Open(strInvoiceFile) strNumber = objDoc.Range.Text
If IsNumeric(strNumber) Then lngNumber = CLng(strNumber) lngNumber = lngNumber + 1 objDoc.Range.Text = CStr(lngNumber) objDoc.Close True With objInvoiceDoc .Activate .Bookmarks("faknr").Range.Text = lngNumber strOrderNumber = InputBox("Indtast ordrenummer", "Ordrenummer på faktura") If strOrderNumber <> "" Then .Bookmarks("ordrenr").Range.Text = strOrderNumber .Protect wdAllowOnlyFormFields .SaveAs strSavePath & "\" & strOrderNumber & "-" & CStr(lngNumber) & ".doc" Else MsgBox "Du indtastede ikke ordrenummrer.", vbExclamation, "Manglende ordrenummer" objInvoiceDoc.Close wdDoNotSaveChanges End If End With Else MsgBox "Dokumentet med fakturanumre indeholder enten ikke et nummer eller også indeholder dokumentet " & _ "mere end blot et tal.", vbCritical, "Hent fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde filen med fakturanumre (" & strInvoiceFile & "). Kontakt administrator.", _ vbCritical, "Generér fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Bogmærke til indsættelse af fakturanr. mangler. Kontakt administrator.", vbCritical, "Indsæt fakturanummer" ActiveDocument.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde folderen, hvor fakturaen skal gemmes (" & strSavePath & "). Kontakt administrator", vbCritical, "Gem faktura" ActiveDocument.Close wdDoNotSaveChanges End If
Set objDoc = Nothing Set objInvoiceDoc = Nothing
End Sub **********
Den færdige faktura indeholder ikke makroen; det gør den bagvedliggende skabelon. Og ja, man kan godt fjerne den bagvedliggende skabelon, men så bliver Normal.dot koblet på i stedet.
Det ville oxe være fint med stifinder, men af administrative/sikkerheds hensyn kan man ikke andet end browse normalt i vores stifinder (citrix miliø og'såen)
Jeg tester koden senere (har kun lige fået sat pc til, efter en uge uden)
Hmm... du ved selvfølgelig bedst, hvad I har gjort/spærret osv., men jeg har virkelig svært ved at tro, at I har spærret for muligheden for at tilføje en kolonne i stifinderen. Og hvis du nu vil teste det, så åbn din stifinder, vælg detaljevisning/details i en folder, højreklik på en kolonneoverskrift. Kan du vælge at få vist andre informationer/kolonner?
Hvorfor kan jeg ikke få mine felter til at beregne automatisk ? Jeg benytter funktionen calculation og har noget der ligener sådan i feltet = b * a + d * c + f * e Hvor felterne indeholder henholdsvis antal og pris af, og calc feltet er så totalen. Det virker finthvis man opdatere feltet :-(
Word opdaterer ikke felter automatisk. Dvs. at du er nødt til at markere felterne og klikke på opdatér (F9) eller sørge for, at felterne automatisk bliver opdateret ved udskrift.
Hvis du smider følgende kode ind i Document_New-eventet, sikrer du, at Opdater ved udskrift er slået til (men så piller du til gengæld også i brugerens opsætning):
Hmm det er det der undre mig, for sådan noget som dato og sådan det kan word godt finde ud af at opdatere ved print. (de faste felter), hvorfor så ikke calc felterne.
Jeg smider koden ind i skabelon feltet, det gør ikke noget at der bliver ændret i den bruger opsætning :-)...
Jeg overvejde noget med, at indsætte en knap, der så opdaterede (doc.opdater.nu-forpokker) og derefter gemte (doc.gem.nu-så.viikkemisterdatating) og slutligt printetde hele pivtøjet (uden knappen) (doc.print.nu-ud)
Men så opdagede jeg at det oxe skulle kodes og så lukkede jeg bare dokumentet, og kørte hjem :-)
Kunne man evt. gøre det på den måde ?
Og nu skal jeg vist oprette et nyt Q så du kan få nogle points, for alle de svar jeg har fået :-)
Det var selvfølig oxe en måde at gøre det på, beskytte hele dokumentet.
jeg ændrede koden til [code] With ActiveDocument .Range.Fields.Update .Save .PrintOut End With [/code] Så virkede det, med feltopdateringerne.
Grunden til at jeg ville en knap i dokumenttet, var at når man havde tastet den sidste oplysning i bunden, så var man lige vedsiden af knappen og såen...
Findes der også en kommando der hedder options.opdaterevedgem ???
Eller kan man komme uden om det på en anden måde (fakturen bliver nemmelig ikke printet (hos dem der laver den) kun gemt, og vedhæftet en mail. For jeg kan ikke finde ud af hvordan jeg skal lave den der værktøjslinie knap ting :-((
Værktøjslinje: Åbn skabelonen. Vælg Vis-Værktøjslinjer-Brugerdefineret-Tilføj-Giv passende navn. Vælg 2. fane. Klik på makro. Find den rigtige makro og træk den ud på den nye værktøjslinje. Voila :-)
Og ja, du kan f.eks. placere koden på Document_Close-eventet. Men det duer vist ikke, hvis de sender fakturaen direkte fra Word (via Filer-Send mail). Så skal du have fat i de øvrige Document-events via kode.
kan jeg tjekke om dokumenter er beskyttet ?, for hvis man kommer til at klikke på "knappen" 2 gange, bliver word forviret (wrong password, eller noget i den henretning), og det resultere i at felterne bliver slettet og det er mega øv :-(((, så hvis jeg kunne lave en If doc = protect, false then do kode else do ingen ting, så ikke at det sker. Og en måde at undgå debug promt hvis man annulere indtastning af ordrenr. /Rex
[code] Private Sub Calc_Click() With ActiveDocument .Range.Fields.Update .Save End With End Sub
Private Sub Document_Close() With ActiveDocument If ActiveDocument.ProtectionType <> wdNoProtection Then .Range.Fields.Update .Unprotect .Protect wdAllowOnlyReading, True, "rexersej" .Save End If
End With End Sub
Private Sub Document_New() Dim objInvoiceDoc As Document Dim objDoc As Document Dim strNumber As String Dim strInvoiceFile As String Dim strOrderNumber As String Dim strSavePath As String Dim lngNumber As Long Options.UpdateFieldsAtPrint = True strSavePath = "F:\DATA\Faktura"
If Dir(strSavePath, vbDirectory) <> "" Then If ActiveDocument.Bookmarks.Exists("faknr") Then Set objInvoiceDoc = ActiveDocument strInvoiceFile = "F:\DATA\Fak.doc"
If Dir(strInvoiceFile) <> "" Then Set objDoc = Documents.Open(strInvoiceFile) strNumber = objDoc.Range.Text
If IsNumeric(strNumber) Then lngNumber = CLng(strNumber) lngNumber = lngNumber + 1 objDoc.Range.Text = CStr(lngNumber) objDoc.Close True With objInvoiceDoc .Activate .Bookmarks("faknr").Range.Text = lngNumber strOrderNumber = InputBox("Indtast ordrenummer", "Ordrenummer på faktura") If strOrderNumber <> "" Then .Bookmarks("ordrenr").Range.Text = strOrderNumber .Protect wdAllowOnlyFormFields .SaveAs strSavePath & "\" & strOrderNumber & "-" & CStr(lngNumber) & ".doc" Else MsgBox "Du indtastede ikke ordrenummrer.", vbExclamation, "Manglende ordrenummer" objInvoiceDoc.Close wdDoNotSaveChanges End If End With Else MsgBox "Dokumentet med fakturanumre indeholder enten ikke et nummer eller også indeholder dokumentet " & _ "mere end blot et tal.", vbCritical, "Hent fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde filen med fakturanumre (" & strInvoiceFile & "). Kontakt administrator.", _ vbCritical, "Generér fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Bogmærke til indsættelse af fakturanr. mangler. Kontakt administrator.", vbCritical, "Indsæt fakturanummer" ActiveDocument.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde folderen, hvor fakturaen skal gemmes (" & strSavePath & "). Kontakt administrator", vbCritical, "Gem faktura" ActiveDocument.Close wdDoNotSaveChanges End If
Set objDoc = Nothing Set objInvoiceDoc = Nothing
End Sub [/code]
Men jeg oplever når at jeg åbner en gemt faktura, og så lukker den at den melder at koden er forkert :(, og når jeg så tager F11 kan jeg se at den ikke overføre if delen af koden :(
Ti-hi, du skal lige kigge på din if-sætning (og undskyld det lille fnis; det er ikke ment så hårdt). Jeg kommenterer:
I første linje spørger du på, om beskyttelse er forskellig fra ingen beskyttelse (dvs. at hvis koden går ind i if-delen, så er dokumentet beskyttet).
If ActiveDocument.ProtectionType <> wdNoProtection Then
Så forsøger du at opdatere felterne (og vi har lige konstateret at dokumentet ER beskyttet .Range.Fields.Update
Så fjerner du beskyttelsen .Unprotect
For derefter at sætte den på igen med det samme .Protect wdAllowOnlyReading, True, "rexersej" .Save ******* Flyt Unprotect op til før .Range.Fields.Update, så skulle den være hjemme :-)
verdammt jeg har overhoved ikke skænket <> en tanke, jeg skal jo "bare" rette <> til == så hvis dokumentet ikke er beskyttet, så skal det beskyttes.
"Flyt Unprotect op til før .Range.Fields.Update, så skulle den være hjemme :-)" Hvis jeg gør dette, så tja bliver felterne rydet :( det var det problem jeg havde tidliger.
Jeg tror at jeg prøver at skiftet <> ud med == og ser om ikke det virker, ellers så smider jeg en "else" ind og samler koden der 8}.
Det er fordi at der kom en fejl hvis jeg prøvede at protecte et protecet dokument. (jeg protecter det jo for at felterne ikke skal blive slettet), derfor hæver jeg beskyttelsen, og derefter ligger jeg beskyttelse med kode på :-()
Tror at det er den rigtigeste måde at gøre det på ;)
Hvorfor bliver if sætningen ikke overført til selve fakturen ???? Den er i min skabelon, men ikke i min færdige skabelon :(, dette gør at jeg får en debug promt, vedr. forkert password
Aha.... så det er ikke, fordi du ikke får opdateret felterne, men "alene" fordi du ville tjekke om arket var beskyttet. Du skal nok flytte lidt rundt på det, se her:
.Range.Fields.Update If ActiveDocument.ProtectionType = wdnoprotection then .protect wdallowonlyreading, true, "rexersej" .Save *******
Hvad mener du med, at din if-sætning ikke bliver overført til fakturaen? Og hvad pokker mener du med, at den er i skabelonen, men ikke den færdige skabelon? Du arbejder da vel forhåbentlig kun med én skabelon og nix weiter?
Jo selvfølig har jeg kun en skabelon, det er jo faktura jeg mener, dumme mig :)
den kode der er i den endelige faktura er
[code] Private Sub Calc_Click() With ActiveDocument .Range.Fields.Update .Save End With End Sub
Private Sub Document_Close() With ActiveDocument .Range.Fields.Update .Unprotect .Protect wdAllowOnlyReading, True, "rexersej" .Save
End With End Sub
Private Sub Document_New() Dim objInvoiceDoc As Document Dim objDoc As Document Dim strNumber As String Dim strInvoiceFile As String Dim strOrderNumber As String Dim strSavePath As String Dim lngNumber As Long Options.UpdateFieldsAtPrint = True strSavePath = "F:\DATA\Faktura"
If Dir(strSavePath, vbDirectory) <> "" Then If ActiveDocument.Bookmarks.Exists("faknr") Then Set objInvoiceDoc = ActiveDocument strInvoiceFile = "F:\DATA\Fak.doc"
If Dir(strInvoiceFile) <> "" Then Set objDoc = Documents.Open(strInvoiceFile) strNumber = objDoc.Range.Text
If IsNumeric(strNumber) Then lngNumber = CLng(strNumber) lngNumber = lngNumber + 1 objDoc.Range.Text = CStr(lngNumber) objDoc.Close True With objInvoiceDoc .Activate .Bookmarks("faknr").Range.Text = lngNumber strOrderNumber = InputBox("Indtast ordrenummer", "Ordrenummer på faktura") If strOrderNumber <> "" Then .Bookmarks("ordrenr").Range.Text = strOrderNumber .Protect wdAllowOnlyFormFields .SaveAs strSavePath & "\" & strOrderNumber & "-" & CStr(lngNumber) & ".doc" Else MsgBox "Du indtastede ikke ordrenummrer.", vbExclamation, "Manglende ordrenummer" objInvoiceDoc.Close wdDoNotSaveChanges End If End With Else MsgBox "Dokumentet med fakturanumre indeholder enten ikke et nummer eller også indeholder dokumentet " & _ "mere end blot et tal.", vbCritical, "Hent fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde filen med fakturanumre (" & strInvoiceFile & "). Kontakt administrator.", _ vbCritical, "Generér fakturanummer" objInvoiceDoc.Close wdDoNotSaveChanges End If Else MsgBox "Bogmærke til indsættelse af fakturanr. mangler. Kontakt administrator.", vbCritical, "Indsæt fakturanummer" ActiveDocument.Close wdDoNotSaveChanges End If Else MsgBox "Kan ikke finde folderen, hvor fakturaen skal gemmes (" & strSavePath & "). Kontakt administrator", vbCritical, "Gem faktura" ActiveDocument.Close wdDoNotSaveChanges End If
Set objDoc = Nothing Set objInvoiceDoc = Nothing
End Sub [/code] Selvom koden i skabelonen indeholder, if sætningen og det er det der undre mig :-? at den så ikke ender i det endelige dokument...
Jeg har også prøvet at se om jeg kunne if'e mig ud af debug'en ved annulering af ordrenummer, men så gik det helt i fisk øv øv...
Jeg prøve med den nye if sætning i morgen når jeg er tilbage på arb.
1. Hvad er det for en if-sætning, vi taler om? 2. Og hvorfor skal en if-sætning ende i det endelige dokument? (eller er det bare mig, der ikke forstår, hvad du mener?) 3. Hvilken debug - hvordan annullering af ordrenummer?
Denne er i skabelonen. [code] Private Sub Document_Close() With ActiveDocument If ActiveDocument.ProtectionType <> wdNoProtection Then .Range.Fields.Update .Unprotect .Protect wdAllowOnlyReading, True, "rexersej" .Save End If
End With End Sub [/code]
Men når man åbner fakturen (den færdige) har jeg kun denne.
[code] Private Sub Document_Close() With ActiveDocument .Range.Fields.Update .Unprotect .Protect wdAllowOnlyReading, True, "rexersej" .Save
End With End Sub [/code] Det giver desvære en error når man lukker, da koden jo prøver at unprotecte en kode beskyttet dokument uden at have koden...
Egentlig ville det jo være fedest at koden slet ikke blev kørt, da fakturen jo er "færdig".
Jeg får følgende hvis jeg starter en faktura, og der efter vælger at lukke på [x] når der bliver spurgt efter ordrenr. Det kan ikke lade sig gør at fjerne beskyttelsen fra et ikke beskyttet dokument, eller nget i den henretning.
Men jeg tror at det er noget der hænger sammen med min close kode.
[code] Private Sub Document_Close() Dim objInvoiceDoc As Document Dim objDoc As Document With ActiveDocument If ActiveDocument.ProtectionType <> wdNoProtection Then .Range.Fields.Update .Save Else .Protect wdAllowOnlyReading, True, "rexersej" .Range.Fields.Update .Save End If End With Set objDoc = Nothing Set objInvoiceDoc = Nothing End Sub [/code] Og det fjernede onclose fra den færdige fakture....
Jeg bliver lidt småbekymret, når du siger, at du har en kode i skabelonen og en anden i fakturaen.... Fakturaen skulle jo gerne være baseret på skabelonen og dermed have fat i koden derigennem. Der skal ikke være nogen kode i selve dokumentet (tjek lige, om din faktura rent faktisk har fat i skabelonen).
Mht. om Close-koden skal køre eller ej, så kan man godt lægge en lille tjekker ind, så den "bare" springer Close-koden mere eller mindre over, hvis det nu er en faktura, man bare har åbnet for at kigge lidt i/print.
LOL for at det ikke skal være løgn, så virker den kode jeg har sat ind ikke helt alligevel, da den ikke spærre dokumentet ??
Jeg er faktisk endnu mere forbløffet, over måden at den "opføresig" Men jeg gætter at det er fordi at word køre via en citrix, men jeg tør ikke garantere at det er derfor, dog ved jeg at koden bliver ført over i fakturaen :(, eller retter det virker som om at skabelone ligger åben bagved/bliver åbnet samtidig med eller noget der ligner. Hverfald har jeg begge i VB kode vinduet. Og jeg bruger den kode jeg har pastet tidligere.
Jeg smider lige enfærdig fak på nettet, så kan du se hvad jeg mener.
Det er sådan set rigtigt, at du har adgang til både skabelonen og din faktura i kodevinduet. Fakturaen har nemlig fat i skabelonen, og der adskiller Word sig fra både Excel og Powerpoint.
At Word kører via citrix skulle ikke give nogle problemer (jeg har op til flere løsninger kørende på citrix).
Det er i øvrigt et "dårligt link", du har postet. Gider du prøve igen eller sende mig dine filer, så jeg evt. kan rode lidt i dem? lemontree snabelting jubii dot dk (udskift de relevante steder *s*)
Har siddet og rodet med det på et tidspunkt; måtte så lægge det fra mig og nulstillede åbenbart hukommelsen. Det beklager jeg. Men nu har jeg kigget på det igen. Lav din Document_Close om til følgende:
Private Sub Document_Close() With ActiveDocument If .Type <> wdTypeTemplate Then If .Path <> "" Then If .ProtectionType <> wdAllowOnlyReading Then .Range.Fields.Update .Unprotect .Protect wdAllowOnlyReading, True, "rexersej" .Save End If End If End If End With End Sub
Så kører opdateringskoden ikke, når du har lukker en "gammel faktura", der allerede er opdateret, gemt og beskyttet. Den kører heller ikke, hvis det er en faktura, hvor man har trykket på Cancel/Annullér i inputboxen (tager jeg hånd om ved at spørge på, om dokumentet har en sti - hvis ikke den har det, er den ikke gemt og skal derfor heller ikke gemmes).
Hov, jeg mangler da at melde tilbage... Jeg fandt fejlen (mht. at den fangede den gl. skabelon) det var forde at jeg havde kopieret skabelonerne til mit H: drev, hvilket viste sig til at oxe være skabelon mappen (tosset opsætning fra IT side), så derfor referede fakturaen jo logsik til den skabelon der lå der da den jo var trusted :-)
Rex takke og bukker endnu en gang.
Ps. jeg poster lige et link til en færdig skabelon så andre der måske ville bruge en sådanne kan kigge på den
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.