【问题标题】:Type mismatch error excel VBA类型不匹配错误excel VBA
【发布时间】:2017-04-12 19:20:47
【问题描述】:

我的代码的目标是获取单元格的旧值,并根据新值(如果已输入)对其进行检查。如果旧值更改为新值,则更新指定单元格中的日期。

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

这是我的代码:

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

我不确定类型不匹配错误是什么意思,所以我无法自己解决这个问题。我的问题是,我怎样才能正确更新我的单元格而不抛出这个不匹配错误?

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

谢谢。

【问题讨论】:

  • 我认得那个代码!
  • 哈哈是的,我又回来了:p
  • 我猜Change 事件已经触发,而SelectionChange 事件之前没有触发。可能更新的单元格是打开工作簿时选定的单元格?您可能需要在第一次打开工作簿时强制它触发 SelectionChange 事件,或者确保工作簿没有与 D4:D21 中的任何位置一起保存。

标签: vba excel runtime-error mismatch


【解决方案1】:

你可以试试下面的代码:(把它放在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 完全加载之前触发。

【讨论】:

  • @juiceb0xk - 即使在关闭工作簿并重新打开之后?
  • 是的,我尝试了多次,即使选择保存在引用的单元格之外的其他位置。
  • Hmm - 每个工作表都应该有自己的 oldValue 变量(它们是每个代码模块的本地变量),因此这些值不应相互“干扰”。每次移动选择时,它应该将现有值写入oldValue 数组,每次更改相关单元格之一时,它应该能够找到要查看的oldValue 值。 Type mismatch 几乎可以肯定是因为它丢失了oldValue 的当前内容。 (如果您将其声明为Dim oldValue() As Variant,它可能会给出Subscript out of range 错误。)我不确定发生了什么!
  • 你能帮我试一试吗 - 在第一个工作表中选择单元格 A1,然后在第二个工作表中选择单元格 A1,然后开始尝试更改每个工作表中的值。它什么时候抱怨类型不匹配 - 在第一次单元格更改时,或者在第二次更改时,或者其他什么? (并且每次“中断”时,请尝试在两张纸上选择单元格 A1,然后再重新开始。)
  • 就是这样!当我在刷新单元格之前在两个工作表中选择单元格 A1 时,它会更新日期并且不会引发错误。如果我打开工作簿并且第一次刷新数据时没有选择A1以外的单元格,则会引发错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多