Eu tenho valores na coluna D de uma planilha (Planilha2) em uma pasta de trabalho, cujos valores são derivados de uma fórmula para obter apenas a parte final de valores mais longos nas células da coluna C. Os valores mais longos são inseridos automaticamente na coluna C através de um clique duplo. Em uma folha separada (Folha5), tenho uma lista de valores na coluna C dessa folha. Se qualquer um dos valores na coluna D da Planilha2 for igual a qualquer um dos valores na coluna C da Planilha5, eu quero que a célula na coluna F da Planilha2 fique vermelha. Depois que a célula da coluna F na Planilha2 estiver vermelha, dependendo do valor na coluna D, eu quero que a célula vermelha fique clicável, o que levará o usuário a uma lista diferente listando valores de referência associados ao valor na coluna D. O código abaixo faz exatamente isso. No entanto, gostaria de evitar codificar os diferentes valores que precisam de códigos de referência antecipadamente para que alguns dos valores que requerem um código de referência sejam incluídos ou retirados da lista na coluna C da Planilha5 no futuro.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range: Set c = Union(Range("D7:D446"), Range("F7:F446"))
Dim CellF As Range, CellD As Range, Cell As Range
If Not Application.Intersect(c, Range(Target.Address)) Is Nothing Then
Set CellF = Range("F" & Target.Row)
Set CellD = Range("D" & Target.Row)
If CellF.Value <> "" And getMacroDictionary.Exists(CellD.Text) Then
CellF.Interior.ColorIndex = 3
Else
CellF.Interior.ColorIndex = 0
End If
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim key As String, dic As Object
Set sourceRange = Nothing
If Target.Column = 6 And Target.Cells.Count = 1 And Target.Interior.ColorIndex = 3 Then
Set sourceRange = Target
Set dic = getMacroDictionary
key = Target.Offset(0, -2).Value2
If dic.Exists(key) Then Application.Run dic(key)
End If
End Sub
Function getMacroDictionary() As Object
Dim dic As Object
Set dic = CreateObject("SCripting.Dictionary")
dic.Add "1000GP", "gotoref1"
dic.Add "1000MM", "gotoref2"
dic.Add "19FEST", "gotoref3"
dic.Add "20IEDU", "gotoref4"
dic.Add "20ONLC", "gotoref5"
dic.Add "20PART", "gotoref6"
dic.Add "20PRDV", "gotoref7"
dic.Add "20SPPR", "gotoref8"
dic.Add "22DANC", "gotoref9"
dic.Add "22LFLC", "gotoref10"
dic.Add "22MEDA", "gotoref11"
dic.Add "530CCH", "gotoref12"
dic.Add "60PUBL", "gotoref13"
dic.Add "74GA01", "gotoref14"
dic.Add "74GA17", "gotoref15"
dic.Add "74GA99", "gotoref16"
dic.Add "78REDV", "gotoref17"
Set getMacroDictionary = dic
End Function
Achei que a melhor maneira de evitar a codificação rígida era criar uma matriz. No primeiro sub você verá o código snip-its comentado, tentei fazer isso, mas não tenho certeza de como posso chamar as diferentes macros, pois elas estão associadas a determinados valores.
Agradecemos antecipadamente por qualquer ajuda!
Tags microsoft-excel vba