2015-01-13 2 views
0

У меня странная проблема при добавлении ключа в коллекцию. Ошибка выполнения 13: Несоответствие типовДобавление ключа в коллекцию в VBA

Модуль Код:

'comment 
Option Explicit 
'comment 
Sub testChildren() 
    'This is in Normal module 
    Dim mRoot As cMyClass, mc As cMyClass 
    Set mRoot = New cMyClass 
    With mRoot 
     'add collections 
     .Init 100, "john" 

     Set mc = New cMyClass 
     ' Here I add the key that gives the run-time error 13 
     .Children.Add mc.Init(200, "janet"), mc.Key 

     Set mc = New cMyClass 
     ' This one also generates run-time error 13 in case the previous adding is disabled 
     .Children.Add mc.Init(201, "john"), mc.Key 
     ' Generate output 
     MsgBox (.Name & " has " & CStr(.Children.Count) & " children named " & _ 
      .Children(1).Name & " and " & .Children(2).Name) 

    End With 


End Sub 

Class Module CMyClass "Это в классе Modul

Option Explicit 
Private pKey As Long 
Private pName As String 
Private pChildren As Collection 
'Define Properties 
Public Property Get Key() As Long 
    Key = pKey 
End Property 
'comment 
Public Property Get Name() As String 
    Name = pName 
End Property 
'comment 
Public Property Get Children() As Collection 
    Set Children = pChildren 
End Property 
'comment 
Public Property Let Key(p As Long) 
    pKey = p 
End Property 
' Define Methods 
Public Function Init(k As Long, sName As String) As cMyClass 
    pKey = k 
    pName = sName 
    Set pChildren = New Collection 
    Set Init = Me 
End Function 
'comment 
'comment 
+2

wrap 'mc.Key' с' Cstr (mc.Key) ' –

+0

Спасибо, что работает. – Richie10

ответ

0

У вас уже есть ответы, чтобы исправить ваш код. Но идти вперед, две вещи, чтобы обратить внимание:

  1. Run-time error 13: Type mismatch распространенная ошибка производится, когда целевой тип данных отличается от вашего типа входных данных.

  2. Это Collection class's key is String datatype,, хотя значения являются числами.

+1

Вторая ссылка для VB.NET. Для проверки VBA [Visual Basic для приложений ссылается на метод добавления коллекции] (http://msdn.microsoft.com/en-us/library/aa265006%28v=vs.60%29.aspx). – dee

+0

Полезный ключ - это строковый тип данных. Не логично определять ключ как строковый тип данных, поскольку ключи используются для сортировки и фильтрации. Методы сортировки и фильтрации должны выполняться быстрее с числовым типом данных в качестве типа символа. – Richie10

0

Как отметил @ vba4all правильного типа для Ключ коллекции - это строка ...

В cMyClass

Option Explicit 
Private pKey As String 
Private pName As String 
Private pChildren As Collection 
Public myName As String 
Public Property Get Key() As String 
    Key = pKey 
End Property 
'comment 
Public Property Get Name() As String 
    Name = pName 
End Property 
'comment 
Public Property Get Children() As Collection 
    Set Children = pChildren 
End Property 
'comment 
Public Property Let Key(p As String) 
    pKey = CStr(p) 
End Property 
' Define Methods 
Public Function Init(k As Long, sName As String) As cMyClass 
    pKey = CStr(k) 
    pName = sName 
    Set pChildren = New Collection 
    Set Init = Me 
End Function 
+0

Это работает, но меняет цель ограничить ввод только длинным. Мне нужны Long-data только для сортировки, фильтрации и т. Д. Теперь мне нужно сделать дополнительный код, чтобы пользователь не мог вводить нечисловые символы. С решением, обозначенным @ vba4all, мне не нужно это делать, так как тип данных остается прежним. – Richie10

Смежные вопросы