ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Current Control Object ? (https://www.excelbanter.com/excel-programming/430562-current-control-object.html)

Charlotte E

Current Control Object ?
 
When working with UserForms I normally assign the current control object
(CCO) to an object variable for ease of use, i.e.:

_________________________________
Private Sub OptionButton1_Click()

Dim CCO As Object
Set CCO = OptionButton1

If CCO.Value = False Then
CCO.ForeColor = 5
End If

End Sub
ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ

Now I'm wondering if it is possible to set this object variable without
actually know the name of the control???

Maybe something like:

_________________________________
Dim CCO As Object
Set CCO = ThisControl.Name
ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ

Hope I've made my explaning clear enough - or to put it short: Is there a
way of knowing what control the current control macro is for?


TIA,



jamescox[_95_]

Current Control Object ?
 

Well,

Dim CCO As Object
Set CCO = Me.ActiveControl

seems to work, because

CCO.Name

gives the right results on the test case I made up.

I'd really, really be interested in learning your thoughts on what
advantages the use of the CCO intermediate object assignment give to
your code.

Prithee, please elucidate! (Prithee please! :) )


--
jamescox
------------------------------------------------------------------------
jamescox's Profile: http://www.thecodecage.com/forumz/member.php?userid=449
View this thread: http://www.thecodecage.com/forumz/sh...d.php?t=114782


Charlotte E

Current Control Object ?
 

I'd really, really be interested in learning your thoughts on what
advantages the use of the CCO intermediate object assignment give to
your code.
Prithee, please elucidate! (Prithee please! :) )


Lazyness :-)

If I have an userform with dozens of, say textboxes, which needs to be
controlled for correct entered values as the user types, and perhaps also
needs to be formattet along the way, I only need to make the code once.

Then I can use the same code in all 'TextboxYY_Change' modules, without
changing a single letter in the module!

It also makes it easier to change the code, if needed in the future, since I
only have to change a single line, and the rest of the code will now use the
new object instead.

So, no fancy trick here - just pure lazyness :-)


CE




jamescox[_97_]

Current Control Object ?
 

Thought it might be that, but there was always a chance I was missing
some deeper advantage. However, don't get me wrong - I'm a big fan of
POLE (Path Of Least Effort). :Bgr

The next step that comes to mind - if your code for a group of the
userform controls is essentially identical - is to put that code in a
Private Sub and pass CCO as a parameter to the Sub. That way, you only
have one place to type the Sub code - and more importantly, only one
place to change / modify it. But, you may already be doing that...

Two comments - you would gain a bit of speed if you would declare CCO
as the appropriate type of control instead of Object. It's not like it
was a mystery what type of control it is, because the Dim is in the
event code of a specific control.

If you use Object, VBA has to take a look at what the properties of
Me.ActiveControl are, figure out what kind of control it is and then
create an instance of that kind of control for your Set statement. That
doesn't take a whole lot of time, but if it has to be done often enough,
it adds up. Also, if you declare it as the proper type of control,
Intellisense (the feature of VBA that shows you allowable methods and
properties as you type) will work.

Finally, don't forget to use CCO = Nothing to clean up after you don't
need CCO any more.

(BTW, in terms of knowing 'who' called what code, don't forget the
.Caller method for regular subs and functions.)


--
jamescox
------------------------------------------------------------------------
jamescox's Profile: http://www.thecodecage.com/forumz/member.php?userid=449
View this thread: http://www.thecodecage.com/forumz/sh...d.php?t=114782


Charlotte E

Current Control Object ?
 
Thanks for your PoWs - I've saved this in my 'little' VBA library :-)


jamescox wrote:
Thought it might be that, but there was always a chance I was missing
some deeper advantage. However, don't get me wrong - I'm a big fan of
POLE (Path Of Least Effort). :Bgr

The next step that comes to mind - if your code for a group of the
userform controls is essentially identical - is to put that code in a
Private Sub and pass CCO as a parameter to the Sub. That way, you
only have one place to type the Sub code - and more importantly, only
one place to change / modify it. But, you may already be doing
that...

Two comments - you would gain a bit of speed if you would declare CCO
as the appropriate type of control instead of Object. It's not like
it was a mystery what type of control it is, because the Dim is in the
event code of a specific control.

If you use Object, VBA has to take a look at what the properties of
Me.ActiveControl are, figure out what kind of control it is and then
create an instance of that kind of control for your Set statement.
That doesn't take a whole lot of time, but if it has to be done often
enough, it adds up. Also, if you declare it as the proper type of
control, Intellisense (the feature of VBA that shows you allowable
methods and properties as you type) will work.

Finally, don't forget to use CCO = Nothing to clean up after you don't
need CCO any more.

(BTW, in terms of knowing 'who' called what code, don't forget the
Caller method for regular subs and functions.)





All times are GMT +1. The time now is 12:18 AM.

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