title: Are VBA Class module properties slow compared to accessing fields of User Defined Types?
body: <p>I've been trying to develop a macro with a class module, but get/let seems to take a really long time when compared to UDT's. I'm really interested in why this is, can anyone explain this? I've only found discussions that talk about function/sub execution, which seems to be just as fast. </p>
  
  <p>The current problem is setting a property, which takes about 3000ms for the class (for two million lets) and 120ms for doing the same using a UDT. </p>
  
  <p>I'm trying to decide whether or not I should advise the macro developers to avoid using class modules when they need to get or set a lot of properties. Using only this as data I should, but maybe you have different insights. </p>
  
  <p>I would like to understand why this is so slow. Maybe I'm just doing something wrong.  </p>
  
  <p>The example code:</p>
  
  <pre><code>Public Type Participant
      Name As String
      Gender As Integer
  End Type
  
  Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
  
  Sub TimeUDT()
     Dim i As Long
     Dim startMs As Long
     startMs = GetTickCount
     Dim participants(1 To 1000000) As Participant
     For i = 1 To 1000000
        participants(i).Name = "TestName"
        participants(i).Gender = 1
     Next
     Debug.Print GetTickCount - startMs
  End Sub
  
  Sub TimeCls()
     Dim i As Long
     Dim startMs As Long
     Dim participants(1 To 1000000) As New clsParticipant
     startMs = GetTickCount
     For i = 1 To 1000000
        participants(i).Name = "TestName"
        participants(i).Gender = 1
     Next
     Debug.Print GetTickCount - startMs
  End Sub
  </code></pre>
  
  <p>And the class module (named clsParticipant):</p>
  
  <pre><code>Private iGender As Integer
  Private sName As String
  
  Public Property Let Gender(value As Integer)
     iGender = value
  End Property
  Public Property Get Gender() As Integer
     Gender = iGender
  End Property
  
  Public Property Get Name() As String
     Name = sName
  End Property
  Public Property Let Name(value As String)
     sName = value
  End Property
  </code></pre>