Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / добавление объекта класа в коллекцию / 9 сообщений из 9, страница 1 из 1
10.12.2012, 14:31
    #38072509
NecroArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
Пишу макрос для Excel 2010. На текущем этапе макрос должен считывать определённые строки из одного листа, затем добавить их в новую книгу. Считываемая строка представляет собой заказ с характеристиками Name, Code и Amount. Поэтому создал класса Order и пытаюсь добавлять его в коллекцию.
Сам класс:
Код: vbnet
1.
2.
3.
Public Name As String
Public code As Integer
Public amount As Integer


И код из процедуры, который должен считывать определённые строки:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim cell As Range, sFileName As String, Orders As New Collection
    
Dim rowCount As Long
rowCount = ActiveSheet.Rows.Count

Dim j As Long
Dim orderValue As Integer, codeValue As Integer, sheet As Worksheet, currentOrder As Order
    For j = 5 To rowCount
        orderValue = ActiveSheet.Cells(j, 5).Value
        If orderValue <> 0 Then
            Set currentOrder = New Order
            With currentOrder
                .amount = orderValue
                .code = ActiveSheet.Cells(j, 1).Value
                .Name = ActiveSheet.Cells(j, 2).Value
            End With
            Orders.Add (currendOrder)
        End If
    Next j


Если смотреть в дебагере, то после добавления в коллекцию в ней появляется одна Item со значением Empty типа Variant/Empty.
Думаю, в коллекцию добавляется какой-то пустой элемент.
И так же при попытке записи этой коллекции в новую книгу вылетает ошибка "Object required" на строке оператора For Each:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    Dim NewBook As Workbook
    Set NewBook = Workbooks.Add
    With NewBook
        .Title = "All Sales"
        .Subject = "Sales"
        sFileName = Application.GetSaveAsFilename & ".xls"
        
        Dim addingOrder As Order
        j = 1
        For Each addingOrder In Orders
            ActiveSheet.Range(j, 1).Value = Orders.Item(j).code
            ActiveSheet.Range(j, 2).Value = Orders.Item(j).Name
            ActiveSheet.Range(j, 3).Value = Orders.Item(j).amount
            j = j + 1
        Next addingOrder
        
        If sFileName = "False.xls" Then Exit Sub
        .SaveAs Filename:=sFileName
    End With


Подскажите пожалуйста, как правильно будет выглядеть код, или даже как лучше сделать эту задачу, если моё решение гораздо хуже вашей идеи.
...
Рейтинг: 0 / 0
10.12.2012, 14:42
    #38072529
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
NecroArtДумаю, в коллекцию добавляется какой-то пустой элемент.
NecroArt
Код: vbnet
1.
Orders.Add (currendOrder)

скобки надо убрать - скорее всего дело в этом
...
Рейтинг: 0 / 0
10.12.2012, 16:29
    #38072785
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
NecroArt
Код: vbnet
1.
For Each addingOrder In Orders


addingOrder - это и будет ссылкой на текущий элемент в коллекции Orders. В цикле ссылка будет меняться, не надо j = j + 1 никаких...
...
Рейтинг: 0 / 0
10.12.2012, 18:18
    #38073039
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
А что за тип такой - Order? где его дефиниция? или это пользовательский тип, структура которого написана выше и гордо обозвана классом?
...
Рейтинг: 0 / 0
10.12.2012, 18:51
    #38073092
NecroArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
VSVLADNecroArt
Код: vbnet
1.
For Each addingOrder In Orders


addingOrder - это и будет ссылкой на текущий элемент в коллекции Orders. В цикле ссылка будет меняться, не надо j = j + 1 никаких...

Да, пробовал делать так с самого начала, а когда не получилось, то уже брал явным образом Item. В общем, ошибка та же самая и в таком случае:
Код: vbnet
1.
2.
3.
4.
5.
6.
For Each addingOrder In Orders
            ActiveSheet.Range(j, 1).Value = addingOrder.code
            ActiveSheet.Range(j, 2).Value = addingOrder.Name
            ActiveSheet.Range(j, 3).Value = addingOrder.amount
            j = j + 1
        Next addingOrder



AkinaА что за тип такой - Order? где его дефиниция? или это пользовательский тип, структура которого написана выше и гордо обозвана классом?

Этот класс описан в модуле класса:
Код: vbnet
1.
2.
3.
Public Name As String
Public code As Integer
Public amount As Integer
...
Рейтинг: 0 / 0
10.12.2012, 18:53
    #38073095
NecroArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
Shocker.ProNecroArtДумаю, в коллекцию добавляется какой-то пустой элемент.
NecroArt
Код: vbnet
1.
Orders.Add (currendOrder)

скобки надо убрать - скорее всего дело в этом

К сожалению, без скобок тоже не работает. Как я где-то читал, без скобок и со скобками смысл для компилятор одинаков.
...
Рейтинг: 0 / 0
10.12.2012, 18:59
    #38073108
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
NecroArtК сожалению, без скобок тоже не работает. Как я где-то читал, без скобок и со скобками смысл для компилятор одинаков.плохо читали или неправильно поняли.... эх придется все же взять в руки эксель и посмотреть, где косяк
...
Рейтинг: 0 / 0
10.12.2012, 19:05
    #38073122
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
Нашел ошибку.
Решение тут
...
Рейтинг: 0 / 0
10.12.2012, 19:22
    #38073137
NecroArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
добавление объекта класа в коллекцию
Shocker.ProНашел ошибку.
Решение тут

Нет, ну это просто жесть ) Так ошибитсья ) Большое спасибо, мысленно жму вам руку :)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / добавление объекта класа в коллекцию / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]