<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Excel Do, Dynamic Does : User Defined Types</title><link>http://msmvps.com/blogs/xldynamic/archive/tags/User+Defined+Types/default.aspx</link><description>Tags: User Defined Types</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Typing May Be Good For You</title><link>http://msmvps.com/blogs/xldynamic/archive/2010/02/17/typing-may-be-good-for-you-too.aspx</link><pubDate>Wed, 17 Feb 2010 13:03:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1758149</guid><dc:creator>Bob Phillips</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/xldynamic/rsscomments.aspx?PostID=1758149</wfw:commentRss><comments>http://msmvps.com/blogs/xldynamic/archive/2010/02/17/typing-may-be-good-for-you-too.aspx#comments</comments><description>&lt;p&gt;





&lt;/p&gt;
&lt;p&gt;





&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	I have written previously about &lt;a href="http://msmvps.com/blogs/xldynamic/archive/2009/09/12/what-s-my-type.aspx"&gt;User Defined Types&lt;/a&gt;, where I showed what I feel is a good, legitimate use of UDTs, namely the saving of application settings at the start of my procedures, then re-instating them at the end. I have since extended that technique to make it more generic, as follows&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Public Type ApplicationValues&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppEnableEvents As Boolean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppScreenUpdating As Boolean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppDisplayAlerts As Boolean&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppCalculation As XlCalculation&lt;br /&gt;
End Type&lt;br /&gt;
&lt;br /&gt;
Public Function DoSomeStuff()&lt;br /&gt;
Dim myAppSettings As ApplicationValues&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Call AppSettings(State:=&amp;quot;Set&amp;quot;, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppType:=mpAppSettings, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppEvents:=True, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppScreen:=False, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppAlerts:=False, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppCalc:=-1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; On Error GoTo func_error&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;... main code&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;func_exit: &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Call AppSettings(State:=&amp;quot;Reset&amp;quot;, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AppType:=mpAppSettings, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppEvents:=True, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppScreen:=False, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppAlerts:=False, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppCalc:=-1)&lt;br /&gt;
&lt;br /&gt;
func_error:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lsquo;your error handler&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Resume func_exit&lt;br /&gt;
End Function&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Public Function AppSettings( _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ByVal State As String, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ByRef AppType As ApplicationSettings, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ByVal AppEvents As Boolean, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ByVal AppScreen As Boolean, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ByVal AppAlerts As Boolean, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ByVal AppCalc As XlCalculation) As Boolean&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;With AppType&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case State&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case &amp;quot;Set&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If AppEvents Then&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AppEnableEvents = Application.EnableEvents&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.EnableEvents = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppScreen Then&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AppScreenUpdating = Application.ScreenUpdating&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.ScreenUpdating = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppAlerts Then&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AppDisplayAlerts = Application.DisplayAlerts&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.DisplayAlerts = False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppCalc &amp;lt;&amp;gt;
appNotEnabled Then&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.AppCalculation = Application.Calculation&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.Calculation = AppCalc&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case &amp;quot;Reset&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppEvents Then Application.EnableEvents = .AppEnableEvents&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppScreen Then Application.ScreenUpdating = .AppScreenUpdating&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppAlerts Then Application.ScreenUpdating = .AppScreenUpdating&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If AppCalc &amp;lt;&amp;gt; appNotEnabled Then Application.Calculation = .AppCalculation&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;End With&lt;br /&gt;
End Function&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	That in itself was a nice improvement for my code, but recently I have started to use UDTs more frequently, in the way that they were probably meant for, creating data types.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	I have found myself frequently creating datasets, so I created UDTs to cover this. For this sake of this discussion, I will cover one specific type in my application, User data.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	I began by creating a UDT like so&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
PublicType AppUser&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;LoginID As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Name As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;DesignerId As Long&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Supervisor As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserReports As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;NewSalesTarget As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;RepeatsTarget As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Deleted As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedBy As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedOn As Date&lt;br /&gt;
End Type&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	This was fine, it worked well, but in reality my user data was much larger, there were more permission types, and more targets. As such, I found that I was still working through each variable individually. I also use classes a lot, so my user class had every data item as a separate property. Although I could pass the UDT around my application quite well, I still had to refer to every item separately, define it everywhere.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	I then had an idea. Why not create another UDT, for permissions say, and nest them. The UDT definitions would then look like this&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Public Type AppPermissions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Supervisor As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserReports As Boolean&lt;br /&gt;
End Type&lt;br /&gt;
&lt;br /&gt;
Public Type AppUser&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;LoginID As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Name As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;DesignerId As Long&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Permissions As AppPermissions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;NewSalesTarget As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;RepeatsTarget As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Deleted As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedBy As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedOn As Date&lt;br /&gt;
End Type&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	Then I can use the familiar dot notation to refer to it, for instance&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Dim myUser As AppUser&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox myUser.Permissions.Supervisor&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	In my class, it simplifies code. So instead of this,&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Private mcSupervisor As Boolean&lt;br /&gt;
Private mcUserReports As Boolean&lt;br /&gt;
&lt;br /&gt;
Public Property Get Supervisor() As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Supervisor = mcSupervisor&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let Supervisor(ByVal Status As Boolean)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcSupervisor = Status&lt;br /&gt;
End Property&lt;br /&gt;
&lt;br /&gt;
Public Property Get UserReports() As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserReports = mcUserReports&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let UserReports(ByVal Status As Boolean)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcUserReports = Status&lt;br /&gt;
End Property&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	I now have the UDTs shown above defined in a standard module, and in my class module&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Private mcPermssions As AppPermissions&lt;br /&gt;
&lt;br /&gt;
Public Property Get Permissions() As AppPermissions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Permissions = mcPermissions&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let Permissions(ByRef Values As AppPermissions)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcPermissions = Values&lt;br /&gt;
End Property&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	[Note, that for UDTs, the argument must be passed ByRef]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	In itself this is much cleaner and clearer in my view, but it gets better when you use it. To set the permissions, the code would be similar to&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Dim myUser As User&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set MyUser = New User&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;With myUser&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.LoginID = &amp;ldquo;Bob&amp;rdquo;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.UserName = &amp;ldquo;Bob Phillips&amp;rdquo;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Permissions.Supervisor = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Permissions.UserReports = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lsquo;etc&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End With&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;or even
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Dim myUser As User&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set MyUser = New User&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;With myUser&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.LoginID = &amp;ldquo;Bob&amp;rdquo;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.UserName = &amp;ldquo;Bob Phillips&amp;rdquo;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;With .Permissions&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Supervisor = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .UserReports = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End With&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lsquo;etc&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End With&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	As you can see, we are now breaking the user object down into properties which are objects in their own right, and using the dot notation to navigate down to the actual property, just as the Excel object does. This provides clarity and an element of object documentation within your code. Intellisense is retained, and is actually better because it is focussed.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	In reality, I have nested even further as I have a Reports UDT which is nested within my permissions UDT, so the full definition is as follows, first the standard module UDT definitions, then the user class properties&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:green;"&gt;
&amp;lsquo;UDT Definitions&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Public Type AppReports&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TaskList As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;FollowUp As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TotalQuotes As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Dashboard As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Commission As Boolean&lt;br /&gt;
End Type&lt;br /&gt;
&lt;br /&gt;
Public Type AppPermissions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Supervisor As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Reports As AppReports&lt;br /&gt;
End Type&lt;br /&gt;
&lt;br /&gt;
Public Type AppSalesTargets&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;SalesGoal As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;BonusGoal As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPMGoal As Double&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ClosingRatio As Double&lt;br /&gt;
End Type&lt;br /&gt;
&lt;br /&gt;
Public Type AppUser&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;LoginID As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Name As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;DesignerId As Long&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Permissions As AppPermissions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Targets As AppSalesTargets&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Deleted As Boolean&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedBy As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedOn As Date&lt;br /&gt;
End Type&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="page-break-after:avoid;"&gt;&lt;b&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	[Note that UDTs defined within another UDT have to be defined first, no forward referencing allowed]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:green;"&gt;
&amp;lsquo;Class Properties&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;
Private mcUser As AppUser&lt;br /&gt;
Private mcPermissions As AppPermissions&lt;br /&gt;
Private mcTargets As AppSalesTargets&lt;br /&gt;
&lt;br /&gt;
Public Property Get LoginID() As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;LoginID = mcUser.LoginID&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let LoginID(ByVal Id As String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcUser.LoginID = Id&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Call SetUserDetails(True)&lt;br /&gt;
End Property&lt;br /&gt;
&lt;br /&gt;
Public Property Get UserDetails() As AppUser&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;UserDetails = mcUser&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let UserDetails(ByRef Values As AppUser)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcUser = Values&lt;br /&gt;
End Property&lt;br /&gt;
&lt;br /&gt;
Public Property Get Permissions() As AppPermissions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Permissions = mcPermissions&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let Permissions(ByRef Values As AppPermissions)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcPermissions = Values&lt;br /&gt;
End Property&lt;br /&gt;
&lt;br /&gt;
Public Property Get Targets() As AppSalesTargets&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Targets = mcTargets&lt;br /&gt;
End Property&lt;br /&gt;
Public Property Let Targets(ByRef Values As AppSalesTargets)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mcTargets = Values&lt;br /&gt;
End Property&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	I always find the mass of Get/Let property definitions an impediment when reading class code, albeit a minor impediment, but an impediment all the same. Using this approach removes that code clutter whilst fully retaining the application functionality.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	This approach fits perfectly with my beliefs in strong, structured coding style, making sure that the code is maintainable as well as functioning correctly.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;
	The only real disadvantage that I can see is that the UDTs are not defined within the class itself, where they really belong. We could define Private UDTs in the class, but then they would not be available within the main application code. We could define Private UDTs in the class, and Public UDTs in a standard module, but this would be rather pointless. This is one of the main failings of UDTs in my view, one that has stopped me using them to any great degree before. With this approach, I envisage using them far more (I may be slow Ross, but I catch on eventually&amp;hellip;.).&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1758149" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel/default.aspx">Excel</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Methodology/default.aspx">Methodology</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/User+Defined+Types/default.aspx">User Defined Types</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/UDT/default.aspx">UDT</category></item><item><title>What's My Type?</title><link>http://msmvps.com/blogs/xldynamic/archive/2009/09/12/what-s-my-type.aspx</link><pubDate>Sat, 12 Sep 2009 22:12:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1722964</guid><dc:creator>Bob Phillips</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/xldynamic/rsscomments.aspx?PostID=1722964</wfw:commentRss><comments>http://msmvps.com/blogs/xldynamic/archive/2009/09/12/what-s-my-type.aspx#comments</comments><description>&lt;p&gt;





&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I am a big advocate of using the Enum construct in VBA, I feel that it is a simple way of adding a set of values, and provides a grouping, abstracting advantage that is not given by simple variables. Plus they can add to intellisense. As such, I should also be a fan of another specialised construct, the Type statement, but it is quite the opposite, I naturally avoid it. This is not
because I think the Type statement is a bad concept, in fact I think the basic idea is great,
but more because of its implementation; whenever I try to use it in anger, it
breaks on me. As such, I tend to avoid it and create classes.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Earlier this week, it occurred to me that there was a case in
which I could implement a Type, an elegant solution, with no chance of it
breaking on me.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;We all know that when your masterpiece sets application
variables, such as calculation mode, in its processing, they should be reset at
the end to whatever state the user originally had them. The normal way to do
this is to save them in a bunch of variables at the start of the process, and
restore them at the end.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;My solution is very similar, but the benefits of Type add an
elegance that I don&amp;rsquo;t feel the variables give it.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Here is that solution.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;Public Type ApplicationValues&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ScreenUpdating As Boolean&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Calculation As XlCalculation&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;End Type&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;Private AppValues As
ApplicationValues&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;Public Function ObfuscateData()&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;With Application&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AppValues.ScreenUpdating =
.ScreenUpdating&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AppValues.Calculation = .Calculation&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.ScreenUpdating = False&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Calculation = xlCalculationManual&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;End With&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;On Error GoTo func_error&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;... main code&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;func_exit:&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;With Application&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.ScreenUpdating =
AppValues.ScreenUpdating&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Calculation = AppValues.Calculation&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;End With&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;func_error:&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lsquo;your error handler&lt;/p&gt;
&lt;p class="MsoNormal" style="margin-bottom:3pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Resume func_exit&lt;/p&gt;
&lt;p class="MsoNormal"&gt;End Function&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;I think this is a neat little approach. Furthermore, it is
simple and extendible, what more can we ask?&lt;/p&gt;
&lt;p class="MsoNormal"&gt;This may be obvious to you, it may be the sort of thing that
you do all of the time, but it made me smile after I had implemented it. So
much so that it is now a code snippet in my MZ-Tools, implementable at the drop
(click) of a button.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722964" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel/default.aspx">Excel</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/VBA/default.aspx">VBA</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/User+Defined+Types/default.aspx">User Defined Types</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/UDTs/default.aspx">UDTs</category></item></channel></rss>