【问题标题】:Excel VBA-- Creating macro to change cell color and call other macros based on cell valueExcel VBA - 创建宏以更改单元格颜色并根据单元格值调用其他宏
【发布时间】:2017-11-06 16:51:38
【问题描述】:

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

换句话说,我想要的是,例如,如果范围内的任何或多个单元格 (D7:D446) = "1000ABC"、"1000EFG" 或 "1000HIJ" 列 F7:F446 中的任何/所有单元格将变为红色以向用户指示他们需要单击 F7:F446 中的该单元格,当用户单击 F 列中的该单元格时,它将调用正确的我已经创建了宏。

示例:如果单元格 D25="1000EFG" 单元格 F25 将变为红色,并且当用户将光标移到单元格 F25 上并单击单元格 F25 时,它会将他们带到与值 1000EFG 关联的宏。我已经创建了与这些特定值关联的其他宏,我只需要 F 列中的单元格更改颜色并变为用户可点击的,当点击时,调用某个宏。 我将在下面发布我尝试过的代码。很感谢任何形式的帮助。你们太棒了,谢谢!

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim c As Range
  c = Range("D7:D446")
  For Each c In Intersect(ActiveCell, Range("D7:D446")) 'this is where the error is occuring
    Select Case c.Value
     Case "1000GP", "1000MM", "19FEST", "20IEDU", "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, -3).Value2
        Case "1000GP": gotoref1
        Case "1000MM": gotoref2
        Case "19FEST": gotoref3
        Case "20IEDU": gotoref4
        Case "20ONLC": gotoref5
        Case "20PART": gotoref6
        Case "20PRDV": gotoref7
        Case "20SPPR": gotoref8
        Case "22DANC": gotoref9
        Case "22LFLC": gotoref10
        Case "22MEDA": gotoref11
        Case "530CCH": gotoref12
        Case "60PUBL": gotoref13
        Case "74GA01": gotoref14
        Case "74GA17": gotoref15
        Case "74GA99": gotoref16
        Case "78REDV": gotoref17
      End Select
  End If
End Sub

【问题讨论】:

  • 在将对象“c”标注为 Range(...) 后,应使用关键字 SET。使下一行 SET c = Range("D7:D446")
  • 另外,我认为你的循环很奇怪。您可能想要使用 Target 而不是 ActiveCell。通常,用户更改了一个单元格,因此这些单元格将是相同的,因此无论哪种方式,您都会获得相同的行为。但是可能会发生单元格的值被其他方式更改的情况,然后引发事件的单元格将不是活动单元格。
  • 我打算建议您删除c = Range("D7:D446"),因为它只会产生错误,并且您正在重置 c 的值还是下一行。
  • 如果@Greenspark 第一条评论没有解决问题,请告诉我们您遇到了什么问题。它将帮助我们为您提供更多帮助。
  • @Andrew - 您确定要更改 Range("D7:D466") 中的值吗?如果超出该范围的内容发生更改,您的代码将被object required error 炸毁。您可以使用If Not Intersect(Target,Range("D7:D466")) is Nothing Then ... your code ... End If 进行测试

标签: vba excel switch-statement


【解决方案1】:

Worksheet_Change事件结构调整为:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

  If Not Intersect(Target, Range("D7:D446")) is Nothing Then 

      Dim c As Range

      For Each c In Target 

          Select Case c.Value
              Case "1000GP", "1000MM", "19FEST", "20IEDU", "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 If

End Sub

【讨论】:

  • 优秀。太感谢了!该代码修复将单元格颜色更改为红色。但是,用户仍然无法点击 F 列中的单元格。因此,当用户单击 F 列中的红色单元格时,它不会将它们带到与这 17 个值之一关联的宏。这就是第二个事件的目的。 Private Sub Worksheet_BeforeDoubleClick。有什么建议?再次感谢您!
  • 我建议发布一个新问题。但在您这样做之前,请自己回答这些问题:1) 您实际上是在双击吗? 2) 宏名称实际上是gotoref1 吗? 3) 这些宏是否在另一个工作表上列为私有?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多