1

У меня есть значения в столбце D листа (Sheet2) в рабочей книге, значения которых получены из формулы, чтобы получить только последнюю часть более длинных значений в ячейках столбца C. Более длинные значения автоматически вводятся в столбец C двойным щелчком мыши. На отдельном листе (Sheet5) у меня есть список значений в столбце C этого листа. Если какое-либо из значений в столбце D в Sheet2 равно любому из значений в столбце C в Sheet5, я хочу, чтобы ячейка в столбце F в Sheet2 стала красной. Как только ячейка столбца F в Sheet2 станет красной, в зависимости от значения в столбце D, я хочу, чтобы ячейка красного цвета стала активируемой, что приведет пользователя к другому листу со ссылочными значениями, связанными со значением в столбце D. Код ниже делает именно это. Однако я хотел бы избежать жесткого кодирования различных значений, для которых требуются ссылочные коды, в ожидании того, что некоторые значения, для которых требуется ссылочный код, будут добавлены или удалены из списка в столбце C Листа 5 в будущем.

   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

Я думал, что лучший способ избежать жесткого кодирования - создать массив. В первой части вы увидите закомментированный фрагмент кода, я пытался это сделать, но я не уверен, как можно вызывать разные макросы, поскольку они связаны с определенными значениями.

Заранее благодарю за любую помощь!

0