Страницы: 1
RSS
Добавить массив в словарь
 
Добрый день. Сильно не пинайте, две недели как начал изучать vba.

Пытаюсь разобраться со словарём, что то не доходит.
Ниже код рабочий.
Код
Type Tovari
    id As Long
    Адрес As String
    Опт As Double
    Розница As Double
End Type

Public Sub словарь()
Dim Tovar() As Tovari

kol_tov_ish = ish_dan.Cells(Rows.Count, 1).End(xlUp).Row ' количество товаров на листе исходные данные
ReDim Tovar(1 To kol_tov_ish - 2)
Dim slov: Set slov = CreateObject("Scripting.Dictionary")  ' Создаем словарь

For i = 1 To (kol_tov_ish - 2)
    Tovar(i).id = ish_dan.Cells(i + 2, 1)
    Tovar(i).Адрес = ish_dan.Cells(i + 2, 8)
    Tovar(i).Опт = ish_dan.Cells(i + 2, 7)
    Tovar(i).Розница = ish_dan.Cells(i + 2, 6)

    slov.Add Item:=Tovar(i).Адрес, Key:=Tovar(i).id ' Добавляем массив товаров в словарь
Next

'---------------------------------- вывод на лист импорта
kol_tov_imp = import.Cells(Rows.Count, 1).End(xlUp).Row ' количество товаров на листе импорт

For i = 1 To (kol_tov_imp)
    import.Cells(i, 2) = slov.Item(import.Cells(i, 1).Value)
Next i

End Sub
Добавить ключ и какой то столбец у меня получается.
А хотелось бы добавить ключ и элемент массива в виде пользовательской переменной  Tovar(i).    Грубо говоря вместо  
Код
Tovar(i).Адрес            Tovar(i)

Ну и как то с учётом изменений вывести это
Код
import.Cells(i, 2) = slov.Item(import.Cells(i, 1).Value)

Как это сделать. Заранее спасибо.
Изменено: anatolij1984 - 03.11.2016 17:25:07
 
Про Словарь . Типы элементов
Там и про добавление массива есть
Согласие есть продукт при полном непротивлении сторон
 
Кроме как
Код
    .Add .Count, Array(11, 22, 33) ' добавляем элемент типа массив
Ничего нет !
 
Компилятор ругается матом  
Код
Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions
 
Цитата
anatolij1984 написал: ругается
Наверное потому, что у Вас нет массива Tovar(i)
Согласие есть продукт при полном непротивлении сторон
 
Извиняюсь. Неправильно выразился.   Не массив, а элемент массива в виде пользовательской переменной.   Как то так

Выше поправил.
Изменено: anatolij1984 - 03.11.2016 17:59:44
 
Занести Ваш (не совсем) массив в словарь получилось вот так
Код
Type Tovari
    id As Long
    Адрес As String
    Опт As Double
    Розница As Double
End Type
Dim Tovar(1 To 4, 1 To 20)
Public Sub словарь()
For i = 1 To 20
    Tovar(1, i) = ish_dan.Cells(i + 2, 1)
    Tovar(2, i) = ish_dan.Cells(i + 2, 8)
    Tovar(3, i) = ish_dan.Cells(i + 2, 7)
    Tovar(4, i) = ish_dan.Cells(i + 2, 6)
Next
Set slovar = CreateObject("Scripting.Dictionary")
With slovar
    .Add .Count, Tovar
End With
'---------------------------------- вывод на лист импорта
............
А что Вы хотите вывести на лист импорта я не понял


 
Согласие есть продукт при полном непротивлении сторон
 
anatolij1984, тип Variant не дружит с пользовательским типом. Ни в словарь, ни в коллекцию, ни в переменную типа Variant нельзя поместить элемент массива пользовательского типа.
В данном случае это и не нужно: информация была бы продублирована. Достаточно поместить в словарь индекс массива:
Код
slov.Add Item:=i, Key:=Tovar(i).id
Потом slov(x) вернет индекс массива, соответствующий ID=x, а по нему из массива можно получить все остальные данные.
 
Решил упростить но от этого не легче.  Запихал каждую строку товара в массив.


Код
Public Sub словарь()
kol_tov_ish = ish_dan.Cells(Rows.Count, 1).End(xlUp).Row ' количество товаров на листе исходные данные

ReDim Tovar(1 To kol_tov_ish - 2)

Dim slov: Set slov = CreateObject("Scripting.Dictionary")  ' Создаем словарь
Dim asdf(1 To 27)
For i = 1 To (kol_tov_ish - 2)

id = ish_dan.Cells(i + 2, 1)
    For j = 1 To 27
      asdf(j) = ish_dan.Cells(i + 2, j + 1)
    Next
slov.Add Item:=asdf, Key:=id ' Добавляем массив товаров в словарь

Next

'---------------------------------- вывод на лист импорта

kol_tov_imp = import.Cells(Rows.Count, 1).End(xlUp).Row ' количество товаров на листе импорт

For i = 1 To (kol_tov_imp)
    import.Cells(i, 2) = slov.Item(import.Cells(i, 1).Value)
Next i

End Sub

В данный момент эта
Код
import.Cells(i, 2) = slov.Item(import.Cells(i, 1).Value)
строка выводит первый элемент массива.(производитель)

Как вывести к примеру 2 элемент ? В таблице это будет категория.
 
Для справки.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Казанский написал:
Потом slov(x) вернет индекс массива, соответствующий ID=x, а по нему из массива можно получить все остальные данные.
Идею понял. Спасибо.
 
Может кому пригодится
Код
Type Tovari
    id As Long
    Адрес As String
    Опт As Double
    Розница As Double
End Type

Public Sub словарь()
Dim Tovar() As Tovari
kol_tov_ish = ish_dan.Cells(Rows.Count, 1).End(xlUp).Row ' количество товаров на листе исходные данные
ReDim Tovar(1 To kol_tov_ish - 2)

Dim slov: Set slov = CreateObject("Scripting.Dictionary")  ' Создаем словарь

For i = 1 To (kol_tov_ish - 2)
    Tovar(i).id = ish_dan.Cells(i + 2, 1)
    Tovar(i).Адрес = ish_dan.Cells(i + 2, 8)
    Tovar(i).Опт = ish_dan.Cells(i + 2, 7)
    Tovar(i).Розница = ish_dan.Cells(i + 2, 6)
     
    slov.Add Item:=i, Key:=Tovar(i).id ' Добавляем массив товаров в словарь
Next

'---------------------------------- вывод на лист импорта
kol_tov_imp = import.Cells(Rows.Count, 1).End(xlUp).Row ' количество товаров на листе импорт

For i = 1 To (kol_tov_imp)
    import.Cells(i, 2) = Tovar(slov.Item(import.Cells(i, 1).Value)).Адрес
    import.Cells(i, 3) = Tovar(slov.Item(import.Cells(i, 1).Value)).Опт
    import.Cells(i, 4) = Tovar(slov.Item(import.Cells(i, 1).Value)).Розница
Next i
End Sub
Файл приложил
Изменено: anatolij1984 - 03.11.2016 18:16:13
 
Цитата
anatolij1984 написал:     Tovar(i).id = ish_dan.Cells(i + 2, 1)    Tovar(i).Адрес = ish_dan.Cells(i + 2,
альтернативный вариант:
удобно для возможности такого обращения воспользоваться Модулем Класса - примеры на cpearson
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Так быстрее. И букв меньше.
Код
Option Explicit

Sub tt()
    Dim a, b, i&, x&

    With ish_dan.[a1].CurrentRegion
        a = .Columns(1).Value
        b = .Columns(6).Resize(, 3).Value
    End With

    With CreateObject("scripting.dictionary"): .comparemode = 1
        For i = 2 To UBound(a): .Item(a(i, 1)) = i: Next

        a = import.[a1].CurrentRegion.Columns(1).Value
        ReDim c(1 To UBound(a), 1 To 3)

        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then
                x = .Item(a(i, 1))
                c(i, 1) = b(x, 3)
                c(i, 2) = b(x, 2)
                c(i, 3) = b(x, 1)
            End If
        Next

    End With

    import.[b1].Resize(UBound(c), 3) = c
End Sub
Страницы: 1
Читают тему
Наверх