簡體   English   中英

Excel VBA宏根據單元格值調用多個宏

[英]Excel VBA Macro calling multiple Macros based on cell value

我正在嘗試編寫一個調用不同宏並更改單元格顏色的宏。 因此,如果整個列D(D4:D446)中的單元格等於某個值,則該宏將調用與該值相關聯的單獨宏。

換句話說,我想要的是,例如,如果范圍D7中的任何或多個單元格:D446 =“1000ABC”,“1000EFG”或“1000HIJ”,則列F7:F446中的任何/所有單元格將變為紅色以指示對於用戶,他們需要在F7:F446中單擊該單元格,當用戶單擊F列中的該單元格時,它將調用我已創建的正確宏。

示例:如果單元格D25 =“1000EFG”,則單元格F25將變為紅色,當用戶單擊單元格F25時,它將轉到與值1000EFG關聯的宏。 我已經創建了其他宏,我只需要將它們與此功能綁定在一起。 (這些值是假設的)

我遇到的問題是,無論單元格D中的值如何,當我單擊F列中的關聯單元格時,它將只帶一個宏和一個宏(不是與單元格D中的值關聯的正確宏) )。 我也不確定如何根據值更改單元格顏色的語法。 我似乎無法將這些功能集中在一個宏中。 我將發布我在下面嘗試過的代碼。 非常感謝任何幫助。 你們真棒,謝謝!

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

最后的建議,這種調度到這么多不同的例程的方式是乏味且容易出錯的。 您可能會想到遵循一些命名約定來使被調用的例程與值匹配。 例如,如果您將例程命名為Ref_1000GPRef_1000MM等,則第二個Select Case語句將縮減為單行,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM