Avatar billede 220661 Ekspert
17. oktober 2009 - 18:31 Der er 17 kommentarer og
1 løsning

Automatisk nummer i faktura skabelon (Excel 2007)

Jeg har lavet en fakturaskabelon i Excel 2007 med 5 faner. De tre første faner er faktura sider 1 til 3. De sidste 2 er en prisliste og en timeberegner. Skabelonen virker fint, men jeg mangler en makro til at oprette det fortløbende nummer. Jeg har forsøgt at løse problemet, men jeg kører fast hele tiden. Mit problem har været, at selvom tekstfilen er oprettet, så kan den ikke "ses" når makroen køres. Tekstfilen ligger i c drevet og hedder "fakturanummer.txt". Så det jeg kunne tænke mig er flg.:
Makroen skal hente værdien i "fakturanummer.txt" og indsætte værdien i celle G7 i det første ark. Herefter forhøjes værdien med en i tekstfilen, og den gemmes til næste gang makroen køres.
Maskinen kører xp pro med sevicepack 3. Jeg kan sagtens sende filen hvis det letter arbejdet.
Jeg håber jeg finder en løsning på mit problem.
Avatar billede claes57 Ekspert
17. oktober 2009 - 19:02 #1
jeg har en tilsvarende makro, der navngiver mine skriv.
Så det kan lade sig gøre. Du skal bruge den fulde/korrekte sti til filen (dvs dos-forkortet uden mellemrum)
Min kode er (jeg har win7), og i sti$ ligger en nytnavn.txt med en enkelt linje med et tal.

sti$ = "C:\Users\Christian\Documents\Skabeloner"
Init$="CL"
Open sti$ + "nytnavn.TXT" For Input As 1
Input #1, aktnavn
Close 1
aktnavn = aktnavn + 1
Open sti$ + "nytnavn.TXT" For Output As 1
Write #1, aktnavn
Close 1
nvn$ = WordBasic.[Right$]("0000" + WordBasic.[LTrim$](Str(aktnavn)), 4)
NyNavn$ = LCase("B" + nvn$ + Init$ + ".DOC")
WordBasic.FileSaveAs Name:=sti$ + NyNavn$, Format:=0

så har du et NyNavn$ af typen b000xCL.DOC - som kan bruges. Du skal bare huske, at hvis dit ark hedder "mappe*.xls" så skal makro køres - hedder det noget andet, så må makro ikke køres (den skal jo kun køre en gang pr faktura)
Jeg afslutter med at gemme med det nye navn - så kan bruger bare klikke GEM uden at der sker noget. Du kan evt brug FAK0000.XML som navneskabelon i næstsidste linje.
Avatar billede 220661 Ekspert
17. oktober 2009 - 19:18 #2
Hej Claes, jeg er godt klar over makro kun skal køre en gang pr. faktura, for ellers vil tabellen jo ikke passe. Men jeg må indrømme, jeg er fuldstændig nybegynder i at lave formler.
Den linie jeg har til at hente oplysningen er: Open "C:\FakNr.txt" For Input As #1.
Er det ikke nok for at henvise til den adresse den har på roden af c drevet?
Avatar billede excelent Ekspert
17. oktober 2009 - 19:50 #3
Denne gemmer fakturanummer i et defineret navn "faknr"
Det opdateres hver gang Projektmappen åbnes, men kan også
opdatere ved lukning af projektmappe eller ved udskrift
eller via en knap....

Private Sub Workbook_Open()
x = WorksheetFunction.Substitute(Names("faknr"), "=", "") + 1
Names.Add Name:="faknr", RefersToR1C1:=x
End Sub

Koden indsættes i ThisWorkbook modulet
I arket taster du =faknr
Avatar billede excelent Ekspert
17. oktober 2009 - 19:55 #4
Du skal lige selv oprette navnet faknr
og så taste et tal 1 mindre end du vil starte med i feltet
Refererer til fx. =0
Avatar billede claes57 Ekspert
17. oktober 2009 - 21:18 #5
ok - du kan bruge starten:
fil$ = ""C:\FakNr.txt"
Open fil$ For Input As 1
Input #1, aktnavn
Close 1
aktnavn = aktnavn + 1
Open fil$ For Output As 1
Write #1, aktnavn
Close 1

