2015-05-08 6 views
0

Я пытаюсь узнать, как создать пользовательский тип данных, а затем использовать его с коллекцией. Я решил проблему другим способом, но это началось с отчета по расписанию, который я автоматизировал. Я изначально хотел иметь 2-мерный массив с различными типами данных. Когда я не мог этого сделать, некоторые исследования привели к идее сбора пользовательских типов данных. Однако примеры, которые я нашел, продолжают подталкивать меня к созданию класса. Мне это пока не нравится, и похоже, что это должно быть выполнимо. Вот вроде того, что я ищу (я начал с примера, я нашел на этом сайте):Excel VBA Коллекции и пользовательские типы данных

Option Explicit 

'***** User defined type 
Public Type MyType 
    MyInt As Integer 
    MyString As String 
    MyDoubleArr(2) As Double 
End Type 

Public ColThings As Collection 

Sub CollectionTest() 
    Dim x As Integer 
    Dim vrecord As MyType 

    For x = 1 To 4 
     vrecord.MyInt = x 
     vrecord.MyString = "Matt" 
     vrecord.MyDoubleArr(0) = x + 5 
     vrecord.MyDoubleArr(1) = x + 6 
     vrecord.MyDoubleArr(2) = x + 7 
     ColThings.Add vrecord 
    Next x 

    For x = 1 To 4 
    Debug.Assert vrecord.MyInt & " - " & vrecord.MyString & " - " & vrecord.MyDoubleArr(0) & ", " & vrecord.MyDoubleArr(1) & ", " & vrecord.MyDoubleArr(0) 
    Next x 
End Sub 

Ошибки я получаю: Ошибка компиляции: «Только пользовательские типы, определенные в общественных местах объектные модули могут быть принудительно применены к варианту или из него или переданы в функции поздней связи »

Я не новичок с VBA, но я пытаюсь сделать следующий шаг.

Заранее спасибо.

+0

Мое понимание (и, возможно, я ошибаюсь здесь), что вы не можете добавить определяемый пользователем тип в коллекцию, которая сама по себе является объектом. Я думаю, вам нужно будет создать класс, создать экземпляр, а затем добавить его в свою коллекцию. Возможно, вы сможете использовать массив вместо коллекции для хранения вашего UDT. – Soulfire

+0

Непонятно, почему вы заканчиваете * vrecord *, а не * ColThings * в конце вашей процедуры. – Jeeped

+0

Остановка * неправильная практика *; создайте класс, рекомендуемый рекомендациями, и начните * практиковать его правильно *. Практиковать свои плохие привычки так напряженно, рано, просто усложнит их позднее. –

ответ

1

Я принял удар, в конечном счете, я не уверен, что это то, что вы хотите, но если вы не хотите создавать класс, то единственным другим вариантом, который я вижу, является сохранение ваших типов в массиве вместо коллекции. Насколько мне известно (пожалуйста, поправьте меня, если я ошибаюсь) вы не можете добавить определяемый пользователем тип в коллекцию, вы должны создать его как класс, создать экземпляр объекта этого класса, а затем добавить его в коллекцию.

Вместо этого я объявил массив Records() из MyType и добавил каждый MyType к этому массиву.

Option Explicit 

'***** User defined type 
Public Type MyType 
    MyInt As Integer 
    MyString As String 
    MyDoubleArr(2) As Double 
End Type 

Public ColThings As Collection 

Sub CollectionTest() 
    Dim x As Integer 
    Dim Records() As MyType 
    Dim vrecord As MyType 

    For x = 1 To 4 
     vrecord.MyInt = x 
     vrecord.MyString = "Matt" 
     vrecord.MyDoubleArr(0) = x + 5 
     vrecord.MyDoubleArr(1) = x + 6 
     vrecord.MyDoubleArr(2) = x + 7 
     ReDim Preserve Records(x) 
     Records(x) = vrecord 
    Next x 

    For x = 1 To 4 
    Debug.Print Records(x).MyInt & " - " & Records(x).MyString & " - " & Records(x).MyDoubleArr(0) & ", " & Records(x).MyDoubleArr(1) & ", " & Records(x).MyDoubleArr(0) 
    Next x 

End Sub 

Я считаю, что это похоже к тому, что вы хотите достичь. Я еще не пытался метод класса, поскольку вы сказали, что не совсем готовы к этому, но это было бы очень хорошим упражнением по моему скромному мнению.

+0

Благодарим вас за ответ. Возможно, я очень хорошо сбился с того, что я прочитал в MSDN ([link] (https://msdn.microsoft.com/en-us/library/e1ad18x6%28v=vs.90 % 29.aspx)). Это обсуждение касалось использования коллекций с данными, не относящимися к объектам. При рассмотрении этой должности, похоже, что это для визуального базового, а не для VBA. Я согласен, что это, вероятно, хороший прыжок, чтобы я работал с классами. Массив User-Defined-Type был бы ответом на мою оригинальную проблему. Но теперь это учебное упражнение. Еще раз спасибо. –

+0

Да, я считаю, что вы были непреднамеренно введены в заблуждение. Это происходит между 'VB'' VBScript' и 'VBA', но я занимался небольшим исследованием (вызвал мое любопытство), и каждый найденный источник говорит, что добавление пользовательских типов в коллекцию не поддерживается в' VBA' , – Soulfire

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