ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Toggle Button Updating Concern (https://www.excelbanter.com/excel-programming/327399-re-toggle-button-updating-concern.html)

Jim Thomlinson[_3_]

Toggle Button Updating Concern
 
The first thing that I notice in your code that puzzles me is why are you using

Application.Run "???"

instead of just calling procedures? I am not sure if or what problems doing
this might cause. That being said you are not showing the subprocedures that
you are invoking so it is a little tought to debug. Have you tried stepping
through the code using F8 to see where the for is being re-initialized? That
is where I would start...

HTH

"Nicole B" wrote:

I have some toggle buttons on a "home page" worksheet in my workbook. I have
some VBA code programmed that updates their values based on a property of a
cell, for example, if a cell is protected the toggle button displays
"unprotect cells" so that the user knows that the button will remove
protection. Additionally, when these buttons are clicked, a userform comes
up prompting for a password before removing protection (not all of my users
have excel 2002 or better, so I'm forced to protect my document this way).
If the password is correct it runs a macro and is supposed to UnLoad the
userform. The code on the worksheet (for the button) is as follows:

Private Sub ProtectionToggle_Click()
If Sheet14.ProtectContents = True Then 'True means that protection is on!
With ProtectionToggle
.Value = False
.Caption = "Protect Sheets"
End With
Application.Run "RunProtectionPasswordUserForm"
ElseIf Sheet14.ProtectContents = False Then
ans = MsgBox("Are you sure you want to protect the worksheet?" _
& vbLf & "This action cannot be undone without a password.",
vbOKCancel, _
"Confirm Protect Sheets")
If ans = vbOK Then
With ProtectionToggle
.Value = False
.Caption = "Begin Advanced Editing"
End With
End If
Application.Run "WorkbookProtect"
End If
End Sub

The code for the userform OK button is as follows:

Private Sub OKButton_Click()
Application.Run "FilterEstimateData.ConfirmPassword"
UnLoad Me
End Sub

The problem that I am having is that the userform is, in fact, unloading,
but reloading. It consistently unloads upon OK then reloads once (if I hit
OK again with the right password, it does not reload again).

Any suggestions? Please help!

NB


Jim Thomlinson[_3_]

Toggle Button Updating Concern
 
I am going to stick with a few generallities here to see if we can clean
things up. At the top of your code modules ad teh word Option Explicit . This
will require explicit variable declarations. When you have done this click
Debug - Compile. Clean up any sysntax errors that the compiler finds. In the
code that you posted the list procedure is not declared with a procedure
name. Once this is done Place your cursor in the ProtectionToggle_Click
precedure and hit F8. This will allow you to trace your code one line at a
time and see what is occuring as the code executes. Hopefully this will help
you find your problem.

With respect to the Call of procedures. The Idea behind public and private
is to hide or expose the functionallity of specific sheets and modules from
other sheets and modules. The rule o fthumb is to try to keep as much private
as is possible, but if the proceudure is required outside the moduel then
make it public. Try this to see what I mean. Insert a new module into your
project. Create two sub procedures. one public and one private. Something
like this... Name the module modMyModule

public sub MyPublicMessage ()
msgbox "Public message"
end sub

private sub MyPrivateMessage()
msgbox "Private Message"
end sub

Now in one of your other modules type

Call modMyModule.

The intellisence will give you a list showing you your public procedure. It
will also show any public variables...

HTH

"Nicole B" wrote:

To call a procedure, you just type Call ProcedureName? I'll try that.
That's what happens when you're teaching yourself to program from books...you
don't learn the best way to do things...

Here are the subprocedures, in order as best as they can be (they look
somewhat circular but I don't think they really are). By the way, the msgbox
pops up twice, too, as well as the userform.

Private Sub ToggleEstimateFilters_Click()
Application.ScreenUpdating = False
If Sheet2.FilterMode = True Then
With ToggleEstimateFilters
.Caption = " Hide Items Not in Estimate"
.Value = False
End With
Application.Run "RunEstPasswordUserForm"
ElseIf Sheet2.FilterMode = False Then
ans = MsgBox("Are you sure you want to hide the items that are not in
the estimate?" _
& vbLf & "This action cannot be undone without a password.",
vbOKCancel + vbInformation, _
"Confirm Filter")
If ans = vbOK Then
With ToggleEstimateFilters
.Caption = " Show All Items"
.Value = False
End With
Application.Run "FilterEstimateData.FilterEstimateData"
End If
If ans = vbCancel Then End
End If
Application.ScreenUpdating = True
End Sub

Private Sub RunEstPasswordUserForm()
EstimatePassword.Show
End Sub

Private Sub OKButton_Click()
Application.Run "FilterEstimateData.ConfirmPassword"
End Sub

Private Sub ConfirmPassword()
PasswordText = EstimatePassword.PasswordTextBox.Text
Unload EstimatePassword
If PasswordText = "estimate" Then
Application.Run "RemoveEstimateFilter"
ElseIf PasswordText < "estimate" Then
Application.Run "WrongEstPasswordMsgBox"
End If
End Sub

On Error Resume Next

Application.StatusBar = "Removing Estimate Filters"
Dim ProtectionStatus As Boolean
If Sheet1.ProtectContents = True Then
ProtectionStatus = True
End If
If Sheet1.ProtectContents = False Then
ProtectionStatus = False
End If
If Sheet2.FilterMode = True Then
Application.Run "WorkbookUnprotect"
Application.ScreenUpdating = False
For i = 2 To 12
Worksheets(i).ShowAllData
Next
Range("TlLumber", "BlumberEstQty").Locked = False
Range("TlShores", "BShoresEstQty").Locked = False
Range("TLPlywood", "BPlywoodEstQty").Locked = False
Range("TLHardware", "BHardwareEstQty").Locked = False
Range("TLScaffold", "BScaffoldEstQty").Locked = False
Range("TLPurlinsRunners", "BPurlinsRunnersEstQty").Locked = False
Range("TLHVDoka", "BHVDokaEstQty").Locked = False
Range("TLCecoWalls", "BCecowallsEstQty").Locked = False
Range("TLBurkeHandset", "BBurkeHandsetEstQty").Locked = False
Range("TLBurkeCranset", "BBurkeCranesetEstQty").Locked = False
Range("TLPansEquip", "BPansEquipEstQty").Locked = False
ElseIf Sheet12.FilterMode = False Then Resume Next
End If
If ProtectionStatus = True Then
Application.Run "WorkbookProtect"
ElseIf ProtectionStatus = False Then Resume Next
End If
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub

Sorry it's so lengthy!


Jim Thomlinson[_3_]

Toggle Button Updating Concern
 
I don't want to leavy you high and dry but I have to go now. Re-post tomorrow
if it still won't work.

"Jim Thomlinson" wrote:

I am going to stick with a few generallities here to see if we can clean
things up. At the top of your code modules ad teh word Option Explicit . This
will require explicit variable declarations. When you have done this click
Debug - Compile. Clean up any sysntax errors that the compiler finds. In the
code that you posted the list procedure is not declared with a procedure
name. Once this is done Place your cursor in the ProtectionToggle_Click
precedure and hit F8. This will allow you to trace your code one line at a
time and see what is occuring as the code executes. Hopefully this will help
you find your problem.

With respect to the Call of procedures. The Idea behind public and private
is to hide or expose the functionallity of specific sheets and modules from
other sheets and modules. The rule o fthumb is to try to keep as much private
as is possible, but if the proceudure is required outside the moduel then
make it public. Try this to see what I mean. Insert a new module into your
project. Create two sub procedures. one public and one private. Something
like this... Name the module modMyModule

public sub MyPublicMessage ()
msgbox "Public message"
end sub

private sub MyPrivateMessage()
msgbox "Private Message"
end sub

Now in one of your other modules type

Call modMyModule.

The intellisence will give you a list showing you your public procedure. It
will also show any public variables...

HTH

"Nicole B" wrote:

To call a procedure, you just type Call ProcedureName? I'll try that.
That's what happens when you're teaching yourself to program from books...you
don't learn the best way to do things...

Here are the subprocedures, in order as best as they can be (they look
somewhat circular but I don't think they really are). By the way, the msgbox
pops up twice, too, as well as the userform.

Private Sub ToggleEstimateFilters_Click()
Application.ScreenUpdating = False
If Sheet2.FilterMode = True Then
With ToggleEstimateFilters
.Caption = " Hide Items Not in Estimate"
.Value = False
End With
Application.Run "RunEstPasswordUserForm"
ElseIf Sheet2.FilterMode = False Then
ans = MsgBox("Are you sure you want to hide the items that are not in
the estimate?" _
& vbLf & "This action cannot be undone without a password.",
vbOKCancel + vbInformation, _
"Confirm Filter")
If ans = vbOK Then
With ToggleEstimateFilters
.Caption = " Show All Items"
.Value = False
End With
Application.Run "FilterEstimateData.FilterEstimateData"
End If
If ans = vbCancel Then End
End If
Application.ScreenUpdating = True
End Sub

Private Sub RunEstPasswordUserForm()
EstimatePassword.Show
End Sub

Private Sub OKButton_Click()
Application.Run "FilterEstimateData.ConfirmPassword"
End Sub

Private Sub ConfirmPassword()
PasswordText = EstimatePassword.PasswordTextBox.Text
Unload EstimatePassword
If PasswordText = "estimate" Then
Application.Run "RemoveEstimateFilter"
ElseIf PasswordText < "estimate" Then
Application.Run "WrongEstPasswordMsgBox"
End If
End Sub

On Error Resume Next

Application.StatusBar = "Removing Estimate Filters"
Dim ProtectionStatus As Boolean
If Sheet1.ProtectContents = True Then
ProtectionStatus = True
End If
If Sheet1.ProtectContents = False Then
ProtectionStatus = False
End If
If Sheet2.FilterMode = True Then
Application.Run "WorkbookUnprotect"
Application.ScreenUpdating = False
For i = 2 To 12
Worksheets(i).ShowAllData
Next
Range("TlLumber", "BlumberEstQty").Locked = False
Range("TlShores", "BShoresEstQty").Locked = False
Range("TLPlywood", "BPlywoodEstQty").Locked = False
Range("TLHardware", "BHardwareEstQty").Locked = False
Range("TLScaffold", "BScaffoldEstQty").Locked = False
Range("TLPurlinsRunners", "BPurlinsRunnersEstQty").Locked = False
Range("TLHVDoka", "BHVDokaEstQty").Locked = False
Range("TLCecoWalls", "BCecowallsEstQty").Locked = False
Range("TLBurkeHandset", "BBurkeHandsetEstQty").Locked = False
Range("TLBurkeCranset", "BBurkeCranesetEstQty").Locked = False
Range("TLPansEquip", "BPansEquipEstQty").Locked = False
ElseIf Sheet12.FilterMode = False Then Resume Next
End If
If ProtectionStatus = True Then
Application.Run "WorkbookProtect"
ElseIf ProtectionStatus = False Then Resume Next
End If
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub

Sorry it's so lengthy!


Nicole B

Toggle Button Updating Concern
 
Thanks, Jim. I'm working on it...I'll get back to you tomorrow if I'm still
stuck.

"Jim Thomlinson" wrote:

I don't want to leavy you high and dry but I have to go now. Re-post tomorrow
if it still won't work.

"Jim Thomlinson" wrote:

I am going to stick with a few generallities here to see if we can clean
things up. At the top of your code modules ad teh word Option Explicit . This
will require explicit variable declarations. When you have done this click
Debug - Compile. Clean up any sysntax errors that the compiler finds. In the
code that you posted the list procedure is not declared with a procedure
name. Once this is done Place your cursor in the ProtectionToggle_Click
precedure and hit F8. This will allow you to trace your code one line at a
time and see what is occuring as the code executes. Hopefully this will help
you find your problem.

With respect to the Call of procedures. The Idea behind public and private
is to hide or expose the functionallity of specific sheets and modules from
other sheets and modules. The rule o fthumb is to try to keep as much private
as is possible, but if the proceudure is required outside the moduel then
make it public. Try this to see what I mean. Insert a new module into your
project. Create two sub procedures. one public and one private. Something
like this... Name the module modMyModule

public sub MyPublicMessage ()
msgbox "Public message"
end sub

private sub MyPrivateMessage()
msgbox "Private Message"
end sub

Now in one of your other modules type

Call modMyModule.

The intellisence will give you a list showing you your public procedure. It
will also show any public variables...

HTH

"Nicole B" wrote:

To call a procedure, you just type Call ProcedureName? I'll try that.
That's what happens when you're teaching yourself to program from books...you
don't learn the best way to do things...

Here are the subprocedures, in order as best as they can be (they look
somewhat circular but I don't think they really are). By the way, the msgbox
pops up twice, too, as well as the userform.

Private Sub ToggleEstimateFilters_Click()
Application.ScreenUpdating = False
If Sheet2.FilterMode = True Then
With ToggleEstimateFilters
.Caption = " Hide Items Not in Estimate"
.Value = False
End With
Application.Run "RunEstPasswordUserForm"
ElseIf Sheet2.FilterMode = False Then
ans = MsgBox("Are you sure you want to hide the items that are not in
the estimate?" _
& vbLf & "This action cannot be undone without a password.",
vbOKCancel + vbInformation, _
"Confirm Filter")
If ans = vbOK Then
With ToggleEstimateFilters
.Caption = " Show All Items"
.Value = False
End With
Application.Run "FilterEstimateData.FilterEstimateData"
End If
If ans = vbCancel Then End
End If
Application.ScreenUpdating = True
End Sub

Private Sub RunEstPasswordUserForm()
EstimatePassword.Show
End Sub

Private Sub OKButton_Click()
Application.Run "FilterEstimateData.ConfirmPassword"
End Sub

Private Sub ConfirmPassword()
PasswordText = EstimatePassword.PasswordTextBox.Text
Unload EstimatePassword
If PasswordText = "estimate" Then
Application.Run "RemoveEstimateFilter"
ElseIf PasswordText < "estimate" Then
Application.Run "WrongEstPasswordMsgBox"
End If
End Sub

On Error Resume Next

Application.StatusBar = "Removing Estimate Filters"
Dim ProtectionStatus As Boolean
If Sheet1.ProtectContents = True Then
ProtectionStatus = True
End If
If Sheet1.ProtectContents = False Then
ProtectionStatus = False
End If
If Sheet2.FilterMode = True Then
Application.Run "WorkbookUnprotect"
Application.ScreenUpdating = False
For i = 2 To 12
Worksheets(i).ShowAllData
Next
Range("TlLumber", "BlumberEstQty").Locked = False
Range("TlShores", "BShoresEstQty").Locked = False
Range("TLPlywood", "BPlywoodEstQty").Locked = False
Range("TLHardware", "BHardwareEstQty").Locked = False
Range("TLScaffold", "BScaffoldEstQty").Locked = False
Range("TLPurlinsRunners", "BPurlinsRunnersEstQty").Locked = False
Range("TLHVDoka", "BHVDokaEstQty").Locked = False
Range("TLCecoWalls", "BCecowallsEstQty").Locked = False
Range("TLBurkeHandset", "BBurkeHandsetEstQty").Locked = False
Range("TLBurkeCranset", "BBurkeCranesetEstQty").Locked = False
Range("TLPansEquip", "BPansEquipEstQty").Locked = False
ElseIf Sheet12.FilterMode = False Then Resume Next
End If
If ProtectionStatus = True Then
Application.Run "WorkbookProtect"
ElseIf ProtectionStatus = False Then Resume Next
End If
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub

Sorry it's so lengthy!



All times are GMT +1. The time now is 11:15 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com