og du kan for den sag skyld bruge (c:\) (x:\) som et fælles net-drev, hvis der er flere der skal bruge samme makro.
Det vigtige er bare at åbne filen, læse tallet, og lukke - åbne for at skrive og så opdatere inden andre brugere er på banen - og i mindre netværk er denne løsning ok.
Det må være op til excelent at bygge sin kode ind i min makro - umiddelbart er det noget rod.
Avatar billede 220661 Ekspert
17. oktober 2009 - 22:29 #6
Det er sådan, at når jeg skriver regninger, så kan det forekomme jeg jeg skriver i skabelonen over flere gange, og så bliver de gemt som "prøvefakturaer". Det er derfor jeg hælder til fil versionen, da fakturanummeret kun frigives når makroen køres. og det er kun mig der bruger programmet. Jeg kunne godt selv skrive nummeret i fakturaen, men det ville være smart hvis en makro gjorde det. Og i øvrigt, så har jeg ind imellem flere fakturaer jeg arbejder i, så det er vel ikke så smart at det er selve arket der tæller hvor langt jeg er nået til. Jeg har forsøgt at lægge din ide ind på skabelonen Claus, og kørt makroen. Men som jeg har oplevet før skriver den file not found. Her er det der står i vba editoren. Den ligger i ark 1 (faktura):

Private Sub Workbook_Open()
Sub makro1()
fil$ = "C:\FakNr.txt"
Open fil$ For Input As 1
Input #1, aktnavn
Close 1
aktnavn = aktnavn + 1
Open fil$ For Output As 1
Write #1, aktnavn
Close 1
End Sub

Jeg har ikke så meget forstand på det, så jeg må høre med jer hvad der kan være galt.
Avatar billede 220661 Ekspert
17. oktober 2009 - 22:33 #7
Undskyld Claes, jeg kom vist til at skrive Claus. Min fejl
Avatar billede 220661 Ekspert
17. oktober 2009 - 22:42 #8
Kunne det hjælpe, hvis i havde min skabelon til rådighed?
Avatar billede claes57 Ekspert
18. oktober 2009 - 11:36 #9
ok.
din makro skal IKKE hedde Workbook_Open(), da den så kører automatisk hver gang regnearket åbnes. Kald den fx FaktNr()
og du skal oprette en fil med en linje i - brug notebook til det - på første linjer skriver du bare tallet på den senest brugte faktura, og taster Enter, så cursor kommer ned på linje 2.
Gem så denne fil som c:\faknr.txt
Så skal makroen kunne køres - pt opdaterer den kun fakturanummer-filen, men skriver ikke tallet i regnearket. Herudover gemmer jeg regnearket med fakturanummer i navn - så kan du have flere kørende, og arbejde i dem som du vil.

Sub FakNr()
' FakNr Makro
' tildeler fakturanummer i feltet G7
Range("G7").Select
If ActiveCell.Value <> "" And IsNumeric(ActiveCell.Value) Then
' ingenting - er kørt tidligere bare sæt cursor i G8
  Range("G8").Select
Else
' opdater fakturanummer, og skriv i G7
  fil$ = "C:\FakNr.txt"
  Open fil$ For Input As 1
  Input #1, aktnavn
  Close 1
  aktnavn = aktnavn + 1
  Open fil$ For Output As 1
  Write #1, aktnavn
  Close 1
  ActiveCell.FormulaR1C1 = aktnavn
  Range("G8").Select
' navngiv regnearket til Fak0000x.xls, og gem det i sti
' tilpas stien til dit brug
  sti$ = "C:\Users\Christian\Documents\"
  filnavn$ = Right("00000" + Trim(Str(aktnavn)), 5)
  NyNavn$ = LCase("Fak" + filnavn$ + ".xls")
  ActiveWorkbook.SaveAs Filename:=sti$ + NyNavn$, _
    FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False
End If
End Sub

I excel laver du nu en genvej til din makro, så den er til at få fat på. Klik på Office-knappen, og vælg excel-indstillinger nede til højre.
Klik på Tilpas i listen.
I de to lister med ting vælger du i den venstre Makroer i toppen.
I den til højre 'Til alle dok (standard)'
Marker makroen FakNr vil venstre, og klik på tilføj.
Gem, og du vil have en hurtig adgang til makroen fra alle dine kommende fakturaer oppe ved Officeknappen.
Avatar billede 220661 Ekspert
18. oktober 2009 - 16:55 #10
Hej Claes.
Jeg har forsøgt at paste din makro ind i min skabelon, og rettet den til så den passer til de mapper jeg bruger.
Jeg har kontrolleret at txt filen på C revet eksisterer, og har de rette parametre, så den skulle passe til de oplysninger der står i koden.
Når koden køres markeres feltet G7 i arket, og der kommer en tekstboks der siger file not found. Jeg har forsøgt at hente data manuelt. Og her kan Excel sagtens se filen og indsætte den. Hvis jeg gør det manuelt, laver den dog om på cellens størrelse.
Har du nogle ideer til hvad problemet er?
Kan problemet skyldes indstillinger i Excel, eller mangler jeg nogle opdateringer, eller hvad kan være galt?
Avatar billede claes57 Ekspert
18. oktober 2009 - 17:57 #11
pak regneark og faknr.txt i en zip-fil, og post den til mig - så ser jeg på det (efter F1-løbet).
claessoe@gmail.com
Avatar billede 220661 Ekspert
18. oktober 2009 - 18:23 #12
Filerne er sendt
Avatar billede claes57 Ekspert
18. oktober 2009 - 20:41 #13
ok - der er fejl i filen til fakturanummer.
den hedder
FakNr.txt.txt
fordi du har gemt den son faknr.txt og notebook har tilføjet .txt.
Lav en ny med 12029 i linjen, og gem det bare via notesbog som faknr (da .txt automatisk sætte på)

