Добрый день. Сильно не пинайте, две недели как начал изучать 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). Грубо говоря вместо
Занести Ваш (не совсем) массив в словарь получилось вот так
Код
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
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
альтернативный вариант: удобно для возможности такого обращения воспользоваться Модулем Класса - примеры на 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