Страницы: 1
RSS
Заливка в словаре, Если значение ноль, то заносим в словарь помимо значения еще и заливку.
 
Код
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 (Блин, как сообщение-то само отправить??? Не даёт выйти из кода..)
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Добрый день.
Подскажите, возможно ли делать заливку прямо в процессе создания словаря, при условии, что = min(i, 4) будет равно нулю?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Вот эта конструкция неверна:
Код
.Item(min(i, 8)) = min(i, 4).Interior.ColorIndex = 3
думаю "=3" нужно удалить.
 
А каким тогда .Interior.ColorIndex = ??? красить будет?
Удалил, всё равно ошибку выдаёт.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
А что красить-то? Массив? :)
Конечно можно красить ячейку - но я тут не вижу ячеек.
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

Но в теме не этот случай, т.к. там есть ubound.
Изменено: Hugo - 12.02.2016 10:42:23
 
В цикле-то понятно. А как именно в словаре присвоить ячейке и значение и заливку?
Если значение >0, то только значение записываем - .Item(min(i, 8) = min(i, 4)  
Если значение =0, то значение записываем - .Item(min(i, 8) = min(i, 4) и как-то заливку надо записать.
Находил тему где ты, Игорь, писал о такой возможности.
   
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Извлекайте индекс заливки и помещайте его. Если есть риск спутать с другими значениями - можно писать например так: "0|12345678"
 
Исходной заливки нет. Есть только условие для заливки.
Вот простенький пример, в столбце D, то что Empty хочется закрасить.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Сам по себе массив не может содержать определение для заливки. Свойство 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), то прибавляем единицу для правильной ссылки на ячейку для закраски.
Чтобы не терять время сначала создаем "рваный" диапазон ячеек и только если в нем что-то есть в самом конце его красим.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ОФФ:
Цитата
Владимир написал:Блин, как сообщение-то само отправить??? Не даёт выйти из кода..
Перейдите в режим BB-code и тогда должно получиться.
Изменено: Ivan.kh - 12.02.2016 14:11:48
 
Цитата
Владимир написал:
Находил тему где ты, Игорь, писал о такой возможности
Там написано про возможность хранить что угодно, но надо же понимать, что свойство Interior принадлежит объекту Range. Следовательно хранить надо этот объект, а не свойство. Поэтому напрямую из словаря не получится изменить заливку.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, я так и не понял вот эту конструкцию:
Код
If rr Is Nothing Then
   Set rr = Cells(i + 1, 2)
Else
   Set rr = Union(rr, Cells(i + 1, 2))
End If 
В чём её смысл, идея? Если создание 3 и 4 в Locals я вижу, то где собираются 9 и 10?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Смысл прост:
Если диапазон rr еще пустой, то назначаем ему значение одной ячейки(первой, которую надо залить).
Если диапазон уже содержит ссылки на какие-то ячейки - то объединяем его с новыми ячейками через Union.
Если записывать без проверки(If rr Is Nothing Then), то получим ошибку, т.к. нельзя объединить ссылку на объект с nothing(т.е. ни с чем).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Про помещение объекта в словарь - думаю в данном случае излишне, т.к. можно ведь по индексу массива обратиться к ячейке чтоб её покрасить - если массив логически связан с диапазоном листа.
 
Большое спасибо. Мне понравилось.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Страницы: 1
Наверх