2015-07-26 3 views
-3

Я пытался выделить ячейку в столбце, который был изменен с «a» на «b» (следует исключить изменения из пустого в «a») с помощью макроса. Может кто-нибудь мне помочь?Выделение модифицированной ячейки

Private Sub Worksheet_Change(ByVal Target As Range) 
 
    Application.ScreenUpdating = False 
 
Dim KeyCells As Range 
 
Set KeyCells = Range("A:A") 
 
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then 
 
ActiveCell.Select 
 
Application.Run ("color") 
 
End If 
 
End Sub 
 

 
Sub color() 
 
With Selection.Interior 
 
    .Pattern = xlSolid 
 
    .PatternColorIndex = xlAutomatic 
 
    .color = 255 
 
    .TintAndShade = 0 
 
    .PatternTintAndShade = 0 
 
End With 
 
End Sub

Вышеприведенный код выделяет ячейки под редактируемой ячейки также.

+0

Что вы сделали до сих пор, чтобы попытаться решить это самостоятельно? У вас есть какой-либо код, вы провели какое-либо исследование? Этот вопрос сейчас выглядит так: «Пожалуйста, сделайте это для меня». – CBRF23

+0

1) «Выделите» ячейку вручную во время записи макроса, затем перейдите и проверьте код, который вам нужно выделить. 2) Затем перейдите к листу, особенно в случае «Worksheet_Change», и добавьте этот код с вашими условиями (если значение было а, а теперь равно b и т. Д.). –

+0

См. [Условное форматирование] (https://support.office.com/en-au/article/Use-a-formula-to-apply-conditional-formatting-fed60dfa-1d3f-4e13-9ecb-f1951ff89d7f). – Jeeped

ответ

0

Dim ValBeforeChange As String 
 

 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
 

 
    ValBeforeChange = Target.Value 
 

 
End Sub 
 

 
Private Sub Worksheet_Change(ByVal Target As Range) 
 

 
    Application.ScreenUpdating = False 
 

 
    
 

 
    If ValBeforeChange ="" Then 
 
     Exit Sub 
 
    End If 
 
    IF ValBeforeChange <> Target.Value Then 
 
    
 
    If Application.Intersect(Range("A:A"), Target) Is Nothing Then 
 
    Application.Run("Color")  
 
    End If 
 
    
 
    End If 
 
    
 

 
End Sub

Этот код работает хорошо, ребята, спасибо вам за вашу помощь :)

2

Вы можете использовать событие SelectionChange, чтобы получить значение , прежде чем изменить, а затем добавить свои условия следующим образом.

Обратите внимание, что если рабочая книга открыта ячейкой, выбранной в вашем целевом диапазоне, и вы меняете значение без предварительного изменения, этот код выйдет раньше, так как значение ValBeforeChange еще не установлено.

Вы можете справиться с этим несколькими способами. Вы можете добавить что-то к событию Workbook_Open для запуска процедуры SelectionChangeили, вы можете сделать глобальную переменную ValBeforeChange и установить ее первоначально в событии Workbook_Open, или вы можете реорганизовать код выделения в класс с «до» и «после "свойства, создать экземпляр объекта класса на открытом и очистить его при закрытии.

Вот как добавить проверку условия:

редактировался «а» до «б» (необходимо исключить изменения от заготовки до «а»)

Dim ValBeforeChange as String 

Private Sub Worksheet_SelectionChange(ByVal Target as Range) 
    ValBeforeChange = Target.Value 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.ScreenUpdating = False 
    If Not Len(ValBeforeChange) > 0 Then Exit Sub 
    If Target.Value = ValBeforeChange Then Exit Sub 
    Dim KeyCells As Range 
    Set KeyCells = Range("A:A") 
    If Application.Intersect(KeyCells, Target) Is Nothing Then Exit Sub 
    Highlight Target 
End Sub 

Sub Highlight(ByRef Target as Range) 
    With Target.Interior 
     .Pattern = xlSolid 
     .PatternColorIndex = xlAutomatic 
     .Color = 255 
     .TintAndShade = 0 
     .PatternTintAndShade = 0 
    End With 
End Sub 
+0

Спасибо за код CBRF23.Его выделение ячейки под ячейкой, которая модифицирована. И я привел пример о значениях & b, если значение a & b является числовым или временным значением, достаточно ли, если я сменил строку на целое число в «Dim ValBeforeChange as String» – Linga

+0

Вы можете изменить тип 'ValBeforeChange 'на все, что вам нужно, и соответственно изменить свои условия. Если мой ответ решит ваш вопрос, нажмите маленький флажок рядом с ним. – CBRF23

+0

Извините, что CBRF23 не работает :(. Мое намерение состоит в том, чтобы выделить ячейку в столбце, если предыдущее значение было отредактировано, за исключением того, что пустая ячейка обновлена. – Linga

1

На самом деле, я не хочу добавлять новый ответ. Потому что этот ответ - небольшая модификация ответа CBRF23. Согласно их комментариям, я решил добавить новый ответ, потому что считаю, что этот вопрос не получил правильного ответа.

Что нового в моем ответе. Ничего особенного. Но я отформатировал код и Я добавил проверку на пустое значение и удалю выделение.

Тут вы можете увидеть код другой компании.

Dim ValBeforeChange As String 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    ValBeforeChange = Target.Value 

End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Application.ScreenUpdating = False 

    If Not Len(ValBeforeChange) > 0 Then 
     Exit Sub 
    End If 

    If Target.Value = ValBeforeChange Then 
     Exit Sub 
    End If 

    If Application.Intersect(Range("A:A"), Target) Is Nothing Then 
     Exit Sub 
    End If 

    If Target.Value <> "" Then 
     Highlight Target, vbRed 
    Else 
     Highlight Target, xlNone 
    End If 

End Sub 

Sub Highlight(ByRef Target As Range, ByVal colorValue As Variant) 

    With Target.Interior 
     .Pattern = xlSolid 
     .PatternColorIndex = xlAutomatic 
     .color = colorValue 
     .TintAndShade = 0 
     .PatternTintAndShade = 0 
    End With 

End Sub 
+0

Спасибо, Николас, может объяснить, где и как работает ** Sub Highlight **. Когда я попробовал вышеуказанный код, ничего не подсвечивается. – Linga

+0

Просто измените цвет фона (цвет интерьера) введенного 'Target' на введенный фон' colorValue'. Все это. Я думаю, что вам нужно будет отлаживать код в строке за строкой, чтобы узнать реальную ошибку. Потому что, я протестировал этот код, прежде чем опубликовать его. Это хорошо работает для меня. Это не ошибка. Я думаю, что ошибка должна быть от других. Не от этого. –

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