Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 17.07.2008, 21:44   #1
ЯИмя
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 15
Восклицание Работа с коллекциями

Проблема следующая.

В ВБА(Эксель) я создал 2 модуля класса.
Одним из свойств первого класса является коллекция, в которую входят объекты второго класса.
Объекты первого класса, в свою очередь, образуют ещё одну (назовём её главной) коллекцию.
Запускаю заполнение главной коллекции.
На её основе мне нужно создать ещё одну коллекцию, которая будет содержать некоторые элементы главной коллекции с изменёнными свойствами.
Так вот.
Когда я меняю свойства у элементов новой коллекции, они меняются и у соответствующих элементов главной коллекции...
Не уверен, что хоть кто-то поймёт эту муть, попробую выложить здесь упрощённый код:

Примерно так:
Модули класса:
Класс Mark

Код:
Public Ord As String 
Public Nam As String 
Public Dias As New Collection

Класс Dia

Код:
Public Size As Single 
Public Mar As Single 
Public PS As Single
Заполнение коллекции:

Код:
Dim Mark1 As New Mark 
Dim Dia1 As New Dia 
Dim Marks As New Collection 
Public Sub Fill() 
With Workbooks("Книга1.xls").Sheets("1") 
    HSh = .Rows.Count 
    LR = .Cells(HSh, 1).End(xlUp).Row 
    NRow = .Cells(1, 1).End(xlDown).Row 
    For i = NRow To LR Step 5 
        Set A = New Mark 
        For j = i To i + 4 
            Dia1.Size = .Cells(j, 5).Value 
            Dia1.Mar = .Cells(j, 6).Value 
            Dia1.PS = .Cells(j, 7).Value 
            Mark1.Dias.Add Item:=Dia 
            Set Dia = Nothing 
        Next j 
        Mark1.Ord = .Cells(i, 1).Value 
        Mark1.Nam = .Cells(i, 2).Value 
        Marks.Add Item:=Mark1 
        Set Mark1 = Nothing 
    Next i 
End With 
End Sub
Создаю новую коллекцию:

Код:
' ... (Dim, Sub) ... 
Dim ThN = New Mark 
Ndd = InputBox1 ... 
Ndd2 = InputBox2 ... 
Ndd3 = InputBox3 ... 
'... 
    For i = 1 To Marks.Count 
        If Ndd = Marks(i).Nam Then 
            Set ThN = Marks(i) 
            j = 1 
            Do Until ThN.Dias.Count = 1 
                If Ndd2 <> ThN.Dias(j).Size Then 
                    ThN.Dias.Remove (j) 
                Else 
                    ThN.Dias(j).Mar = Ndd3 
                    j = j + 1 
                End If 
            Loop 
            ThNs.Add Item:=ThN 
            Set ThN = Nothing 
            Exit For 
        End If 
    Next i
' ...
Так вот. Когда я удаляю элемент Dia из коллекции Dias объекта ThN (ThN.Dias.Remove (j)), автоматически удаляется такой же элемент Dia из коллекции Dias объекта Mark1 (коллекции Marks).
Во как!
Как этого избежать?
ЯИмя вне форума
Старый 18.07.2008, 06:09   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Как-то замудренно. А проще нельзя? Например, создать независимые коллекции, или вообще, через массивы?
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 20.07.2008, 01:23   #3
ЯИмя
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 15
По умолчанию

Ну, может и можно. Что замудрённо - согласен.
Если бы я знал...
А что значит независимые коллекции, эти две коллекции чем друг от друга зависят? Тем, что у них есть по одному одинаковому элементу?
Непонятно. Я же его просто приравнял...
Может быть, можно приравнять как-нибудь не по ссылке, а по значению, я не нашёл, как.
Или заблокировать каким-нибудь образом первую коллекцию от изменений на время удаления элемента из второй коллекции?

Подробнее здесь, в третьем по счёту посте.
ЯИмя вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц