Присвоение значений пользовательскому типу данных - PullRequest
2 голосов
/ 09 февраля 2011

Я хотел бы присвоить значения диапазона определенному пользователем типу данных.

У меня есть набор данных измерений, выполненных несколько раз в течение недели, который хранится в таблице Excel.Я создал переменную для диапазона набора данных.Затем я создал пользовательский тип данных с датой и отдельными типами.Теперь я хотел бы назначить значения диапазона для определенного пользователем типа данных.

Набор данных:

02/11/2011  3.8

02/11/2011  2.4

02/11/2011  8.9

02/12/2011  5.7

02/12/2011  4.6

02/12/2011  2.6

Я создал пользовательский тип данных:

Type phData
    Dy As Date
    ph As Single
End Type

, создал переменную типа phData и сопоставил размер сдиапазон:

Dim dailyData() As tradeData
Dim nrec as Integer
nrec = dataRng.Rows.Count
ReDim dailyData(nrec)

и определил диапазон набора данных в электронной таблице Excel:

Dim dataRng As Range
Set dataRng = Range("A2", Range("A2").End(xlDown).End(xlToRight))

, и теперь я хотел бы присвоить значения в диапазоне типу phData.Я могу присвоить одно значение за раз, используя:

 dailyData(1).Dy= dataRng(1).Value

, но мне нужно что-то более эффективное, так как у меня около 4000 записей.

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Попробуйте это:

Dim rngData As Range
Dim varDummy As Variant
Dim DailyData() As phData
Dim iDailyData As Long

Set rngData = Range("A2", Range("A2").End(xlDown).End(xlToRight)) ' or whatever

varDummy = rngData ' Reads in whole range at once into array. (Must be Variant.)
                   ' Much quicker than reading one cell at a time.

ReDim DailyData(1 To UBound(varDummy, 1))

' Parse data into your user-defined type array.
For iDailyData = LBound(DailyData) To UBound(DailyData)
    With dailyData(iDailyData)
        .Dy = CDate(varDummy(iDailyData, 1))
        .ph = CSng(varDummy(iDailyData, 2))
    End With
Next iDailyData

Не проверял код перед публикацией ...

Проверьте эту старую, но все еще весьма полезную статью: http://www.avdf.com/apr98/art_ot003.html - помните, что вы больше не ограничены ограничениями Excel 5 и 7 (если вы не используете Excel 5 или 7, в этом случае у меня есть несколько классных лент MC Hammer, которые я хотел бы продать вам ...)

1 голос
/ 09 февраля 2011

Я не знаю ни одного способа сделать это, который не включает циклы.

Однако, это будет быстрее, если вы сначала прочитаете данные диапазона в массив:

Dim theData
theData = dataRng.Value

Теперь вы можете перебирать 2-D массив "theData" и заполнять ваш массив UDT из этого.

Тим

...