With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(min)
.Item(min(i, 8)) = min(i, 4)
If min(i, 4) = 0 Then .Item(min(i, 8)) = min(i, 4).Interior.ColorIndex = 3
Next
For i = 1 To UBound(ZkPk)
.Item(ZkPk(i, 4)) = CStr(Mid(ZkPk(i, 1), 22, 3))
Next
For i = 1 To UBound(isk)
If .exists(isk(i, 1)) Then
isk(i, 1) = .Item(isk(i, 1))
Else
isk(i, 1) = Empty
End If
Next
End With
Изменено: Владимир - 12.02.2016 09:39:25(Блин, как сообщение-то само отправить??? Не даёт выйти из кода..)
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
А что красить-то? Массив? Конечно можно красить ячейку - но я тут не вижу ячеек. P.S. Да, с "= 3" я ступил второпях... Хотя теоретически возможно... Например
Код
Sub tt()
Dim i&, min As Range
Set min = [a1:d10]
For i = 1 To 10
min(i, 4).Interior.ColorIndex = 3
Next
End Sub
В цикле-то понятно. А как именно в словаре присвоить ячейке и значение и заливку? Если значение >0, то только значение записываем - .Item(min(i, 8) = min(i, 4) Если значение =0, то значение записываем - .Item(min(i, 8) = min(i, 4) и как-то заливку надо записать. Находил тему где ты, Игорь, писал о такой возможности.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Сам по себе массив не может содержать определение для заливки. Свойство Interior есть у диапазона. Поэтому я лично вижу только такой путь:
Код
Sub arrtwo()
Dim a(), b(), c(), i&
Range("D2:D100").ClearContents
c = [b2].CurrentRegion.Value
a = [h2].CurrentRegion.Value
b = [l2].CurrentRegion.Value
Dim rr As Range
With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(a)
.Item(a(i, 1)) = a(i, 2)
Next
For i = 1 To UBound(b)
.Item(b(i, 1)) = b(i, 2)
Next
For i = 1 To UBound(c)
If .exists(c(i, 1)) Then
c(i, 1) = .Item(c(i, 1))
Else
c(i, 1) = Empty
If rr Is Nothing Then
Set rr = Cells(i + 1, 2)
Else
Set rr = Union(rr, Cells(i + 1, 2))
End If
'c(i, 1).Interior.ColorIndex = 8
End If
Next
If Not rr Is Nothing Then rr.Interior.ColorIndex = 8
[d2].Resize(UBound(c)) = c()
End With
по идее он самый оптимальный. Особое внимание на Cells(i + 1, 2). Здесь i - это переменная цикла для массива. Т.к. массив у нас начинался со второй строки(c = [b2].CurrentRegion.Value), то прибавляем единицу для правильной ссылки на ячейку для закраски. Чтобы не терять время сначала создаем "рваный" диапазон ячеек и только если в нем что-то есть в самом конце его красим.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Владимир написал: Находил тему где ты, Игорь, писал о такой возможности
Там написано про возможность хранить что угодно, но надо же понимать, что свойство Interior принадлежит объекту Range. Следовательно хранить надо этот объект, а не свойство. Поэтому напрямую из словаря не получится изменить заливку.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Смысл прост: Если диапазон rr еще пустой, то назначаем ему значение одной ячейки(первой, которую надо залить). Если диапазон уже содержит ссылки на какие-то ячейки - то объединяем его с новыми ячейками через Union. Если записывать без проверки(If rr Is Nothing Then), то получим ошибку, т.к. нельзя объединить ссылку на объект с nothing(т.е. ни с чем).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Про помещение объекта в словарь - думаю в данном случае излишне, т.к. можно ведь по индексу массива обратиться к ячейке чтоб её покрасить - если массив логически связан с диапазоном листа.