MS Office Forum / Excel / Programming / March 2008
CATCH-22 won't let me save the file
|
|
Thread rating:  |
Patrick Riley - 26 Mar 2008 16:47 GMT Thanks to some generous help from users of this site, I, with no Visual Basic knowledge, am using some VB code that requires the user to type his/her name into a given cell before the file can be saved, since the name must appear on the printed version. The user-name field is intentionally left blank. Upon attempting to save, the code presents a message to type in the name, if the name-field is still blank. Well, CATCH-22. This very code is preventing me from leaving the name field blank when I try to save the file in final form, ready for enduser use. The code I am using is:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If IsEmpty(Sheets("Main").Range("E59").Value) Then MsgBox "You must type in your name before " & _ "this file can be saved.", 16, "ERROR" Cancel = True End If End Sub
Any suggestions? ---Pat Riley
PCLIVE - 26 Mar 2008 17:05 GMT Why not just have an input box that will populate the cell?
If IsEmpty(Sheets("Main").Range("E59").Value) _ Then Range("E59").Value = InputBox("You must type in your name before " & _ "this file can be saved.", "Enter Name.") Else End If
HTH, Paul
> Thanks to some generous help from users of this site, I, with no Visual > Basic [quoted text clipped - 22 lines] > Any suggestions? > ---Pat Riley Patrick Riley - 26 Mar 2008 17:54 GMT Paul:
Thanks for taking the time to respond. I deleted existing VB code, and used your code. After inserting your code, nothing happened: I could save file with name-field blank. I did not see an input-box appear. I saved file and re-opened, and got the same results: no input box, could still save file with name-field blank.
> Why not just have an input box that will populate the cell? > [quoted text clipped - 35 lines] > > Any suggestions? > > ---Pat Riley PCLIVE - 26 Mar 2008 18:14 GMT Just to be sure, you are using:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If IsEmpty(Sheets("Main").Range("E59").Value) _ Then Range("E59").Value = InputBox("You must type in your name before " & _ "this file can be saved.", "Enter Name.") Else End If End Sub
Are you sure E59 is currently empty. The code works when I attempt saving. But if there is a space or anything else in E59, no input box is displayed. Also, I saw in another post where you were to disable events. Make sure they are not currently disabled.
Regards.
> Paul: > [quoted text clipped - 49 lines] >> > Any suggestions? >> > ---Pat Riley Patrick Riley - 26 Mar 2008 20:13 GMT Just to be sure, I re-copied the code from this post. I made sure that E59 was blank (I clicked in the cell and hit the Delete key). When I tried to close the file, I got a syntax error. In the VB editor, Lines 1 and 2 (beginning w "Private" and "Cancel") were highlighted in yellow, and line 5 (beginning w "Range") was selected. Incidentally, when I first pasted the code into the right-hand pane (after selecting "ThisWorkbook" in left pane), lines 5 thru 7 appeared in red. Since I am not a VB programmer, I don't know the significance, if any, of the points I raise in this paragraph. I don't know how to turn off events, although now a later response to my post, from Dave Peterson, provides code to do so, coupled with a coding suggestion.
I appreciate your taking the time to help! ---Pat
> Just to be sure, you are using: > [quoted text clipped - 69 lines] > >> > Any suggestions? > >> > ---Pat Riley PCLIVE - 26 Mar 2008 20:56 GMT When copying the code from the post, be careful of text wrapping. When you see an underscore ( _ ) following a space in code, this usually indicates that the code is continued to the next line. Let's see if this causes a problem.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If IsEmpty(Sheets("Main").Range("E59").Value) _ Then Range("E59").Value = _ InputBox("You must type in your name before " & _ "this file can be saved.", "Enter Name.") Else End If End Sub
> Just to be sure, I re-copied the code from this post. I made sure that > E59 [quoted text clipped - 98 lines] >> >> > Any suggestions? >> >> > ---Pat Riley Patrick Riley - 28 Mar 2008 14:52 GMT Paul:
The Input-Box code worked like a charm, with one blip: When I click "Cancel" in the Input Box, the Input Box closes (which is expected, and OK), but then a Save-File window opens, allowing me to save the file without filling in the name field. (I made sure that the name field truly was blank.) Does this phenomenon occur when you run the code?
---Pat
> Just to be sure, you are using: > [quoted text clipped - 69 lines] > >> > Any suggestions? > >> > ---Pat Riley PCLIVE - 28 Mar 2008 15:44 GMT Ok,
Let's try this. Be careful of wrap-around. With this code, you can close the sheet leaving E59 blank by typing a key word. In this case, the key word is "Admin". Of course you can change that.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean)
Do While IsEmpty(Sheets("Main").Range("E59").Value) Range("E59").Value = InputBox("You must type in your name before " & _ "this file can be saved.", "Enter Name.")
If Range("E59").Value = "Admin" _ Then Range("E59").ClearContents Exit Sub Else End If Loop
End Sub
> Paul: > [quoted text clipped - 93 lines] >> >> > Any suggestions? >> >> > ---Pat Riley Patrick Riley - 28 Mar 2008 20:33 GMT In VB Editor, I widened the right-hand code pane so that the code did not wrap, that it had exactly the same line arrangement that I received. I chose to keep "Admin" (with one cap and four lower-case) as the key word. I made sure that cell E59 was empty. When I ran the macro, I got an error:
Run Time error '1004' Cannot change part of a merged cell
The result was: cell E59 contained "Admin" (that is, E59 did not get emptied out). Cell E59 is a merger of cells that, during the development of the file, were originally cells E59 thru O59 inclusive. Can't understand why Excel is upset with a merged cell. ---Pat
> Ok, > [quoted text clipped - 116 lines] > >> >> > Any suggestions? > >> >> > ---Pat Riley PCLIVE - 28 Mar 2008 20:40 GMT Ok. Just expand the range in the line that has ClearContents.
Range("E59:O59").ClearContents
That should do it.
> In VB Editor, I widened the right-hand code pane so that the code did not > wrap, that it had exactly the same line arrangement that I received. I [quoted text clipped - 144 lines] >> >> >> > Any suggestions? >> >> >> > ---Pat Riley Patrick Riley - 28 Mar 2008 21:38 GMT Paul:
YES! It worked!! Thanks so much for your patience throughout the 5 responses that you gave me. You were generous with your time, and I learned a lot. ---Pat --------------------
> Ok. Just expand the range in the line that has ClearContents. > [quoted text clipped - 150 lines] > >> >> >> > Any suggestions? > >> >> >> > ---Pat Riley PCLIVE - 28 Mar 2008 21:50 GMT No Problem. Thanks for the feedback.
Paul
> Paul: > [quoted text clipped - 168 lines] >> >> >> >> > Any suggestions? >> >> >> >> > ---Pat Riley JLGWhiz - 26 Mar 2008 17:06 GMT If you put this code in the ThisWorkbook code module, it will clear the E59 cell for each user as the workbook opens.
Private Sub Workbook_Open() Range("E59").ClearContents End Sub
Open the VB editor and right click the ThisWorkbook listed in the project window. Click View Code and paste the above snippet into the code window. Then you can enter something in E59 to get it to save the file and when the workbook opens it will automatically clear that cell. If I recall your original post correctly, you only want the name there for print out which occurs after the save event. If I am correct then this addition should allow you to enter something in E59 to save your prototype file, which will be removed upon the next opening of the file.
> Thanks to some generous help from users of this site, I, with no Visual Basic > knowledge, am using some VB code that requires the user to type his/her name [quoted text clipped - 17 lines] > Any suggestions? > ---Pat Riley Patrick Riley - 26 Mar 2008 17:44 GMT JLGWhiz:
Thanks for your response. I tried your code, and got an error msg:
Run-time error '1004': Cannot change part of a merged cell.
E59 is a merged cell, consisting of cells originally E59 thru O59 inclusive. When I hit the Debug button within the err-msg window, the VB editor window opened, and line 2 of your code was highlighted.
Also, it is my intent that the user name remain in the saved file, in addition to appearing on the hardcopy.
> If you put this code in the ThisWorkbook code module, it will clear the E59 > cell for each user as the workbook opens. [quoted text clipped - 33 lines] > > Any suggestions? > > ---Pat Riley Dave Peterson - 26 Mar 2008 17:39 GMT Before you (as the developer, not the user) save the file, you can turn off events.
Open the VBE hit ctrl-g to see the immediate window type this and hit enter: application.enableevents = false
Then save your workbook--the _beforesave event won't fire.
Then back to the VBE and toggle the setting in the immediate window: application.enableevents = true
==== You could also do other stuff, too. Maybe check the username?
if lcase(application.username) = lcase("Patrick Riley") then 'do nothing, let it save... 'or clear that cell! me.sheets("Main").range("e59").value = "" else If IsEmpty(me.Sheets("Main").Range("E59").Value) Then MsgBox "You must type in your name before " & _ "this file can be saved.", 16, "ERROR" Cancel = True End If end if
> Thanks to some generous help from users of this site, I, with no Visual Basic > knowledge, am using some VB code that requires the user to type his/her name [quoted text clipped - 17 lines] > Any suggestions? > ---Pat Riley
 Signature Dave Peterson
