运行时错误13 - 如果for循环中的函数类型不匹配(尝试匹配字符串的错误)

时间:2016-11-14 04:33:36

标签: excel-vba vba excel

我正在尝试找到第一个单元格(行)说明" #N / A"在特定列中。我无法解决我得到的类型不匹配错误。我用Google搜索并阅读了很多类似的stackflow问题和答案,但仍然无法解决它。

到目前为止我尝试过的主要内容(除了各种小变化):

  • 使用立即窗口和调试打印来检查输出(GetDates子工作正常)
  • 将集合转换为可以定义数据类型的数组
  • 使用while函数而不是for(在这种情况下,我让它尝试while函数,但在最后一次迭代中我再次遇到类型不匹配)

这是完整的代码:

Dim EndofWeekDates As New Collection
Dim EndofRange As New Collection

Dim lCol As Long
Dim lRow As Long
Dim i As Long
Dim j As Long
Dim v As Long
Dim x As Long


Sub GetDates()

    Set EndofWeekDates = Nothing
    i = 4
    j = 1
    lCol = Cells(1, Columns.Count).End(xlToLeft).Column

    While j < lCol + 1
        If Not IsEmpty(Cells(i, j).Value) And Not Cells(i, j).Value = "End" Then
            EndofWeekDates.Add j
        End If
        j = j + 1
    Wend

    Call GetRange

End Sub

Sub GetRange()

    Set EndofRange = Nothing
    For x = EndofWeekDates.Count To 1 Step -1
        lRow = Cells(Rows.Count, EndofWeekDates(x)).End(xlUp).Row

        For v = 15 To lRow
            If Cells(v, EndofWeekDates(x)).Value = "#N/A" Then
                EndofRange.Add v
                Exit For
            End If
        Next v

    Next x

End Sub

我在IF行的下一节中得到错误

For v = 15 To lRow
   If Cells(v, EndofWeekDates(x)).Value = "#N/A" Then
      EndofRange.Add v
      Exit For
   End If
Next v
v 更改时, EndofWeekDates(x)应在每次 15 - lRow 运行期间保持不变。我已经尝试输入变量 i (之前使用过)而不是 v 并且只有在 i 保持不变且未在 for loop 。据我所知,问题在于 v 而不是 EndofWeekDates(x)。此外,似乎问题只发生在我不使用常量而是每次迭代更改数字时。我尝试使用与 GetDates 中相同的功能,但这也没有解决它。

由于 v 被声明为 Long 而且我也尝试了整数,我被卡住了。特别是因为之前使用的 Cells.Value Long 一起工作,每次迭代都会增加 Long

3 个答案:

答案 0 :(得分:3)

你的行

If Cells(v, EndofWeekDates(x)).Value = "#N/A" Then

崩溃,因为单元格不包含字符串"#N/A",而是包含错误代码,Excel显示为#N/A

无法执行错误代码与字符串的比较,因为没有类型转换允许将比较的两面转换为通用数据类型 - 因此它会生成&#34;类型不匹配&#34 ;错误。

测试#N/A错误情况的正确方法是

If Application.IsNA(Cells(v, EndofWeekDates(x))) Then

答案 1 :(得分:0)

这是一个非常特殊的错误。我不确定是什么原因造成的,但使用Cells().Text代替Cells().Value可以正常使用。

enter image description here

答案 2 :(得分:0)

尝试以下

    For v = 15 To lRow
       If Cells(v, EndofWeekDates(x)).Text = "#N/A" Then
          EndofRange.Add v
          Exit For
       End If
    Next v

或者,

For v = 15 To lRow
   If Application.WorksheetFunction.IsNA(Cells(v, EndofWeekDates(x))) Then
      EndofRange.Add v
      Exit For
   End If
Next v