Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Работа с коллекциями Добавлено: 17.07.08 21:24  

Автор вопроса:  Jktu | ICQ: 381648295 
Проблема следующая.

В ВБА(Эксель) я создал 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).
Во как!
Как этого избежать?

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #1 Добавлено: 18.07.08 16:12
Лучше скажите, чего вы хотите добиться - может и не нужно изобретать велосипед с коллекциями и классами

Ответить

Номер ответа: 2
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #2 Добавлено: 20.07.08 00:59
Может и не нужно...
А вот чего я хочу добиться:

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

Может быть есть и более простой способ, не знаю, подскажите!

Всё бы ничего, можно было бы и на калькуляторе посчитать, да всё дело в том, что марок порядка 70 шт., тех самых видов (размеров) у каждой марки по 2 - 5 шт., а материалов (или элементов, как Вам будет угодно) тоже около 70! Причём из них в каждом размере присутствуют около 30 - 35, в каждой марке разные.

Сидит со мной в кабинете девушка, весь месяц только этим и занимается, что считает эту всю муть. Очень мне её жалко... Она уже даже формулы в Экселе составлять научилась сама! Только этими формулами ещё больше всё запутала. Представьте себе лист Экселя 2003 на 400 строк в высоту и на всю ширину заполненный формулами, нормами расхода и подобной лажей. Этот лист весит 3 метра и там сам чёрт ногу сломит.

Надеюсь, понятно объяснил...

Ответить

Номер ответа: 3
Автор ответа:
 Andrew_nik



Вопросов: 15
Ответов: 30
 Профиль | | #3 Добавлено: 21.07.08 17:50
Я понимаю ты хочешь создать базу данных? А в Access не пробовал все это реализовать?

В Аксе можно создать справочники продукции с указанием всех возможных ее марок и потом в интерактивных формах добалять удалять марки, наименование и пр.

В общем Access как раз создан для этого.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам