Runtime Error 1004 - BeforePrint - Avoid printing if cells are empty - vba
I am trying to create a macro to prevent users from printing a form if they don't fill out all cells. However, I am getting an error message:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Application.Sheets("Form").Range("B4,C4,D4,E4,F4,G4,H4,I4,J4,K4,L4,M4,B5,C5,D5,E5,F5,G5,H5,I5,J5,K5,L5,M5,B6,C6,D6,E6,F6,G6,H6,I6,J6,K6,L6,M6,B7,C7,D7,E7,F7,G7,H7,I7,J7,K7,L7,M7,B8,C8,D8,E8,F8,G8,H8,I8,B9,C9,D9,E9,F9,G9,H9,I9,B11,C11,D11,E11,F11,G11,H11,I11,B12,C12,D12,E12,F12,G12,H12,I12,B13,C13,D13,E13,F13,G13,H13,I13,B14,C14,D14,E14,F14,G14,H14,I14,B16,C16,D16,E16,F16,G16,H16,I16,B17,C17,D17,E17,F17,G17,H17,I17").Value = "" Then
Cancel = True
MsgBox "Fill out all the cells"
End If
End Sub
I have another macro for another form that has fewer cells and that one works just fine:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Application.Sheets("Form 2").Range("C4,C5,C6,D4,D5,D6,F4,F5,F6,B8,B9,B10,B11,C8,C9,C10,C11,D8,D9,D10,D11,E8,E9,E10,E11,C13,D13,C16,C17,C18,F16,F17,F18,C22,D22").Value = "" Then
Cancel = True
MsgBox "Fill out all the cells"
End If
End Sub
What can I do to solve this problem?
It seems that there is a limit to line length or to how long of a string you can put into a range(). But you can consolidate it like this. Also I think that the return value from a range() with more than one cell is an array so I am not sure if it is valid to compare it to a string like you did.
Try this:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
For Each cell In Application.Sheets("Form").Range("B4:M7,B8:I9,B11:I14,B16:I17")
If cell.Value = "" Then
Cancel = True
MsgBox "Fill out all the cells"
Exit Sub
End If
Next
End Sub
Related
VBA if in text is in textbox then do something
I've written the following code so that if a certain text exists in my listbox and "ok" button is clicked a certain thing is done. Private Sub CommandButton3_Click() If (Me.ListBox2.Text) <> ("PA") Then Call macro1 ElseIf (Me.ListBox2.Text) <> "menu" Then Sheets("menu").Visible = xlSheetVisible Worksheets("menu").Activate Else MsgBox "Nothing is selected" End If End Sub The problem is that when "ok" is clicked all events are still carried out even if the specified text isn't in the textbox.
You probably want to use = operator, and not <> operator. Also note that ListBox.List(i) is the correct way of getting selected item for single selection mode: Private Sub CommandButton3_Click() Dim SelectedItem = ListBox1.List(ListBox1.ListIndex) If SelectedItem = "PA" Then Call macro1 ElseIf SelectedItem = "menu" Then Sheets("menu").Visible = xlSheetVisible Worksheets("menu").Activate Else MsgBox "Nothing is selected" End If End Sub Edit Following your comment, you can create a function that looks for the existence of that item: Private Function TextExists(text as String) as Boolean Dim i as Long For i = 0 To ListBox1.ListCount - 1 If ListBox1.List(i) = text Then TextExists = True Exit Function End If Next TextExists = False End Function And then use this function in the main code like this: Private Sub CommandButton3_Click() If TextExists("PA") Then Call macro1 ElseIf TextExists("menu") Then Sheets("menu").Visible = xlSheetVisible Worksheets("menu").Activate Else MsgBox "Nothing is selected" End If End Sub N.B. I have written this manually here, without an IDE. Please check for indexes and other little things.
VBA UserForm TextBox Only Allow Numbers and Empty Text
In my userform I want to MsgBox if TextBox not contain Numbers or empty. This is my code but in another case when the TextBox = "" Empty the MsgBox appear to me, so the issue with me is the empty TextBox. Private Sub TB1_Change() If TypeName(Me.TB1) = "TextBox" Then With Me.ActiveControl L12.Caption = Val(TB1.Text) * Val(TB2.Text) If Not IsNumeric(.Value) And .Value <> vbNullString Then MsgBox "Sorry, only numbers allowed" .Value = vbNullString End If End With End If End Sub
Use the Key Press event for this purpose. Private Sub TB1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0 End Sub This procedure will just ignore anything you enter if it isn't a number, but you can modify both the condition and the output. For example, you might allow a decimal point to be entered, or you might wish to show a message box - perhaps only on the second try.
You may use the AfterUpdate event handler instead of the Change event, might also want to use the Exit event and cancel the exit if the user enters an invalid value: Option Explicit Private Sub TB1_AfterUpdate() 'Check whether the value is numeric or empty: If Not IsValNumeric(Me.TB1.Value) Then MsgBox "Sorry, only numbers allowed" Me.TB1.Value = vbNullString Else: 'Do something... MsgBox val(TB1.Text) * val(TB2.Text) End If End Sub Private Sub TB1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Prevents the user from EXIT the TextBox if value is not numeric/empty Cancel = Not IsNumeric(Me.TB1.Value) End Sub Private Function IsValNumeric(val$) As Boolean Dim ret As Boolean 'check for numeric value only and allow empty value as a zero value ret = IsNumeric(val) Or Len(val) = 0 IsValNumeric = ret End Function
You can wait until the user finishes their input and then test the field. For usability, the message box should be replaced with a caption and an icon/picture like this "A number must be entered here." These would be displayed next to the text box when the input is incorrect. Then hidden when the input is corrected. The submission of the form can be blocked until all the errors have been corrected. This allows the user to enter the request data and then fix any input errors. This is better than stopping them every time they make a mistake. The event is changed from Change to Exit. Private Sub TB1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TypeName(Me.TB1) = "TextBox" Then With Me.ActiveControl L12.Caption = Val(TB1.Text) * Val(TB2.Text) If Not IsNumeric(.Value) Or .Value = vbNullString Then MsgBox "Sorry, only numbers allowed" .Value = vbNullString End If End With End If End Sub The vbNullString test has also been updated.
Since you are trying to allow only "Numeric" and "Blank" then the code below would deliver your needs. Private Sub TB1_Change() if IsNumeric(Me.TB1.Value) = True or Me.TB1.Value = vbNullString then 'Good data, nothing to MSG Else MsgBox "Your input data is not valid" Endif End Sub
VBA cells are not highlighted
Its a protected worksheet/workbook and I have a code that will throw a prompt for the user, whether to edit the sheet or not. Cells are editable, but the problem is cells are not getting highlighted with border. So its difficult for the user to know which cells is he working on. I have 2 sheets here, Corefiller and Ad-filler, if dropdown on corefiller sheet is "No". User gets a prompt when he selects the sheet, he clicks ok to edit the sheet or cancel if he doesnt want to edit. Code on Sheet "Ad-filler" Option Explicit Private mMessageDisplayed As Boolean Private Sub Worksheet_Activate() Carry End Sub Code on a module. Public Sub Carry() If ActiveSheet.ProtectContents And Not mMessageDisplayed Then mMessageDisplayed = True If ThisWorkbook.Sheets("Corefiller").Range("E29") = "NO" Then If MsgBox("Click OK to include Filler for this request", vbOKCancel + vbInformation) = vbOK Then ThisWorkbook.Worksheets("Corefiller").Range("E29") = "YES" With ThisWorkbook.Sheets("Ad-filler") .Range("E13:E14").Locked = False End With Else With ThisWorkbook.Sheets("Ad-filler") .Range("E13:E14").Locked = True End With End If Else Exit Sub End If End If End Sub Whats wrong in my code? why the cell is not highlighted. If i try to use protect/unprotect in the code, cells on the first sheet (Corefiller) will not be highlighted and I have to click on other sheets and come back to get the cell highlighted.
Can you restart, implement this and check whether the problem still exists: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = 0 Target.Interior.ColorIndex = 3 End Sub
Formatting Text Boxes in a Userform
I have a Userform that includes Text Boxes with multiple formats. I have the Initialize as blank ("") and then format them using afterupdate(). This all works fine, my issues come from the possibility of the user miss keying the data the first go around or just clicking aimlessly on there screen. After you input a value it formats it correctly when you move from the text box. But if you reselect the text box then move away again, it clears the value. And if you do this with the text box that is formatted as a percent it actually bugs out with a mismatch error. Here is a slice of my current code: Private Sub UserForm_Initialize() ValueAnalysisTextBox.Value = "" CapRateTextBox.Value = "" End Sub Private Sub ValueAnalysisTextBox_AfterUpdate() ValueAnalysisTextBox.Value = Format(Val(ValueAnalysisTextBox.Value), "$#,###") End Sub Private Sub CapRateTextBox_AfterUpdate() CapRateTextBox.Value = Format(Val(CapRateTextBox.Value) / 100, "Percent") End Sub Any thoughts on how to clean this up would be great.
Is this what you are trying? Private Sub ValueAnalysisTextBox_AfterUpdate() Dim amt As Double amt = Val(Replace(ValueAnalysisTextBox.Value, "$", "")) ValueAnalysisTextBox.Value = Format(amt, "$#,###") End Sub Private Sub CapRateTextBox_AfterUpdate() Dim Perct As Double Perct = Val(Replace(CapRateTextBox.Value, "%", "")) / 100 CapRateTextBox.Value = Format(Perct, "Percent") End Sub Note: I am not doing any other error handling. For example, user typing "Blah Blah" or pasting something else in the textbox. I am sure you can handle that.
I'd store the underlying values in the .Tag property of the TextBox, then use it to change the formatting back and forth in the Enter and Exit events: Private Sub UserForm_Initialize() ValueAnalysisTextBox.Value = vbNullString ValueAnalysisTextBox.Tag = vbNullString End Sub Private Sub ValueAnalysisTextBox_Enter() ValueAnalysisTextBox.Value = ValueAnalysisTextBox.Tag End Sub Private Sub ValueAnalysisTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean) If IsNumeric(ValueAnalysisTextBox.Value) Then ValueAnalysisTextBox.Tag = Val(ValueAnalysisTextBox.Value) ValueAnalysisTextBox.Value = Format$(ValueAnalysisTextBox.Tag, "$#,###") Else ValueAnalysisTextBox.Tag = vbNullString End If End Sub
VBA Msgbox if cell value is false on worksheet
I have this code it works fine but I only have 1 problem. it doesn't work way I would like it to. I want it to Pop up msgbox every time I change the change. if cell E45 value is not "True" then when I change to different sheet I want it prompt me msg saying "Records DO NOT Match, would you still like to continue?" Private Sub Worksheet_Change(ByVal Target As Range) If Range("E45") <> "TRUE" Then MsgBox "Records Do Not Match" End If End Sub
You need to change two things: First, you need to be using the Workbook_SheetActivate event to capture when you have selected a different sheet. Next, you should be comparing to the literal True value, not the string "TRUE": The following code should go in the ThisWorkbook module: Private Sub Workbook_SheetActivate(ByVal Sh As Object) If Sh.Range("E45") <> True Then MsgBox "Records do not match" End If End Sub
Amend "TRUE" to TRUE so that it checks for the boolean, not the string "true"