【问题标题】:VBA: TypeMismatch in Cells function, when cell value exceeds 256 charactersVBA:单元格函数中的类型不匹配,当单元格值超过 256 个字符时
【发布时间】:2020-09-21 14:29:44
【问题描述】:

我想做什么

我有一个函数可以遍历单元格以查看它们是否有#N/A 错误。如果是这样,另一列中同一行中的单元格应为绿色。

问题

我收到错误Run-time error 13: Type Mismatch。一旦到达某些包含文本的单元格,就会发生这种情况。到目前为止,我发现它似乎只对超过 256 个字符的单元格抛出此错误。

我使用 Excel 作为 64 位 Office 365 订阅的一部分。

到目前为止我尝试了什么

我尝试使用On Error GoTo [ErrorLabel] 忽略此错误,然后继续进行下一次迭代。由于某种原因,这只能工作一次。一旦检查了另一个超过 256 个字符的单元格,我就会再次收到相同的错误。

编辑:也许它与函数 IsNA() 期望 Variant 数据类型有关。我想,由于单元格值太大而不能作为字符串,所以它根本没有存储在变量中,或者它只是与Variant不同的东西。

这是一个包含多个程序的更大模块的一部分。所以它应该是程序化的。 cmets 中提出的isErrorCVErr 并未解决此问题。仍然收到Type Mismatch

代码

产生错误的初始代码:

For i = 2 To rowCount
If WorksheetFunction.IsNA(Cells(i, 4)) _
    Then Cells(i, 1).Interior.Color = RGB(0, 255, 0)

我尝试解决此问题的代码。这仍然会引发错误(请参阅“到目前为止我尝试了什么”部分):

For i = 2 To rowCount
On Error GoTo Error
'based on following condition
'   1. Name does not exist in previous weeks' sheet, identified by VLOOKUP being #N/A
    If WorksheetFunction.IsNA(Cells(i, 4)) _
        Then Cells(i, 1).Interior.Color = RGB(0, 255, 0)
Error:
    Next i

如何复制

创建一个空白表,其中一列包含几行不同长度的文本。如下图,至少有一行超过 256 个字符才能测试。

在 Sheet1 下的 VBA 中插入以下代码:

    Sub isText()
    Dim i As Integer
        For i = 2 To 6
        If WorksheetFunction.isText(Cells(i, 1)) _
            Then Debug.Print "Is Text" _
            Else Debug.Print "Is Not A Text"
        Next i
    End Sub

在这个例子中,错误一到达第 6 行就会抛出。

【问题讨论】:

  • 使用If IsError(Cells(i, 4))
  • 您可以对这个 btw 使用条件格式并完全避免使用 VBA。
  • 如前所述,除非它作为更大过程的一部分存在,否则条件格式将是更好的选择。它将自动更新,无需重新运行子程序。
  • 按照@ScottCraner 的建议使用IsError 或使用CVErr。这两种方法都显示HERE
  • @Fortun 请尝试If WorksheetFunction.isText(Cells(i, 1).Value2) Then - 它适用于您的“如何重现”中的代码和数据(但使用.isText(Cells(i, 1)) 我也会出错)

标签: excel vba


【解决方案1】:

感谢评论者,问题已解决。

根本原因

这个错误的原因可能与WorksheetFunctions.isNA() 函数有关。根据此函数的documentation,它需要一个Variant 类型的参数。但在我的 excel 版本(office 365 (16.0.12527.21096) 64 位)中,任何包含超过 255 个字符的字符串的单元格都在内部存储为 Array 数据类型。这是用=TYPE Excel 函数检查的。它返回64 来暗示一个数组(documentation)。

解决方案

我没有使用Cells(rowNum, colNum),而是使用了Cells(rowNum, colNum).Value,它返回Variant 数据类型,而不是Array。这正是我需要的类型。

【讨论】:

    【解决方案2】:

    在我看来,您在所有单元格中寻找错误的公式是徒劳的。 Excel 可以通过一个运算符为您提供所有错误,您只能对它们进行迭代。希望在这些单元格中您不会找到超过 4 或 5 个字符的文本:

    Sub FindErrorsOnActiveSheet()
    Dim ws As Worksheet
    Dim aErrors As Range
    Dim oCell As Range
        Set ws = ActiveSheet ' or any other
        Set aErrors = ws.Cells.SpecialCells(xlCellTypeFormulas, 16)
        For Each oCell In aErrors
            Debug.Print "Cell " & oCell.Address(False, False, xlA1) & " has error " & oCell.Text
            If oCell.Text = "#N/A" Then oCell.Offset(0, 1 - oCell.Column).Interior.Color = RGB(0, 255, 0)
        Next oCell
    End Sub
    

    【讨论】:

      【解决方案3】:

      使用:

      还有这段代码:

      Sub isText()
          Dim str As Variant
          Dim i As Integer
          For i = 2 To 6
              str = Cells(i, 1)
              On Error Resume Next
                  str = Left(str, 255)
              On Error GoTo 0
              If Not IsError(str) Then
                  Debug.Print "Is Text"
              Else
                  Debug.Print "Is Not A Text"
              End If
          Next i
      End Sub
      

      我明白了:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-26
        • 2019-01-23
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 2019-08-02
        • 1970-01-01
        相关资源
        最近更新 更多