Excel VBAmacros根据单元格值调用多个macros

我正在尝试编写一个调用不同的macros和更改单元格颜色的macros。 所以,如果整个D(D4:D446)列中的某个单元格等于某个值,则该macros将调用与该值关联的单独的macros。

换句话说,我想要的是,例如,如果D7:D446 =“1000ABC”,“1000EFG”或“1000HIJ”范围内的任何或多个单元格,F7:F446列中的任何/全部单元格将变为红色以指示给用户他们需要在F7:F446中单击该单元格,当用户单击F列中的单元格时,它将调用我已经创build的正确的macros。

例如:如果单元格D25 =“1000EFG”单元格F25将变为红色,并且当用户单击单元格F25时,它将带他到与值1000EFG关联的macros。 我已经创build了其他macros,我只需要将它们与这个function绑定在一起。 (这些值是假设的)

我遇到的问题是无论单元格D中的值是什么,当我单击F列中的关联单元格时,它将使我只有一个macros和一个macros(不是与单元格D中的值关联的正确的macros)。 我也不确定如何根据值更改单元格颜色的语法。 我似乎无法将这些function绑定在一个macros中。 我将发布我在下面尝试的代码。 任何帮助非常感谢。 你们真棒,谢谢!

Sub gotorefs() For Each c In Worksheets("JE").Range("D7:D446") If c.Value = "1000GP" Then Call gotoref1 Worksheets("JE").Range("F7:F446").Select.ActiveCell.Interior.ColorIndex = 3 ElseIf c.Value = "1000MM" Then Call gotoref2 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "19FEST" Then Call gotoref3 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "20IEDU" Then Call gotoref4 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "20ONLC" Then Call gotoref5 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "20PART" Then Call gotoref6 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "20PRDV" Then Call gotoref7 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "20SPPR" Then Call gotoref8 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "22DANC" Then Call gotoref9 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "22LFLC" Then Call gotoref10 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "22MEDA" Then Call gotoref11 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "530CCH" Then Call gotoref12 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "60PUBL" Then Call gotoref13 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "74GA01" Then Call gotoref14 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "74GA17" Then Call gotoref15 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "74GA99" Then Call gotoref16 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 ElseIf c.Value = "78REDV" Then Call gotoref17 Worksheets("JE").Range("F7:F446").Cell.Interior.ColorIndex = 3 End If Next c End sub 

尝试通过处理Worksheet_Change event 。 为此,将其添加到工作表“JE”代码模块中

 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range: Set c = Range("D7:D446") For Each c In c.Cells Select Case c.Value Case "1000GP", "1000MM", "19FEST", "20IEDU", "20ONLC", "20PART", "20PRDV", "20SPPR", "22DANC", "22LFLC", "22MEDA", "530CCH", "60POUBL", "74GA01", "74GA17", "74GA99", "78REDV" Cells(c.row, "F").Interior.ColorIndex = 3 Case Else Cells(c.row, "F").Interior.ColorIndex = 0 End Select Next c End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 6 And Target.Cells.count = 1 And Target.Interior.ColorIndex = 3 Then Cancel = True ' Now call the appropriate routine according to column C Select Case Target.Offset(0, -2).Value2 Case "1000GP": gotoref1 Case "1000MM": gotoref2 Case "19FEST": gotoref3 Case "20PRDV": gotoref4 Case "20IEDU": gotoref5 Case "20ONLC": gotoref6 Case "20PART": gotoref7 Case "20SPPR": gotoref8 Case "22DANC": gotoref9 Case "22LFLC": gotoref10 Case "22MEDA": gotoref11 Case "530CCH": gotoref12 Case "60POUBL": gotoref13 Case "74GA01": gotoref14 Case "74GA17": gotoref15 Case "74GA99": gotoref16 Case "78REDV": gotoref17 End Select End If End Sub 

最后的build议,这种调度到许多不同的例程的方式是乏味和容易出错的。 您可能会想到遵循一些命名约定来使被调用的例程与值匹配。 例如,如果您将例程命名为Ref_1000GPRef_1000MM等,则第二个Select Case语句将会缩减为如下所示的一行:

 CallByName "Ref_" & Target.Offset(0, -3).Value2