Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 21
Default Creating a User Defined Class / Object

I am fairly new to VBA and am working on a project where a simple Object
structure could be useful. Most of my previous scripting has been with php
and javascript, both of which blur the distinction between Classes and
Objects so I am pretty fuzzy on it myself.

With javascript you can define a variable as an Object and simply assign
properties to it:

var myObject = New Object ()
myObject.name = "My Name"

This can be very easy to work with and useful. This is what I have come up
with for a slightly more complex VBA equivalent. If there is a better way to
structure it I would appreciate the feedback.

In a class module called DRec I have:

Option Explicit

Public sf As String
Public tf As String
Public oa As Boolean
Public del As Boolean
Public aso As String
Public codes As String
Public t As String
Public tfa As String
Public ttb As String
Public k As String
Public kfa As String
Public ktb As String
Public m As String
Public mfa As String
Public mtb As String

Sub docc()
MsgBox "DRec Test " & m & " : " & t
End Sub

Then in a standard module I have:

Function docArray(sf As String, Optional tf As String = "", _
Optional oa As Boolean = True, Optional del As Boolean =
True, _
Optional aso As String = "", Optional codes As String =
"", _
Optional t As String = "", Optional tfa As String = "",
Optional ttb As String = "", _
Optional k As String = "", Optional kfa As String = "",
Optional ktb As String = "", _
Optional m As String = "", Optional mfa As String = "",
Optional mtb As String = "" _
) As DRec

Dim ar(1 To 15) As Variant
Dim tRec As DRec
Set tRec = New DRec
tRec.tf = tf
If tf = "" Then tf = sf
tRec.sf = sf
tRec.tf = tf
tRec.oa = oa
tRec.del = del
tRec.aso = aso
tRec.codes = codes
tRec.t = t
tRec.tfa = tfa
tRec.ttb = ttb
tRec.k = k
tRec.kfa = kfa
tRec.ktb = ktb
tRec.m = m
tRec.mfa = mfa
tRec.mtb = mtb
Set docArray = tRec
End Function