Ker_01 - 26 Mar 2008 18:29 GMT Excellent suggestions for the OP (especially turning off events).
One additional one- extension of JLGWhiz's response; rather than always deleting the contents of the target cell during the workbook open event, check it for a specific string (such as "Patrick Riley" or "Erase Me") and only clear that cell during the workbook open event if the target cell contains your specified string.
Best, Keith
> Before you (as the developer, not the user) save the file, you can turn > off [quoted text clipped - 52 lines] >> Any suggestions? >> ---Pat Riley Patrick Riley - 26 Mar 2008 20:45 GMT Dave: I opened VBE, hit Ctrl-G, the Immediate Window opened, I cut and pasted the "application.enableevents = false" code (without the quote marks) into Immediate Window. When I tried to save the file, however, the beforesave code fired, producing the warning message to type in the name. Incidentally, the code I am using is:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If IsEmpty(Sheets("Main").Range("E59").Value) Then MsgBox "Cell E59 of sheet 'Main' must be filled in before " & _ "this file can be saved.", 16, "ERROR" Cancel = True End If End Sub
Also, re your suggestion to check the username, under Tools>Options>General, my username is pjriley, so I presumed I should use "pjriley" instead of "Patrick Riley" in the code that you provided. I tried it, and IT LET ME SAVE THE FILE with the BLANK name field!! BUT...when I e-mailed the file to another user and tested it at his machine under his login and application name (making sure the VB code was still there and unchanged), it did NOT prompt me to fill in the name field. Under Tools>Options>General, his username was "acutti", as it should have been. What do you make of this? ---Pat
> Before you (as the developer, not the user) save the file, you can turn off > events. [quoted text clipped - 45 lines] > > Any suggestions? > > ---Pat Riley Dave Peterson - 26 Mar 2008 21:52 GMT After you type that "application.enableevents = false" into the immediate window, you have to hit enter to run that command.
If the event fires, then you didn't do it correctly.
As for the second question, I'd guess that you did something wrong in the code.
> Dave: > I opened VBE, hit Ctrl-G, the Immediate Window opened, I cut and pasted the [quoted text clipped - 76 lines] > > > > Dave Peterson
 Signature Dave Peterson
|
|
|