If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below. |
|
|
Thread Tools | Display Modes |
#11
|
|||
|
|||
Auto Number in Invoice
Hi
Thanks for replying everyone E5 cell contains (or will hopefully contain) the auto invoice number. My customer details are hopefully going to come from access database (but i havent started that connection yet). So basically it is just one cell i need the code for. I have tried jiggling that code but again the template is opening up with cell E5 blank. I will try all different things to see if i can get it to work somehow - it will not get the better of me. It would be good if this autonumber thing was included within excel - similar to the auto date function. As it seems a lot of people have the same issue. "JLatham" wrote: You may be thinking of Access's AutoNumber type which is an auto-numbering feature that can be used in tables for a variety of purposes, the most typical being that of providing a unique key field value for a table. To the best of my knowledge there is no built in function to simply auto-increment a value in Excel based on some action like the opening of a workbook. Excel contains many incredibly powerful functions; I've an internet acquaintance that has kind of put me to shame several times in coming up with a one-line cell formula (albeit somewhat complex usually) to do what I took many lines of VBA code to achieve. But in some instances there are simply things that cannot be done with a worksheet function. I believe this is one of them. Now there is a simple formula such as =A1+1 which would add one to the value in A1 ... but A1 has no real way of getting automatically updated, so the value in the cell with the formula in it never really changes either. There is no command like =ME+1 which is my fictitious way of creating a formula that would increment itself. I've seen many ways to try to set up an auto-incrementing scheme, and all that I remember are coded at some level or another. Besides the use of a text file here to hold the last used invoice number, one way I've seen is to use Excel's Define Names function to store the value in a Name within the workbook itself. That's a neat little way to do it also, but involves code also. Other schemes involve using a hidden cell somewhere to hold the last invoice number used and then take that value and increment it when the workbook is opened or when the user chooses to run a macro to assign the next invoice number to a cell. Again, some code is required. There are basically two issues to be dealt with in trying to get an auto incrementing number that is persistent between uses of the workbook: #1 - determining where to store the value that is the basis for the next number in sequence, and #2 - determining/controlling exactly when that number is incremented. It would appear that it takes some VBA code to provide this functionality. "lizard1socal" wrote: isnt there an easier way to add a formula into the cell where the invoice number is shown on the template to create auto numbering ? Real confused here, looks like programing to me. Thought Excel was already complete with automating codes for this sort of problem ? -- lizard1socal "JLatham" wrote: Aha! In the definition for Const sDEFAULT_PATH, get rid of the and at the beginning and end of the string - they should not be in there. It should look like this: Const sDEFAULT_PATH As String = "C:\Documents and Settings\Compaq_Owner\My Documents\Garage Repair Service\Invoices" Plus, you remember that your own SetUpNewClient routine has to be run from Tools | Macro | Macros I messed with this some, and tried to 'read your mind' a little, I may have failed at that. I'm assuming that a customer/client's name is going to be in E5 or else E5 may be totally empty. This code takes both cases into account. I moved the Const declarations out of the sub into the body of the module and made them Public Constants so that both routines can reference them to get their values. I didn't change too much in the Function but I beat up on the Sub a bit to get it to decide whether to use whatever is in E5 as the basis for a filename, to see if it exists already (existing customer) or if this is a new customer and starting from ground zero. Hopefully the comments will explain it all well enough. Here goes - replaces all that you currently have (the board will rpobably wreak havoc on some of the longer lines of code, watch out - like your path should all be on a single line, the rest I think I broke properly) Just in case, I uploaded a working version that you can get he http://www.jlathamsite.com/uploads/for_pammij.xls Public Const sDEFAULT_PATH As String _ = "C:\Documents and Settings\Compaq_Owner\My Documents\Garage Repair Service\Invoices\" Public Const sDEFAULT_FNAME = "inv no.txt" Public Function NextSeqNumber(Optional sFileName As String, _ Optional nSeqNumber As Long = -1) As Long Dim nFileNumber As Long nFileNumber = FreeFile If IsMissing(sFileName) Or sFileName = "" Then sFileName = sDEFAULT_FNAME End If If InStr(sFileName, Application.PathSeparator) = 0 Then sFileName = sDEFAULT_PATH & Application.PathSeparator _ & sFileName End If If nSeqNumber = -1& Then If Dir(sFileName) "" Then Open sFileName For Input As nFileNumber Input #nFileNumber, nSeqNumber nSeqNumber = nSeqNumber + 1& Close nFileNumber Else nSeqNumber = 1& End If End If On Error GoTo PathError Open sFileName For Output As nFileNumber On Error GoTo 0 Print #nFileNumber, nSeqNumber Close nFileNumber NextSeqNumber = nSeqNumber Exit Function PathError: NextSeqNumber = -1& End Function Public Sub SetUpNewClient() Dim ClientInvoiceNumberFile As String Dim SequenceNumberMinus1 As Long Dim sFileName As String Dim nFileNumber As Integer With ThisWorkbook.Sheets(1) If IsEmpty(.Range("E5")) Then 'will force read from default .txt file ClientInvoiceNumberFile = sDEFAULT_FNAME Else 'will read from specified file ClientInvoiceNumberFile = .Range("E5") & ".txt" End If sFileName = sDEFAULT_PATH & Application.PathSeparator _ & ClientInvoiceNumberFile If Dir$(sFileName) = "" Then 'file does not exist, New Customer! 'create unique file for them nFileNumber = FreeFile() Open sFileName For Output As nFileNumber Print #nFileNumber, 849 ' to start at 850 for new customers Close #nFileNumber Else 'the file exists and so we 'presume it is an existing customer with 'existing invoice number in it 'and we DO NOTHING End If 'now we have a file that exists and 'it has some number in it 'call the function to do the work .Range("B2").Value = NextSeqNumber(sFileName, -1) End With End Sub "Pammi J" wrote: Hi and many thanks for your quick reply. I have done that and saved my invoice as a template but when i open there is no number in my e5 cell. Here is the code i put in Have i done something wrong - my macro security is med and firewall ect is not preventing macros from running. Public Function NextSeqNumber(Optional sFileName As String, Optional nSeqNumber As Long = -1) As Long Const sDEFAULT_PATH As String = "C:\Documents and Settings\Compaq_Owner\My Documents\Garage Repair Service\Invoices" Const sDEFAULT_FNAME As String = "inv no.txt" Dim nFileNumber As Long nFileNumber = FreeFile If sFileName = "" Then sFileName = sDEFAULT_FNAME If InStr(sFileName, Application.PathSeparator) = 0 Then _ sFileName = sDEFAULT_PATH & Application.PathSeparator & sFileName If nSeqNumber = -1& Then If Dir(sFileName) "" Then Open sFileName For Input As nFileNumber Input #nFileNumber, nSeqNumber nSeqNumber = nSeqNumber + 1& Close nFileNumber Else nSeqNumber = 1& End If End If On Error GoTo PathError Open sFileName For Output As nFileNumber On Error GoTo 0 Print #nFileNumber, nSeqNumber Close nFileNumber NextSeqNumber = nSeqNumber Exit Function PathError: NextSeqNumber = -1& End Function Public Sub SetUpNewClient() With ThisWorkbook.Sheets(1) .Range("B2").Value = NextSeqNumber(.Range("E5").Value & ".txt", 849) End With End Sub "JLatham" wrote: Sounds like your problem is with the two Const statements at the beginning of the function? ----- Const sDEFAULT_PATH As String = "your path here" Const sDEFAULT_FNAME As String = "defaultseq.txt" ----- The first one should be set to the path to where the text file containing the sequence of numbers is kept. The "your path here" part should actually look something like this: "C:\Documents and Settings\PammiJ\My Documents\" For the second line, yes you need to create a file somewhere (in the folder pointed to by the first line) and all it needs to contain initially is the first invoice number you want to use, minus 1. Create the file using Notepad: open Notepad, start a new file, just type a number into it (assume you want invoices to start at 1, type 0 into it). Then use Save As to give it a name like the one he suggested or you could give it some other name like PammiJs_InvoiceNumbers.txt and save it in the path you have decided on. Close Notepad. Now your first two lines in that function should look something like this: Const sDEFAULT_PATH As String = "C:\Documents and Settings\PammiJ\My Documents\" Const sDEFAULT_FNAME As String = "PammiJs_InvoiceNumbers.txt" I think the McGimpsey page uses cell B2 as the one where the invoice number is to appear, just change "B2" in his sample code to "E5" and it should work. Only thing that might keep it from working is your Macro Security - make sure macros are permitted to run - best setting that's a balance of security and convenience is MEDIUM where you are prompted when the workbook is opened whether or not to let macro code execute. That will keep you from being unpleasantly surprised if someone sends you an Excel workbook with code in it that you weren't expecting. One other thing that can also keep macros from running these days is your anti-virus application. Some of those have a setting in them that prevents VBA code from running, and if yours is one of those (I use Kaspersky Business Optimal and it has such a setting) then you'll need to set it to allow you to run the code. "Pammi J" wrote: Hi hope someone can help me. I have an invoice i have designed and the last bit i need before i use it is to assign a invoice number to the template and have it automatically increase by one everytime - ie 101 would be 102 on opening the next time. i have read McGimpseys page and used the code - i put it in the this workbook part but its not doing anything. Have i got the right code or do i need any other bits to go with it? Also i dont understand what `text` file i need - as its saying to create one? and what is default path as string - is that where i type where my template is. Sorry im a newbie to invoice numbering. but i only need this and then i can move on to other things. many thanks |
#12
|
|||
|
|||
Auto Number in Invoice
JLatham,
Appreciate the reply, although as a simple user didnt understand it all , but got the jest of what you wrote. My next question is that , in Excel there is a business invoice template that has the area for the invoice number, and shows a number in the template. Now if the template has and shows the number, isnt there someway to activate that cell with an auto number formula ? ( a new users question,basically ignorant here ) Thx for your help, undrstanding and patience with us of lessor knowledge ! LIZARD1SOCAL |
#13
|
|||
|
|||
Auto Number in Invoice
Assuming Invoice numbers are stored in cells A1 through A99, the formula -
=MAX(Data!$A$1:$A$999)+1 will give you the next available Invoice number. Regards. Bill Ridgeway Computer Solutions |
#14
|
|||
|
|||
Auto Number in Invoice
Thats exactly what im after Lizard1socal - exactly what that template does
with the invoice number - unfortunatly i cant get into it - its asking for a password "lizard1socal" wrote: JLatham, Appreciate the reply, although as a simple user didnt understand it all , but got the jest of what you wrote. My next question is that , in Excel there is a business invoice template that has the area for the invoice number, and shows a number in the template. Now if the template has and shows the number, isnt there someway to activate that cell with an auto number formula ? ( a new users question,basically ignorant here ) Thx for your help, undrstanding and patience with us of lessor knowledge ! LIZARD1SOCAL |
#15
|
|||
|
|||
Auto Number in Invoice
This works sort of
Private Sub Workbook_Open() Range("E5") = Range("E5") + 1 End Sub It does what you want if you open the *.xlt original. Not if you open a *.xls copy (File., New). Where do I find the McGimpseys code page you are copying from? Maybe we can both learn something. Lou "Bill Ridgeway" wrote: Assuming Invoice numbers are stored in cells A1 through A99, the formula - =MAX(Data!$A$1:$A$999)+1 will give you the next available Invoice number. Regards. Bill Ridgeway Computer Solutions |
#16
|
|||
|
|||
Auto Number in Invoice
Pammi J
Check out what Bill Ridgeway erote and tell me what you think ? Sounds like he may have something !? -- lizard1socal "Pammi J" wrote: Thats exactly what im after Lizard1socal - exactly what that template does with the invoice number - unfortunatly i cant get into it - its asking for a password |
#17
|
|||
|
|||
Auto Number in Invoice
Wouldn't the Workbook_Open() event method increment the invoice number in E5
each time you opened the book, i.e., File | Open. And that leads to the problem of controlling when it increments: You have a template file .xlt with 0 in E5 you create a new invoice from it and set invoice number to 1, fill it in and send it out. Later you have to open up the .xls file and suddenly you realize that the invoice number is 2 -- but darn it, someone else is already using invoice 2 for another sale in another .xls file. You close your file and open it back up and suddenly it's invoice #3 in E5. Somehow you have to control when the invoice number is incremented and when it isn't. Now, you could modify the Workbook_Open() event to NOT increment the number if some other information is on the workbook that isn't there in the 'template' file. Lets say you put the customer name in cell B2, but in the template that cell is empty. Here's what you'd have to do in the Workbook_Open() event: check and see if cell B2 has anything in it, and if it does, don't increment the invoice number, but if it is empty, then: increment the Invoice Number in E5 AND save the 'template file' back out so that the next time you use it, it knows what the last used invoice number was, and THEN give it a new name to be saved under with the new invoice number carved in stone, so to speak. This is where the .txt file that McGimpsey uses comes in so handy - the last invoice number is saved in it, so you don't have to figure out how to do all of that save, rename, save again type of operation. It's not just a question of the chicken and the egg, but an added element of how to tell when the egg will hatch is kind of thrown into it all. I'm going back and looking at what PammiJ wrote in her last entry here and see if I cannot work something out based on earlier work plus her added information. My question to Bill Ridgeway (not meaning any disrespect or anything like that at all) is: having come up with a new invoice number fromt he cells in A1:A999, how do you get that new number into that list? This implies, to me at least, that somewhere there is a manual operation of entering the last used invoice number somewhere, and so it's not a totally automatic process, and is still susceptible to human error (forgetting to update the list of used invoice numbers). To give credit to all: it is actually a rather complex issue based on a very simple need, made so primarily just by the way Excel works. "Rookie 1st class" wrote: This works sort of Private Sub Workbook_Open() Range("E5") = Range("E5") + 1 End Sub It does what you want if you open the *.xlt original. Not if you open a *.xls copy (File., New). Where do I find the McGimpseys code page you are copying from? Maybe we can both learn something. Lou "Bill Ridgeway" wrote: Assuming Invoice numbers are stored in cells A1 through A99, the formula - =MAX(Data!$A$1:$A$999)+1 will give you the next available Invoice number. Regards. Bill Ridgeway Computer Solutions |
#18
|
|||
|
|||
Auto Number in Invoice
-- To JLatham and Bill Ridgeway, It seems that you both know a couple methods that will activate the auto numbering in an invoice, but which one works in what area of the program is the question ! My curious is if you call up the basic invoice template and enter the code or formula into the function/format /formula bar for the cell that the templates invoice number is displayed in, and save the sheet, wouldnt that activate that cell to do the autonumbering each time the blank template is opened ?? Just trying to understand you, without drawing me pictures ! TX, Lizard1socal |
#19
|
|||
|
|||
Auto Number in Invoice
I believe this is the page being referenced, at least that's where I ended in
doing a search - shows 2 ways, been playing with the 2nd way (in text file vs in the registry) http://www.mcgimpsey.com/excel/udfs/sequentialnums.html "Rookie 1st class" wrote: This works sort of Private Sub Workbook_Open() Range("E5") = Range("E5") + 1 End Sub It does what you want if you open the *.xlt original. Not if you open a *.xls copy (File., New). Where do I find the McGimpseys code page you are copying from? Maybe we can both learn something. Lou "Bill Ridgeway" wrote: Assuming Invoice numbers are stored in cells A1 through A99, the formula - =MAX(Data!$A$1:$A$999)+1 will give you the next available Invoice number. Regards. Bill Ridgeway Computer Solutions |
#20
|
|||
|
|||
Auto Number in Invoice
Grab this file, hope you have WinZip or something able to open .zip files,
and extract both files in it TO THE SAME FOLDER. The two files, one .txt and one .xls, must be in the same folder for some features to work. This will show how it can be done, and I've added lots of comments so hopefully you'll be able to customize it yourself. If not, ask questions here or via email and I'll try my best to answer. In previous book, I misinterpreted what you'd tried and thought there was a name of some type in E5, not that it was where the invoice number was to be placed. This fixes that. It's NOT 100% automatic - it is an on-demand function via macro that grabs a value from the .txt file, increments it by one and stuffs it into E5 and then also saves that number back to the .txt file so that the next time you use the macro, whether in that workbook or another, you'll get the next sequential invoice number. This is all based on McGimpsey's sample work. What I've done with it to modify it is to take away the need to define a default path to the .txt file, although you may do that also, and may want to. But if no default path is provided, then it gets the .xls file's path and uses that to go find the InvoiceNumber.txt file - and that's why both files need to be in the same folder. http://www.jlathamsite.com/uploads/for_PammiJ.zip if you get a security alert about a .zip file and aren't permitted to upload it, try right-clicking the link and using Save Target As. "Pammi J" wrote: Thats exactly what im after Lizard1socal - exactly what that template does with the invoice number - unfortunatly i cant get into it - its asking for a password "lizard1socal" wrote: JLatham, Appreciate the reply, although as a simple user didnt understand it all , but got the jest of what you wrote. My next question is that , in Excel there is a business invoice template that has the area for the invoice number, and shows a number in the template. Now if the template has and shows the number, isnt there someway to activate that cell with an auto number formula ? ( a new users question,basically ignorant here ) Thx for your help, undrstanding and patience with us of lessor knowledge ! LIZARD1SOCAL |
Thread Tools | |
Display Modes | |
|
|