VBA Добавление пользовательского объекта в коллекцию к временной переменной - PullRequest
0 голосов
/ 28 июня 2018

Итак, я следовал нескольким примерам, которые я видел при сортировке элементов в коллекции, но по какой-то причине, когда я пытаюсь сохранить элемент I во временной переменной, я получаю предупреждение от vba "Объект не поддерживает это свойство или метод Msgstr "Я установил временную переменную для варианта, но это не волнует. Может ли это быть проблемой с моим типом объекта?

 Sub selectRange()
    Dim lastrow As Long
    Dim lastColumn As Long
    Dim j As Integer
    Dim i As Integer
    Dim streamColl As Collection
    Dim ws As Worksheet
    Dim rowCount As Integer
    Dim columnCount As Integer
    Dim tempStream As Stream

    Set ws = ActiveWorkbook.Sheets("Sheet1")

    Range("E5").Select

    lastrow = Range("E5", ActiveCell.End(xlDown)).Count + 5
    lastColumn = Range("E5", ActiveCell.End(xlToRight)).Count

    Set streamColl = New Collection

    For i = 1 To lastColumn
            Set tempStream = New Stream
                tempStream.StreamName = Cells(3, i + 4).value
                tempStream.Temperature = Cells(5, i + 4).value
                tempStream.Pressure = Cells(6, i + 4).value
                tempStream.VapGasFlow = Cells(7, i + 4).value
                tempStream.VapMW = Cells(8, i + 4).value
                tempStream.VapZFactor = Cells(9, i + 4).value
                tempStream.VapViscosity = Cells(10, i + 4).value
                tempStream.LightLiqVolFlow = Cells(11, i + 4).value
                tempStream.LightLiqMassDensity = Cells(12, i + 4).value
                tempStream.LightLiqViscosity = Cells(13, i + 4).value
                tempStream.HeavyLiqVolFlow = Cells(14, i + 4).value
                tempStream.HeavyLiqMassDensity = Cells(15, i + 4).value
                tempStream.HeavyLiqViscosity = Cells(16, i + 4).value
                streamColl.Add tempStream
    Next
    MsgBox streamColl(1).StreamName
    Call sortStream(streamColl) 
End Sub

Sub sortStream(ByVal pStreamColl As Collection)
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim lastColumn As Integer
    Dim vTemp as variant



  lastColumn = 0
  k = 1
  Do While IsNumeric(pStreamColl(k).StreamName)
    lastColumn = lastColumn + 1
    k = k + 1
  Loop

  MsgBox lastColumn

  For i = 1 To lastColumn
    For j = i + 1 To lastColumn
        If pStreamColl(j).StreamName < pStreamColl(i).StreamName Then
            vTemp = pStreamColl(j)


            pStreamColl.Remove j
            pStreamColl.Add vTemp, vTemp, i
        End If
    Next j
Next i

For Each Stream In pStreamColl
    Debug.Print Stream.StreamName
Next Stream
End sub

ошибка выдается на строку

vtemp = pStreamColl(j)

Будет ли лучше использовать массив?

1 Ответ

0 голосов
/ 28 июня 2018

Поток ()

Вы можете использовать массив потоков

ReDim Streams(1 To lastColumn) As New Stream

For i = 1 To lastColumn
    With Streams(i)
        .StreamName = Cells(3, i + 4).Value
        .Temperature = Cells(5, i + 4).Value
        .Pressure = Cells(6, i + 4).Value
        .VapGasFlow = Cells(7, i + 4).Value
        .VapMW = Cells(8, i + 4).Value
        .VapZFactor = Cells(9, i + 4).Value
        .VapViscosity = Cells(10, i + 4).Value
        .LightLiqVolFlow = Cells(11, i + 4).Value
        .LightLiqMassDensity = Cells(12, i + 4).Value
        .LightLiqViscosity = Cells(13, i + 4).Value
        .HeavyLiqVolFlow = Cells(14, i + 4).Value
        .HeavyLiqMassDensity = Cells(15, i + 4).Value
        .HeavyLiqViscosity = Cells(16, i + 4).Value
    End With
Next

Используйте StrComp для сортировки строк

 Function StrComp(String1, String2, [Compare As VbCompareMethod = vbBinaryCompare])

Ссылка: Как использовать функцию STRCOMP (VBA)

Sub sortStream(ByRef Streams() As Stream)
    Dim swapped As Boolean, st As Stream
    Dim n As Long
    Do
        swapped = False
        For n = LBound(Streams) + 1 To UBound(Streams)
            If StrComp(Streams(n - 1).StreamName, Streams(n).StreamName, vbTextCompare) = 1 Then
                Set st = Streams(n - 1)
                Set Streams(n - 1) = Streams(n)
                Set Streams(n) = st
                swapped = True
            End If
        Next
    Loop Until Not swapped

End Sub

Я предложил Stream() только потому, что хотел написать Bubble Sort. Я бы использовал SortedList.

SortedList

MSDN SortedList

Представляет коллекцию пар ключ / значение, которые отсортированы по ключам и доступны по ключу и по индексу.

Дополнительный справочник: VBA SortedList

Вам нужно будет внести эти изменения, чтобы использовать SortedList:

До

Dim streamColl As Collection
Set streamColl = New Collection  
streamColl.Add tempStream

После

Dim streamColl As Object
Set streamColl = CreateObject("System.Collections.SortedList")
streamColl.Add Key:=tempStream.StreamName, Value:=tempStream.
...