I've found several steps to be nearly an absolute requirement for documentation based on the following observations.
1. No matter how long ago you worked on it, your name is on it and the folks who are stuck will call you. Even if you've left town.
2. When you pick it up after two years of being totally immersed in something else, even YOU, the author, will need lots of help.
3. You will need more documentation than you think you will need. Invariably.
4. Design decisions that were crystal-clear two years ago are all muddled beyond belief now.
5. If your client is like all other clients I've met, the problem has mutated faster than the client's support group could make fixes.
Since I have started working with the U.S. Government, I have learned WHY they earn the snide remarks about "it's not WHAT you write but how much."
In summary, I follow these rules when documenting a project.
A. All fields in tables and all controls in reports and forms wherein a comment or description or remark is allowed will have a meaningful one, even if it seems redundant at the time. ALL OPTIONS TO REMARK WILL BE REMARKED!
B. All VBA code will have the following classes of comments.
B.1. At the top of each module (Access usage of module here), I will have a brief expository lump in comments describing the general content of the module.
B.2. At the top of each SUB or FUNCTION, I will have a brief expository lump in comments describing the purpose of the entry point including the meaning of the input arguments and the nature of the output, if any. THIS INCLUDES SIDE-EFFECTS where you are taking advantage of scoping rules.
B.3. As a miminum, any code that involves transfers of control (to include GOTO, GOSUB, CALL, implied CALL, IF-THEN-ELSE-ENDIF, and SELECT CASE-END SELECT, will describe the reason for the test or call or selection. But any time I have a complex formula, I add comments when I have computed a significant term that contributes to the formula.
B.4. This sounds funky, but every END IF will have a comment that says "END - IF {situation XYZ} required attention" or whatever the matching IF really meant.
B.5. Where anything is DIM'd, regardless of the mnemonic value of that "perfect" name you chose, I add comments telling what part that variable plays in the coming operation, no matter how obvious. Now, sometimes I admit to using very short names like I, J, K (as opposed to loI, loJ, loK) when I'm using the short names for subscripting and indexing, so this makes the comment even more important.
C. As to separate documents, I build the following chapters into what I write.
C.1. Environment - a description of the business environment including the names of the data owner, customers of that data owner (i.e. intended users), and program versions for whatever tools I have to use.
C.2. Theory of Operation - a general overview of what the whole app is supposed to do, with sub-levels for ANY TRICKY PARTS. For instance, one of my probjects involves opening a Word document using automation in order to extract certain data elements from that document. (It's a form filed electronically and I do some data capture with it.)
C.3. Structure - a tedious list of every element in the program by name and location. This includes all DIM's variables in all modules, all SUBs, and all FUNCTIONs. Plus all data elements in tables. Plus anything computed by queries or on forms or reports.
C.4. Nature of Input - a tedious list of where data comes from that gets into the app. Include screen captures of input forms and text files, spreadsheets (if that is what is imported), or other files that you might use.
C.5. Nature of Output - a tedious list of where data goes to once it is in the app. Include screen captures of forms and reports as well as any sample output files.
C.6. Instructions on How to Use the App - a tedious list of all functions intended for the various user groups. As sub-headings here, I would put each user group and show what was intended for that group to do.
C.7. Maintenance instructions - Step-by-Step reminder of how the app was finally packaged including such things as doing a "Compile and Save" before the final button-down steps.
C.8. Corrective Actions - if this is not Maintenance but rather, what do I do if the data processing phase doesn't like something? This might not alway be required.