Version 2, I added more functionality:
Option Explicit
Private Enum InvokeKinds
INVOKE_UNKNOWN = 0
INVOKE_FUNC = 1
INVOKE_PROPERTYGET = 2
INVOKE_PROPERTYPUT = 4
INVOKE_PROPERTYPUTREF = 8
'Special TLI values
INVOKE_EVENTFUNC = 16
INVOKE_CONST = 32
End Enum
Private mProperties() As String
Private mPropertiesTypes() As String
Private Sub Command1_Click()
ReplicateInterface Printer
End Sub
Private Sub ReplicateInterface(nObject As Object)
Dim iTLB As InterfaceInfo
Dim sMemberName As String
Dim sInvokeKind As String
Dim m As Long
Dim p As Long
Dim m2 As Long
Dim iText As String
Dim iStr As String
Dim iMemberName As String
Dim iTypeName As String
Set iTLB = TLI.InterfaceInfoFromObject(nObject)
ReDim mProperties(0)
' Properties
iText = "' Properties" & vbCrLf & vbCrLf
' Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYGET Then
iMemberName = iTLB.Members(m).Name
iTypeName = VarTypeName(iTLB.Members(m).ReturnType)
AddProperty iMemberName, iTypeName
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Get " & iMemberName & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ") As " & iTypeName
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ") As " & iTypeName
End If
iText = iText & vbCrLf
iText = iText & " " & iMemberName & " = m" & _
iTLB.Members(m).Name & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
' Let
For m2 = 1 To iTLB.Members.Count
If iTLB.Members(m2).InvokeKind = INVOKE_PROPERTYPUT Then
If iTLB.Members(m2).Name = iMemberName Then
iText = iText & "Public Property Let " & iMemberName
& "("
If iTLB.Members(m2).Parameters.Count = 0 Then
iText = iText & "nValue As " & _
VarTypeName(iTLB.Members(m2).ReturnType) &
")"
Else
For p = 1 To iTLB.Members(m2).Parameters.Count
iStr = iTLB.Members(m2).Parameters(p).Name
If iTLB.Members(m2).Parameters(p).Name = ""
Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName( _
iTLB.Members(m2).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m2).Parameters.Count
Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & VarTypeName( _
iTLB.Members(m2).ReturnType) & ")"
End If
iText = iText & vbCrLf
iText = iText & " m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m2
' Set
For m2 = 1 To iTLB.Members.Count
If iTLB.Members(m2).InvokeKind = INVOKE_PROPERTYPUTREF Then
If iTLB.Members(m2).Name = iMemberName Then
iText = iText & "Public Property Set " & iMemberName
& "("
If iTLB.Members(m2).Parameters.Count = 0 Then
iText = iText & "nValue As " & VarTypeName( _
iTLB.Members(m2).ReturnType) & ")"
Else
For p = 1 To iTLB.Members(m2).Parameters.Count
iStr = iTLB.Members(m2).Parameters(p).Name
If iTLB.Members(m2).Parameters(p).Name = ""
Then
iStr = "Index"
End If
iText = iText & iStr & " As " &
VarTypeName( _
iTLB.Members(m2).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m2).Parameters.Count
Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & VarTypeName( _
iTLB.Members(m2).ReturnType) & ")"
End If
iText = iText & vbCrLf
iText = iText & " Set m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m2
iText = iText & vbCrLf
End If
Next
'Let without Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYPUT Then
If InStr(iText, "Public Property Let " & iTLB.Members(m).Name) =
0 Then
iTypeName = VarTypeName(iTLB.Members(m).ReturnType)
AddProperty iTLB.Members(m).Name, iTypeName
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Let " &
iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & "nValue As " & iTypeName & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & iTypeName & ")"
End If
iText = iText & vbCrLf
iText = iText & " m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m
' Set without Get
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_PROPERTYPUTREF Then
If InStr(iText, "Public Property Set " & iTLB.Members(m).Name) =
0 Then
iTypeName = VarTypeName(iTLB.Members(m).ReturnType)
AddProperty iTLB.Members(m).Name, iTypeName
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Property Set " &
iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & "nValue As " & iTypeName & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & "nValue As " & iTypeName & ")"
End If
iText = iText & vbCrLf
iText = iText & " Set m" & iMemberName & _
" = nValue" & vbCrLf & vbCrLf
iText = iText & "End Property"
iText = iText & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf
' Methods
iText = iText & "' Methods" & vbCrLf & vbCrLf
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_FUNC Then
If iTLB.Members(m).ReturnType = 24 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Sub " & iTLB.Members(m).Name & "("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ")"
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ")"
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Sub"
iText = iText & vbCrLf & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf & vbCrLf
' Functions
iText = iText & "' Functions" & vbCrLf & vbCrLf
For m = 1 To iTLB.Members.Count
If iTLB.Members(m).InvokeKind = INVOKE_FUNC Then
If iTLB.Members(m).ReturnType <> 24 Then
iText = iText & "' " & iTLB.Members(m).HelpString & vbCrLf
iText = iText & "Public Function " & iTLB.Members(m).Name &
"("
If iTLB.Members(m).Parameters.Count = 0 Then
iText = iText & ") As " & _
VarTypeName(iTLB.Members(m).ReturnType)
Else
For p = 1 To iTLB.Members(m).Parameters.Count
iStr = iTLB.Members(m).Parameters(p).Name
If iTLB.Members(m).Parameters(p).Name = "" Then
iStr = "Index"
End If
iText = iText & iStr & " As " & VarTypeName( _
iTLB.Members(m).Parameters(p).VarTypeInfo)
If p <> iTLB.Members(m).Parameters.Count Then
iText = iText & ", "
End If
Next p
iText = iText & ") As " & VarTypeName( _
iTLB.Members(m).ReturnType)
End If
iText = iText & vbCrLf & vbCrLf
iText = iText & "End Function"
iText = iText & vbCrLf & vbCrLf & vbCrLf
End If
End If
Next m
iText = iText & vbCrLf & vbCrLf
iStr = "Option Explicit" & vbCrLf & vbCrLf
For m = 1 To UBound(mProperties)
iStr = iStr & "Private m" & mProperties(m) & " As " & _
mPropertiesTypes(m) & vbCrLf
Next m
iStr = iStr & vbCrLf & vbCrLf
Clipboard.Clear
Clipboard.SetText iStr & iText
End Sub
Private Function VarTypeName(nVarType As Long) As String
Select Case nVarType
Case 0
VarTypeName = "CustomType"
Case 2
VarTypeName = "Integer"
Case 3, 10
VarTypeName = "Long"
Case 4
VarTypeName = "Single"
Case 5
VarTypeName = "Double"
Case 6
VarTypeName = "Currency"
Case 7
VarTypeName = "Date"
Case 8
VarTypeName = "String"
Case 9, 13
VarTypeName = "Object"
Case 11
VarTypeName = "Boolean"
Case 12, 1, 36
VarTypeName = "Variant"
Case 14
VarTypeName = "Decimal"
Case 17
VarTypeName = "Byte"
Case 8192
VarTypeName = "Array"
Case Else
Stop
End Select
End Function
Private Sub AddProperty(nName As String, nTypeName As String)
ReDim Preserve mProperties(UBound(mProperties) + 1)
mProperties(UBound(mProperties)) = nName
ReDim Preserve mPropertiesTypes(UBound(mProperties))
mPropertiesTypes(UBound(mProperties)) = nTypeName
End Sub