Страницы: 1
RSS
Изменение цвета кнопки на форме, в зависимости от значения ячейки на листе
 
Доброго всем времени суток. Уважаемые форумчане, помогите немного с задачей. Задача такая: есть кнопка, цвет которой меняется в зависимости от значения ячейки на листе. Если кнопка расположена на листе, я знаю как это сделать (кстати благодаря вашему форуму), а если она на форме? Пытался делать через Private Sub UserForm_load, initialize, activate... Но видимо что-то не так прописываю... Скорректируйте пример, если кто-то знает. Заранее спасибо!
 
Да то же самое:
Код
Private Sub Button1_Click()
[a1] = -1
Me.Button.BackColor = vbBlue
End Sub
 
Надо, чтобы в открытой форме при клике , например, на кнопку "0" (Button2), кнопка "кнопка зеленая" (Button) автоматически отслеживала изменение значения ячейки А1 на листе, а также при открытии книги и меняла свой цвет на необходимый. Вот))
 
т.е. Открыл форму -> ввел необходимое значение в ячейку -> кнопка(и) на форме отследили это и изменили свои свойства в зависимости от значения.
 
И в чём проблема? Добавьте проверку:
Код
Private Sub Button1_Click()
    If [A1] > 0 Then
        Me.Button.BackColor = vbRed
    ElseIf [A1] = 0 Then
        Me.Button.BackColor = vbGreen
    Else
        Me.Button.BackColor = vbBlue
    End If
End Sub

Только зачем тогда ТРИ кнопки? Всё можно делать одной.
 
Или красить каждую?
 
Юрий, не совсем понимаете задачу. Надо красить не ту кнопку, которую нажимаешь! Одну нажимаешь - она задает значение ячейке. А вот другая уже в зависимости от этого значения и окрашивается.

Private Sub Button1_Click() -> значение ячейки -> Другаякнопка.BackColor = vb.....
 
Цитата
Гена Рыбалкин пишет:
А вот другая уже в зависимости от этого значения и окрашивается
Другая - это какая?
 
В примере она находится на форме и называется "кнопка зеленая" (Button - в коде)

Должно получиться так, как если бы кнопку CommandButton1 с листа перенесли бы на форму...
Код для CommandButton1 прописан в корне книги:

Private Sub Workbook_Open()
   With ActiveSheet
   If ActiveSheet.Name = "Лист1" Then
       If [a1] = 0 Then
           .CommandButton1.BackColor = vbGreen
           .CommandButton1.Caption = [c1]
       ElseIf [a1] > 0 Then
           .CommandButton1.BackColor = vbRed
           .CommandButton1.Caption = [c1]
       Else
           .CommandButton1.BackColor = vbBlue
           .CommandButton1.Caption = [c1]
       End If
   End If
   End With
End Sub

Private Sub WorkBook_SheetChange(ByVal sh As Object, ByVal Target As Range)
.....

Что поменять, если кнопка оказалась бы в форме?
Изменено: Гена Рыбалкин - 14.01.2013 15:16:03
 
Наверное вот так?

Для того чтобы
Цитата
Гена Рыбалкин пишет:
т.е. Открыл форму -> ввел необходимое значение в ячейку
сделал форму в немодальном режиме
 
Нормально придумали назвать :-)
Так продублируйте проверку во все три кнопки:
Код
Private Sub Button1_Click()
    [A1] = -1
    If [A1] > 0 Then
        Me.Button.BackColor = vbRed
    ElseIf [A1] = 0 Then
        Me.Button.BackColor = vbGreen
    Else
        Me.Button.BackColor = vbBlue
    End If
End Sub

Private Sub Button2_Click()
[A1] = 0
If [A1] > 0 Then
        Me.Button.BackColor = vbRed
    ElseIf [A1] = 0 Then
        Me.Button.BackColor = vbGreen
    Else
        Me.Button.BackColor = vbBlue
    End If
End Sub

Private Sub Button3_Click()
[A1] = 1
If [A1] > 0 Then
        Me.Button.BackColor = vbRed
    ElseIf [A1] = 0 Then
        Me.Button.BackColor = vbGreen
    Else
        Me.Button.BackColor = vbBlue
    End If
End Sub

Или оформите отдельной процедурой и вызывайте её...
 
А раз Вы явно кнопками задаёте значения, то и проверка не нужна: одновременно со значением ячейке, присваивайте нужный цвет кнопке.
 
Все отлично работает, огромное спасибо Юрий)
Посмотрел сейчас, видимо первоначальный ваш код:
Код
Private Sub Button1_Click()
    If [A1] > 0 Then
        Me.Button.BackColor = vbRed
    ElseIf [A1] = 0 Then
        Me.Button.BackColor = vbGreen
    Else
        Me.Button.BackColor = vbBlue
    End If
End Sub

был верен... Я так понимаю, "Ме." перед кнопкой делает ее активной)
В любом случае огромное спасибо))
 
Ме перед кнопкой не делает её активной - это признак принадлежности к родительскому объекту (форме).
Попробуйте такой вариант: в кодах трёх кнопок оставьте только присвоение значений ячейке А1, а в модуль листа скопируйте такой код:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        With UserForm
            If Target > 0 Then
        .Button.BackColor = vbRed
    ElseIf Target = 0 Then
        .Button.BackColor = vbGreen
    Else
        .Button.BackColor = vbBlue
    End If
        End With
    End If
End Sub

И я бы вызов формы перенёс из модуля листа в стандартный модуль.
Страницы: 1
Читают тему
Наверх