【问题标题】:Run-time Error '13': Type Mismatch when I clear cell contents运行时错误“13”:清除单元格内容时类型不匹配
【发布时间】:2020-06-10 05:02:13
【问题描述】:

我对 VBA 很陌生,但到目前为止,我已经能够自己完成所需的一切。但是,我似乎无法解决这个问题。从技术上讲,我有 2 个不同的私人潜艇(Worksheet_Change),但只有将它们结合起来才能让它们工作。第一个将 B 列中具有相同内容的单元格数量限制为 3 个。

第二个清除范围 G:I,如果 H = 100,则复制范围 A:F。当我清除时,“Macro1”给了我这个运行时错误(运行时错误'13':类型不匹配)出于某种原因的内容。很明显,《宏2》是在清内容,所以我真的是在自相矛盾。

Private Sub Worksheet_Change(ByVal Target As Range)

'First Macro. (The issue is in this Macro)

If WorksheetFunction.CountIf(Range("B4:B350"), Target) > 3 Then

    msgbox "This team member has the maximum number of open projects.", vbCritical, "Overburdened"
    Target.Value = ""
    Target.Select

End If

'Second Macro

    Dim rngStart As Range

    Set rngStart = ActiveCell

    A = Worksheets("Project Tracking").Cells(Rows.Count, 1).End(xlUp).Row


For i = 4 To A

    If Worksheets("Project Tracking").Cells(i, 8).Value = 100 Then

        Worksheets("Project Tracking").Range(Cells(i, 7), Cells(i, 9)).ClearContents
        Worksheets("Project Tracking").Range(Cells(i, 1), Cells(i, 6)).Copy
        Worksheets("Completed Projects").Activate
        B = Worksheets("Completed Projects").Cells(Rows.Count, 1).End(xlUp).Row
        Worksheets("Completed Projects").Cells(B + 1, 1).Select
        ActiveSheet.Paste
        Worksheets("Project Tracking").Activate
        Worksheets("Project Tracking").Range(Cells(i, 1), Cells(i, 6)).ClearContents

        Call Reset_List

        Call Macro3

    End If

Next

Application.CutCopyMode = False

ThisWorkbook.Worksheets("Project Tracking").Cells(1, 1).Select

rngStart.Select


End Sub

【问题讨论】:

  • 快速测试 - 看看您是如何(正确地!)使用工作表“项目跟踪”来验证 Range() 的?当您使用Range() 执行此操作时,您还需要使用其中的Cells() 引用执行此操作。所以就做Worksheets("Project Tracking").Range(Worksheets("Project Tracking").Cells(i, 1), Worksheets("Project Tracking").Cells(i, 6)).ClearContents
  • 如果您确定问题是因为 _Change() 事件导致更改(即调用自身),您应该能够通过将 Application.EnableEvents = False 放在 Sub 的开头和 @ 来防止它987654328@在最后。

标签: excel vba mismatch


【解决方案1】:

你在这一行得到一个类型不匹配...

If WorksheetFunction.CountIf(Range("B4:B350"), Target) > 3 Then

...因为您正在调用Target(即.Value)的默认成员,然后将其传递给CountIf。问题是因为您在Worksheet_Change 事件处理程序中,所以Target 不必是单个单元格。如果不是单个单元格,Target.Value 包含一个数组,如果您尝试将其传递给CountIf,则会抛出该数组。如果您只对单个单元格更改感兴趣,请在 Sub 的顶部添加一个保护子句:

If Target.Cells.Count <> 1 Then Exit Sub

此外,正如 cmets 中所述,由于您正在更改单元格(尽管尚不清楚这是在哪个工作表中),因此您应该在开始进行可能导致重新进入的更改之前禁用事件 - Application.EnableEvents = False。完成后不要忘记重新启用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多