VBA usando uma matriz para evitar valores de codificação rígidos para chamar diferentes macros

1

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!

    
por anve 06.07.2017 / 23:43

0 respostas