Sub testDRec()
Dim v As DRec
Set v = docArray(sf:="Daily Bulletin Folder", codes:="ABC", t:="Daily
Bulletin", m:="emailBody")
v.docc
End Sub

Any pointers to better formulation much appreciated

Andrew
  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 21
Default Creating a User Defined Class / Object

As you can see I am using the function docArray to initialize / set default
values for the DRec class. Maybe it would be better to have it as part of the
Class definition. So this is my second version:

DRec Class Module:


Public sf As String
Public tf As String
Public oa As Boolean
Public del As Boolean
Public aso As String
Public codes As String
Public t As String
Public tfa As String
Public ttb As String
Public k As String
Public kfa As String
Public ktb As String
Public m As String
Public mfa As String
Public mtb As String

Sub docc()
MsgBox m & ":" & t
End Sub

Sub init(csf As String, Optional ctf As String = "", _
Optional coa As Boolean = True, Optional cdel As Boolean =
True, _
Optional caso As String = "", Optional ccodes As String =
"", _
Optional ct As String = "", Optional ctfa As String = "",
Optional cttb As String = "", _
Optional ck As String = "", Optional ckfa As String = "",
Optional cktb As String = "", _
Optional cm As String = "", Optional cmfa As String = "",
Optional cmtb As String = "" _
)

tf = ctf
If ctf = "" Then tf = csf
sf = csf
tf = ctf
oa = coa
del = cdel
aso = caso
codes = ccodes
t = t
tfa = ctfa
ttb = cttb
k = ck
kfa = ckfa
ktb = cktb
m = cm
mfa = cmfa
mtb = cmtb
End Sub

------------- Standard Module--------------------------

Sub testDRec()
Dim tRec As DRec
Set tRec = New DRec
tRec.init csf:="ABN Daily Bulletin", ccodes:="ABN", ct:="Daily Bulletin",
cm:="emailBody"
End Sub

  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 4,391
Default Creating a User Defined Class / Object

Andrew,
I'll leave it to others to discuss the differences between a class and an
object. For me, any distinction is somewhat irrelevant, as they both provide
a means of encapsulating data/concepts.

I tend to use Property Let/Get instead of Public variable, as you are then
able to validate the input as required, or run other code when a property is
changed or supplied.

Private m_sf As String
Property Let sf(argIn As String)
If Left(argIn, 2) = "OK" Then
m_sf = argIn
Else
m_sf = ""
End If
End Property

Property Get sf() As String
Call SomeOtherRoutineToCheckData
sf = m_sf
End Property

You can also omit the Let to make the property read only, something you
cannot do with public variables. Or indeed make them write-only by omitting
the Get routine.

There's the _Initialize routine that run when the class is created, so you
can set any default values and run any initialization code, similar to what
you are currently doing in your docArray routine.
(You do not have to code the initialization of string to "", as that happens
anyway, but you would have to code the boolean=True, as the default is
False.
Private Sub Class_Initialize()
m_sf = "Initialization code has run."
End Sub

Unless "sf", "oa" etc really mean something to you, I'd use more descriptive
names.

And then use your class somewhere suitable in code:
Private Sub CommandButton1_Click()
Dim NewClassTest As cTest

Set NewClassTest = New cTest
'Initailization is run when this object is created.

With NewClassTest
MsgBox .sf
.oa = True
End With

End Sub

Methods are written as a Sub/Function and you can also Raise events.

NickHK

"Andrew Hall NZ" wrote in message
...
I am fairly new to VBA and am working on a project where a simple Object
structure could be useful. Most of my previous scripting has been with php
and javascript, both of which blur the distinction between Classes and
Objects so I am pretty fuzzy on it myself.

With javascript you can define a variable as an Object and simply assign
properties to it:

var myObject = New Object ()
myObject.name = "My Name"

This can be very easy to work with and useful. This is what I have come up
with for a slightly more complex VBA equivalent. If there is a better way

to
structure it I would appreciate the feedback.

In a class module called DRec I have:

Option Explicit

Public sf As String
Public tf As String
Public oa As Boolean
Public del As Boolean
Public aso As String
Public codes As String
Public t As String
Public tfa As String
Public ttb As String
Public k As String
Public kfa As String
Public ktb As String
Public m As String
Public mfa As String
Public mtb As String

Sub docc()
MsgBox "DRec Test " & m & " : " & t
End Sub

Then in a standard module I have:

Function docArray(sf As String, Optional tf As String = "", _
Optional oa As Boolean = True, Optional del As Boolean =
True, _
Optional aso As String = "", Optional codes As String =
"", _
Optional t As String = "", Optional tfa As String = "",
Optional ttb As String = "", _
Optional k As String = "", Optional kfa As String = "",
Optional ktb As String = "", _
Optional m As String = "", Optional mfa As String = "",
Optional mtb As String = "" _
) As DRec

Dim ar(1 To 15) As Variant
Dim tRec As DRec
Set tRec = New DRec
tRec.tf = tf
If tf = "" Then tf = sf
tRec.sf = sf
tRec.tf = tf
tRec.oa = oa
tRec.del = del
tRec.aso = aso
tRec.codes = codes
tRec.t = t
tRec.tfa = tfa
tRec.ttb = ttb
tRec.k = k
tRec.kfa = kfa
tRec.ktb = ktb
tRec.m = m
tRec.mfa = mfa
tRec.mtb = mtb
Set docArray = tRec
End Function

Sub testDRec()
Dim v As DRec
Set v = docArray(sf:="Daily Bulletin Folder", codes:="ABC", t:="Daily
Bulletin", m:="emailBody")
v.docc
End Sub

Any pointers to better formulation much appreciated

Andrew



  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 4,391
Default Creating a User Defined Class / Object

Andrew,
Make a start with all that and post back if you have further questions.

NickHK

"Andrew Hall NZ" wrote in message
...
Thanks a lot Nick. I got part of the way while you were typing. The

Private
Sub Class_Initialize() is what I was looking for. The string default ""

is
obvious but I had missed it. I need to do some reading on Property Let /

Get.

Cheers

Andrew



Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
How does one create a delete property of a user defined class? [email protected] Excel Programming 6 June 28th 06 08:12 PM
User-defined type collection in class module Rob[_29_] Excel Programming 2 May 31st 06 06:02 PM
Creating my own user defined function help statements Craig Excel Worksheet Functions 2 February 22nd 06 04:51 PM
User Defined Object help fast reddog9069[_14_] Excel Programming 0 July 27th 05 03:40 PM
Creating a action for a defined object Adrix[_4_] Excel Programming 3 April 22nd 04 07:37 PM


All times are GMT +1. The time now is 10:38 PM.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright ©2004-2024 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"