2015-03-19 3 views
0

Я ищу для редактирования своего текущего кода, поскольку он очень длинный, но при необходимости я могу придерживаться его. Мой текущий код просто повторяется на каждой кнопке, когда он запускается через кнопки ActiveX (эти кнопки должны оставаться). Отмена действия предпочтительнее, но изменение цвета с использованием RGB является жизнеспособным вариантом.Кнопки, которые меняют цвет диапазона и DblClick, чтобы вернуть изменения

Мой кодирования заключается в следующем:

Private Sub btn3_Click() 
    Sheet1.Range("A84:J84").Interior.ColorIndex = 16 
End Sub 

Это изменяет диапазон ячеек в сером цвете успешно, теперь мне нужно двойной щелчок, чтобы отменить действие или что-то, что изменит цвет обратно к первоначальному цвету ; Я сделал две попытки.

Использование функции отмены.

Private Sub btn3_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
     Application.EnableEvents = False 
     Application.Undo 
     Application.EnableEvents = True 
End Sub 

Тогда я попробовал другой метод и пошел, чтобы изменить цвет.

Private Sub btn3_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    Dim color_index As Long 
     color_index = 10 
     Sheet1.Range("A84:J84").Interior.Color(color_index) = RGB(153, 153, 255) 
End Sub 

Конечный результат был неудачным в обеих попытках.

Ни один из них не работал и не хотел бы «работать» или исправлять мои ошибки, любые принятые идеи, но я должен держать кнопки, которые я не могу использовать «Выбор ячейки».

EDIT Если возможно есть мой быть метод массив полезной, я не очень хорошо с помощью элементов управления ActiveX так что любой совет, скорее всего, будет очень полезно.

Моя книга объясняет, что представляет собой btn3. http://i.stack.imgur.com/35p2f.png

+0

Что вы пытаетесь сделать с помощью ' color_index' во второй попытке? Либо вы трудно назначаете значение «RGB», либо присваиваете индекс. Что вы хотите сделать? –

+0

Извините, потому что вы видите мои попытки бороться с тем, что проблема сливается в одну, теперь я ее отредактирую. Также я хотел бы твердо назначить значение RGB, которое, как я считаю, будет работать; если кнопка отмены сложна, но может быть выполнена, я бы очень хотел это сделать. :) –

+0

Nevermind, я только что посмотрел и понял, насколько глупо я решаюсь. –

ответ

1

Существует нет простого способа сделать Application.Undo, чтобы отменить результаты макро-операции. Вам необходимо создать кэш/копию данных и вернуться к этому, или вам нужно сформулировать способ «отменить» в пользовательской функции.

В любом случае, ошибка в вашем втором методе эта строка:

Sheet1.Range("A84:J84").Interior.Color(color_index) = RGB(153, 153, 255) 

Может eeither быть изменен на:

Sheet1.Range("A84:J84").Interior.ColorIndex = color_index 

Или:

Sheet1.Range("A84:J84").Interior.Color = RGB(153, 153, 153) 

Кроме того, вы может выполнять пользовательскую функцию отмены, что-то вроде этого:

'## Module level variable 
Dim previousColor As Long 

Sub btn3_Click() 
    '## stores the current ColorIndex property of the range 
    ' (assumes all cells have the same color) 
    previousColor = Sheet1.Range("A84:J84").Interior.ColorIndex 

    '## Applies the new color: 
    Sheet1.Range("A84:J84").Interior.ColorIndex = 16 

End Sub 

Sub btn3_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    Sheet1.Range("A84:J84").Interior.ColorIndex = previousColor 
End Sub 

Далее вы запрашиваете:

, как я обновил есть способ сделать это в массовом масштабе, как у меня есть «кнопки» 60+ ...

Да. Сначала убедитесь, что все кнопки вызывают одни и те же процедуры. Затем измените процедуры для каждой кнопки, как показано ниже.ПРИМЕЧАНИЕ Я не могу получить двойной щелчок, чтобы работать, не вызывая при этом событие с одним щелчком, во-первых, что имеет нежелательный эффект от невозможности «сохранить» предыдущий цвет для диапазона. Вы можете добавить некоторую условную логику, на данный момент я жестко закодированы, поэтому функция «отменить» возвращается к нет цвета на всех:

Dim previousColor As Long ' 

Private Sub CommandButton1_Click() 
    Debug.Print "click" 
    Call changeColor(CommandButton1) 
End Sub 

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    Debug.Print "dbl click" 
    Call undoChangeColor(CommandButton1) 
End Sub 

Private Sub CommandButton2_Click() 
    Debug.Print "click" 
    Call changeColor(CommandButton2) 
End Sub 

Private Sub CommandButton2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    Debug.Print "dbl click" 
    Call undoChangeColor(CommandButton2) 
End Sub 

Private Sub changeColor(btn As MSForms.CommandButton) 
    'Assumes all cells are same color initially 
    previousColor = -4142 '(none) 'Sheet1.Range("A84:J84").Interior.ColorIndex 

    'Get the row corresponding with each button: 
    Dim rng As Range 
    Set rng = Sheet1.Range("A" & btn.TopLeftCell.Row).Resize(1, 11) 

    rng.Interior.ColorIndex = 16 'Modify as needed 
                  'you could assign the RGB() here 

End Sub 


Private Sub undoChangeColor(btn As MSForms.CommandButton) 

    'Get the row corresponding with each button: 
    Dim rng As Range 
    Set rng = Sheet1.Range("A" & btn.TopLeftCell.Row).Resize(1, 11) 

    rng.Interior.ColorIndex = previousColor 
End Sub 
+0

Спасибо, Дэвид, я изменил его на «Sheet1.Range (« A84: J84 »). Interior.Color = RGB (153, 153, 255)« –

+0

Перед тем как закончить здесь, я могу спросить мнение о том, как вы можете изменить, как я сделайте это все вместе ... –

+0

См. дополнение к моему ответу, пересмотренный :) –

Смежные вопросы