【问题标题】:VBA Select Case Runtime Error 13VBA 选择案例运行时错误 13
【发布时间】:2015-11-30 15:27:51
【问题描述】:

我正在尝试在某个范围内更改单元格以在输入特定文本时运行宏时运行选择案例。我为“F50”的单个单元格(以及后面的代码)工作,但是当我在几行之后尝试使用相同样式的代码时,它不起作用。

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("F50")) Is Nothing Then
Select Case Range("F50")
    Case "MPR-9A": Resize9
    Case "MPR-8A": Resize8
    Case "MPR-6A": Resize6
    Case "MPR-3A": Resize3
End Select
End If

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then
Select Case Range("F4:F45")
    Case "M-20A": M20A
    Case "M-2X20A": M2X20A
    Case "M-20A-SP": M20ASP
End Select
End If

End Sub

当我在 F4:F45 范围内的某处放置一个新值时,我试图让这段代码运行。当输入该值时,case 检查要运行的宏。 宏复制另一个工作表上的范围并将其粘贴到刚刚触发宏的单元格(其中还包括右侧和下方的几个单元格),当我手动触发它们时,这些宏运行良好。

我选择了复制/粘贴路线,因为我放弃了计划 A,该计划试图将刚刚收到新值的单元格与其下方的 1 或 3 合并,然后在右侧的单元格中输入文本。如果我应该重新尝试那条路线,我非常乐意尝试避免复制和粘贴。

【问题讨论】:

  • Range("F4:F45") 是测试的情况,但这不会返回字符串 - 这是您尝试测试它的内容。如果您在该块中添加Case Else: Debug.Assert False,代码将停止,您会看到。
  • 那是因为您需要禁用事件并在某处添加DoEvents - 我假设您调用的潜艇在某个时候会更改工作表,因此代码会自行调用 - 导致无限循环,这将使 Excel 崩溃。使用事件触发器的常见缺陷。
  • 感谢您的帮助!我尝试了 Macro Man 的解决方案,但它使 Excel 崩溃。我也尝试了 R3UK 的解决方案,但它返回了运行时错误。我编辑了 OP 以阐明宏发生了什么
  • @N.Volchko:什么错误号和哪一行 plz?顺便说一句,回复具体答案(或在此评论中使用@ 向每个评论最多的一个用户发送通知)

标签: vba excel select case


【解决方案1】:

如果您只想检查这些字符串是否存在,请将其用于您的第二个块:

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then
tempStr = Join([TRANSPOSE[F4:F45)]," ")
    Select Case True
        Case InStr("M-20A", tempStr): M20A
        Case InStr("M-2X20A", tempStr): M2X20A
        Case InStr("M-20A-SP", tempStr): M20ASP
    End Select
End If

如果您想单独检查每个单元格,则必须遍历该范围:

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then
    For Each cell In Range("F4:F45").Cells
        Select Case cell.Value
            Case "M-20A": M20A
            Case "M-2X20A": M2X20A
            Case "M-20A-SP": M20ASP
        End Select
    Next
End If

【讨论】:

  • 等待 OP 澄清,但这可能会产生与范围内先前值有关的多个案例。但是很好地使用Select 和Instr,我从未见过,但可能有一天会使用它!谢谢!
  • 我基本上颠覆了Select Case 的逻辑——你可以将测试用例设置为True,然后创建任何你想测试的表达式——有时比使用@987654327 简单得多@block 并且总是更快。
【解决方案2】:

您可以使用Range("F4:F45").Cells(1,1),实际上是F4 单元格。

但我猜你要测试的东西是Target.Value,改变的单元格的值:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub

If Not Intersect(Target, Range("F50")) Is Nothing Then
Select Case Range("F50")
    Case "MPR-9A": Resize9
    Case "MPR-8A": Resize8
    Case "MPR-6A": Resize6
    Case "MPR-3A": Resize3
End Select
End If

If Not Intersect(Target, Range("F4:F45")) Is Nothing Then
Select Case Target.value
    Case "M-20A": M20A
    Case "M-2X20A": M2X20A
    Case "M-20A-SP": M20ASP
End Select
End If

End Sub

【讨论】:

  • Target 或 Cells(1, 1) 只会返回 single 单元格的值 - 但 OP 想要针对 range 进行测试细胞,所以这不起作用。选项是从正在测试的单元格创建一个字符串,或者循环遍历该范围内的每个单元格并单独测试。
  • @MacroMan :是的,我也评论了你的回答!等待 OP 澄清!
  • @MacroMan :显然,我的解决方案成功了,OP 消失了!^^
  • @R3uK,我必须在选择案例之前添加“If Target.Count > 1 Then Exit Sub”,因为目标有时可能是合并单元格。
  • 很好看,我确实也使用过这个,但完全忘了把它放在你的答案中!我的错! ;) 顺便说一句,它是If Target.Cells.Count > 1 Then Exit Sub
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多