代码之家  ›  专栏  ›  技术社区  ›  juiceb0xk

excel VBA中的类型不匹配错误

  •  1
  • juiceb0xk  · 技术社区  · 8 年前

    我的代码的目标是获取单元格的旧值,如果输入了新值,则对照新值进行检查。如果旧值更改为新值,则更新指定单元格中的日期。

    我的代码的问题是,我似乎无法找到一种方法在不破坏代码的情况下绕过这个错误,因此我在尝试修复这一行代码时遇到了困难。我在两个工作表中使用了这段代码,它们的值都针对不同的单元格进行了更改。问题是,这段代码仅适用于一个工作表,但当我使用两个相同的代码时,它会抛出类型不匹配错误。

    这是我的代码:

    Dim oldValue As Variant
    
    Public Sub Worksheet_SelectionChange(ByVal Target As Range)
    'My other worksheet is referencing cells E2:E100
    oldValue = Me.Range("D4:D21").Value
    End Sub
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("D4:D21")) Is Nothing Then
    Dim c As Range
    For Each c In Intersect(Target, Me.Range("D4:D21"))
        'Check value against what is stored in "oldValue"
        'Type mismatch is on this line here
        If oldValue(c.Row - 3, 1) <> c.Value Then
            'Update value in column L (8 columns to the right of column D)
            c.Offset(0, 7).Value = Date 'or possibly "= Now()" if you need the time of day that the cell was updated
        End If
    Next
    End If
    End Sub
    

    我不确定类型不匹配错误意味着什么,所以我无法自己解决这个问题。我的问题是,如何正确地更新我的单元格,而不抛出这种不匹配错误?

    编辑:请记住,一个工作表查找数字数据更改,另一个工作单查找字符串值更改,我不确定这是否重要。如果我将一个工作表的所有代码取出,代码将对另一工作表有效,但当我将其放回工作表时,它们都停止工作。

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   YowE3K    8 年前

    您可以尝试以下代码:(将其放入 ThisWorkbook )

    Private Sub Workbook_Open()
        Application.ScreenUpdating = False
        Dim ws As Worksheet
        Dim ws1 As Worksheet
        Set ws1 = ActiveSheet
        For Each ws In Worksheets
            ws.Activate
            ws.Range("A1").Select
        Next
        ws1.Activate
        Application.ScreenUpdating = True
    End Sub
    

    一个警告-Workbook_Open事件有时“有问题”,因为它在所有 Worksheets 完全加载。