Найти индекс цвета из палитры для окрашивания строк при изменении значения VBA

Код:

Public Sub HighLightRows()
    Dim i As Integer
    i = 2
    Dim c As Integer
    c = 2       'Color 1

    'Dim colorIndex As XlColorIndex: colorIndex = Application.Dialogs(xlDialogEditColor).Show(10)
    'MsgBox colorIndex

    Do While (Cells(i, 1) <> "")
        If (Cells(i, 1) <> Cells(i - 1, 1)) Then 'check for different value in cell A (index=1)
            If c = 2 Then
                c = 24   'color 2
            Else
                c = 2   'color 1
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.colorIndex = c
        i = i + 1
    Loop
    End Sub

Этот код отлично работает и меняет цвет при изменении значения в столбце. Но цвета указаны в коде. Я хочу, чтобы пользователь выбирал цвет по своему выбору.

Вывод, который я получаю с приведенным выше кодом:
введите здесь описание изображения

Что я хочу, чтобы код делал:
Откройте цветовая палитра.
Пользователь выбирает цвет.
Индекс цвета передается в переменную.
При изменении значения строки окрашиваются попеременно белым и выбранным цветом.
Например. если пользователь выбирает синий цвет в палитре, строки будут сине-белыми с чередующимися группами. Если пользователь выбирает зеленый цвет из палитры, строки будут зелеными и белыми с чередующимися группами.

Dim colorIndex As XlColorIndex: colorIndex = Application.Dialogs(xlDialogEditColor).Show(10)
MsgBox colorIndex

палитра открывается отлично, но MsgBox colorIndex дает мне -1 в качестве вывода.

Кажется, я не могу заставить это работать. Любые изменения в коде.?


person Aman Devrath    schedule 20.06.2018    source источник


Ответы (1)


Dialogs(xlDialogEditColor) возвращает True = -1, если был выбран цвет, и False = 0, если пользователь нажал кнопку отмены. Чтобы получить выбранный цвет, используйте ActiveWorkbook.Colors(10), как в примере ниже.

Option Explicit

Public Sub ColorPaletteDialogBox()
    Dim lcolor As Long
    If Application.Dialogs(xlDialogEditColor).Show(10) = True Then
      'user pressed OK
      lcolor = ActiveWorkbook.Colors(10)
      ActiveCell.Interior.Color = lcolor
    Else
      'user pressed Cancel
    End If
End Sub

Итак, для вашего цикла вы можете использовать что-то вроде …

Option Explicit

Public Sub HighLightRows()
    Dim c As Integer
    c = 2       'Color 1

    Dim i As Long 'integer is too small for row counting!
    i = 2

    If Application.Dialogs(xlDialogEditColor).Show(10) = True Then
        Do While (Cells(i, 1) <> "")
            If (Cells(i, 1) <> Cells(i - 1, 1)) Then 'check for different value in cell A (index=1)
                If c = 2 Then
                    c = 10   'color 2
                Else
                    c = 2   'color 1
                End If
            End If

            Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.colorIndex = c
            i = i + 1
        Loop
    Else
      'user pressed Cancel
    End If
End Sub
person Pᴇʜ    schedule 20.06.2018
comment
Можете ли вы подсказать мне, как реализовать ваш ответ в моем коде? Я изменил c=24 на c=ActiveWorkbook.Colors(10). Для этого я получаю ошибку переполнения. - person Aman Devrath; 20.06.2018
comment
@AmanDevrath, посмотри мое редактирование. Индекс цвета, в котором находится выбранный цвет, равен 10. Если вы используете Show(10), используйте colorIndex = 10. - person Pᴇʜ; 20.06.2018
comment
Мне просто нужно было изменить 1 строку. Идеальный. Большое спасибо. Однако один вопрос: когда код окрашивает строки, строки столбцов исчезают. возможно ли, что линии не становятся невидимыми? - person Aman Devrath; 20.06.2018
comment
@AmanDevrath нет, линии сетки видны только в том случае, если нет цвета, иначе вам нужно нарисовать свои собственные границы (но это другой вопрос). Если этот ответ решил вашу проблему, отметьте его как решение. - person Pᴇʜ; 20.06.2018
comment
Хорошо. Я в порядке с этим. Спасибо за старания. :) - person Aman Devrath; 20.06.2018