Microsoft synes for nogle år siden, at det var smart at skjule filendelser - det er de så ene om - det er dybt dumt.
Det kan slås fra via stifinder - men m$ har fortsat med det i vista og win7 - så de må tro på det - ingen andre gør det.
Avatar billede 220661 Ekspert
18. oktober 2009 - 23:22 #14
Hej Claes.
Ja nu skriver den fakturanummeret ud i arket som jeg havde håbet på. Og tekstfilen forhøjes med 1, som jeg også havde håbet på. Jeg må indrømme jeg ikke tænkte på den fælde der med navnet. Tusind tak for din indsats.  Du har så sandelig  fortjent pointene. Jeg er ny her på sitet, så hvordan får jeg tildelt dem til dig?
Avatar billede 220661 Ekspert
19. oktober 2009 - 00:51 #15
Hej Claes
Det fungerer 100 procent med tælleren.
Hvordan får man den til at autosave som:

"fakturanummer" + "Arkets oprindlige navn" i følgende mappe:
I:\Dokumenter\John\Arne Bech regninger\Færdige fakturaer

Får jeg det med er det helt perfekt.
Avatar billede claes57 Ekspert
19. oktober 2009 - 11:13 #16
jeg har lagt et svar nu - det skal du acceptere for at give point.
vedr navn på ark - vi retter lige i slutningen fra:
' navngiv regnearket til Fak0000x.xls, og gem det i sti
' tilpas stien til dit brug
  sti$ = "C:\Users\Christian\Documents\"
  filnavn$ = Right("00000" + Trim(Str(aktnavn)), 5)
  NyNavn$ = LCase("Fak" + filnavn$ + ".xls")
  ActiveWorkbook.SaveAs Filename:=sti$ + NyNavn$, _
    FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False

og over til:
' navngiv regnearket til Fak0000x + originalnavn.xls, og gem det i sti
' tilpas stien til dit brug
  sti$ = "C:\Users\Christian\Documents\"
  glnavn$ = Mid(CELL("filename"), Search("[", CELL("filename")) + 1, Search("]", CELL("filename")) - Search("[", CELL("filename")) - 1)
  filnavn$ = Right("00000" + Trim(Str(aktnavn)), 5)
  NyNavn$ = LCase("Fak" + filnavn$ + glnavn$)
  ActiveWorkbook.SaveAs Filename:=sti$ + NyNavn$, _
    FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False

der er indsat linjen med glnavn$= (det er en linje ned til filnavn$), og NyNavn$ er rettet
Avatar billede claes57 Ekspert
19. oktober 2009 - 11:15 #17
obs - ret lige i
NyNavn$ = LCase("Fak" + filnavn$ + glnavn$)
så vi dropper lcase - det sætter bare ned til små bogstaver
NyNavn$ = "Fak" + filnavn$ + glnavn$
Avatar billede claes57 Ekspert
19. oktober 2009 - 14:10 #18
den nye kode (ovenstående 2 svar) virker ikke - fejl i m$-hjælpefilen. Det følgende er testet, og virker

' navngiv regnearket til Fak0000x_originalnavn.xls, og gem det i sti
' tilpas stien til dit brug
  sti$ = "C:\Users\Christian\Documents\"
  glnavn$ = ActiveWorkbook.FullName
  pos = InStrRev(glnavn$, "\")
  glnavn$ = Mid(glnavn$, pos + 1, Len(glnavn$))
  filnavn$ = Right("00000" + Trim(Str(aktnavn)), 5)
  NyNavn$ = "Fak" + filnavn$ + "_" + glnavn$
  ActiveWorkbook.SaveAs Filename:=sti$ + NyNavn$, _
    FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False


husk lige at rette sti$ til.
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