Проблемы с установкой объекта в VBA

Возможно, этот вопрос прост, но я не мог найти ответ, гугля.

Итак, у меня есть мой класс WSheet. Инициализирую массив объектов этого класса в своей программе:

    ReDim WSheets(twb.Sheets.Count)
For i = 0 To UBound(WSheets)
    Set WSheets(i) = New WSheet
Next i

Затем я пытаюсь прочитать новые значения и отсортировать их путем вставки сортировки:

For i = twb.Sheets.Count To 2 Step -1
    flag = False
    tsName = twb.Sheets(i).Name
    twb.Sheets(i).Delete
    twb.Save
    CurShW = curLen - FileLen(TempFName)
    curLen = FileLen(TempFName)
    For j = UBound(WSheets) To 2 Step -1
        If WSheets(j - 1).Weight < CurShW Then
            Set WSheets(j) = WSheets(j - 1)
        Else
            WSheets(j).SetName (tsName)
            WSheets(j).SetWeight (CurShW)
            flag = True
            Exit For
        End If
    Next j
    If Not flag Then 
        Set WSheets(1) = New WSheet
        WSheets(1).SetName (tsName)
        WSheets(1).SetWeight (CurShW)
        flag = False
    End If
Next i

Итак, проблема: после того, как я установил WSheets(j) = WSheets(j — 1), wsheets(j — 1) начинает содержать ссылку на wsheets(j), Поэтому, когда я изменяю wsheets(j), Wsheets (j — 1) тоже меняется.

Расскажите, пожалуйста, как сделать абсолютное уравнение в этой выборке?

Спасибо!

Код PS в классе WSheet

Dim SName As String 'Name of sheet
Dim SWeight As Long 'Weight of sheet in bytes
Dim blocks() As Long 'Weights of blocks in sheet in bytes

Public Function Weight() As Long
    Weight = SWeight
End Function

Public Sub SetWeight(ByVal sw As Long)
    SWeight = sw
End Sub

Public Function Name() As String
    Name = SName
End Function

Public Sub SetName(ByVal nm As String)
    SName = nm
End Sub

1 ответ

  1. отредактировано, чтобы превратить функцию в Classметод

    Необходимо клонировать WSheetобъект, а не ссылаться на него

    Например, можно добавить Clone()метод в WSheetкласс

    Function Clone() As WSheet
        Dim newWSheet As WSheet
    
        Set newWSheet = New WSheet
        newWSheet.SetName SName
        newWSheet.SetWeight SWeight
        Set Clone = newWSheet
    End Function
    

    Затем в главном коде изменить:

    Set WSheets(j) = WSheets(j - 1)
    

    Для:

    Set WSheets(j) = WSheets(j - 1).Clone