Excel VBA运行时错误“13”:将Variant数组传递给Application.Index方法

时间:2018-04-19 12:47:35

标签: arrays excel vba excel-vba type-mismatch

我正在运行一个代码来创建每日报告,首先我正在使用单元格和偏移来比较日期,但这很慢,现在我正在使用数组来改进代码,但我遇到了一个问题当试图使用一些应用程序函数时,首先我尝试了VLookup,我得到的只是运行时错误'13':类型不匹配。现在我正在使用Match和Index方法,我得到了同样的错误,我似乎无法找到我的错误。

我正在传递Variant数组,我就是这样:

Public wsrgcmes As Variant
Public wshtte As Variant

With Sheets("Resumen general de casos")
    wsrgcmes = .Range(.Cells(1, 2), .Cells(lRow, lCol)).Value
End With

当我尝试执行Application.Index方法时,错误就出现了。

Sub gen_informe()    
     temp = Application.Index(wsrgcmes, 0, 1)        
End Sub

我在调试窗口中只运行了这行Application.Index(wsrgcmes, 0, 1),我得到了同样的错误。 Variant Array wsrgcmes包含一个包含数字和字符串值的表。我得到的任何帮助,我很感激。谢谢!

wbrgc的值:

enter image description here

4 个答案:

答案 0 :(得分:2)

当您将范围的值设为Variant时,它始终是基于1的2D数组:

"locals" toolwindow in the VBE debugger showing array indices

因此,行索引0不在数组范围内,Application.Index在这种情况下会引发类型不匹配错误。

Public Sub TestMe()        
    Dim a As Variant
    a = Range("A1:D5").Value2
    Debug.Print Application.Index(a, 1, 2)    
End Sub

来自@Mathieu Guindon的评论:

在COM方面,

Application是一个可扩展的界面 - 它在运行时与WorksheetFunction成员进行了扩展,因此Application.Index确实有效,即使它是&#39} ;是一个迟到的成员电话(没有intellisense)。它的行为与早期绑定的等价物略有不同,因为它不会在给定错误结果的情况下引发运行时错误,而是返回错误结果(例如#VALUE!)。

两种语法都完全有效,每种语法都需要不同的错误处理机制(早期绑定:On Error ...,后期绑定:IfError(...))

答案 1 :(得分:1)

当你将INDEX函数输入0时,你会告诉它"我想要整个行或列"。

如果您将Application.Index(wsrgcmes, 0, 1)分配给变体,它可以正常工作......您已经有一个带有数组的变体。

如果您尝试将Application.Index(wsrgcmes, 0, 1)打印到即时窗口,则会出现错误,因为您正在尝试打印阵列。您需要将其包装在JOIN函数中。

我不知道你在Application.Index(wsrgcmes, 14630, 1)收到错误的原因,但我的猜测是,当你这样做时,wsrgcmes没有填充或者没有那个维度。我需要查看错误发生时您使用的代码的确切部分的截图,以及监视窗口中数组的屏幕截图。

我不相信你的问题是由INDEX的限制引起的,因为你离他们不远。

以下代码显示了从VBA调用时INDEX的限制:

 Sub IndexLimitations()

Dim v       As Variant
Dim i       As Long
Dim j       As Long
Dim k       As Long
Dim vArray  As Variant
Dim vItem   As Variant

vArray = Array(65536, 65537, 1048576, 1048577)

For Each vItem In vArray
    i = vItem
    ReDim v(1 To i, 1 To 2)
    For j = 1 To i
        For k = 1 To 2
            v(j, k) = j * k
        Next k
    Next j
    Debug.Print "Rows dimension test: " & i
    Debug.Print Application.Index(v, i, 1)
    Debug.Print ""

    ReDim v(1 To 2, 1 To i)
    For j = 1 To i
        For k = 1 To 2
            v(k, j) = j * k
        Next k
    Next j

    Debug.Print "Columns dimension test: " & i
    Debug.Print Application.Index(v, 1, i)
    Debug.Print ""

Next vItem

End Sub

以下是它的回报:

Rows dimension test: 65536
 65536 

Columns dimension test: 65536
 65536 

Rows dimension test: 65537
 65537 

Columns dimension test: 65537
Error 2023

Rows dimension test: 1048576
 1048576 

Columns dimension test: 1048576
Error 2023

Rows dimension test: 1048577
 1048577 

Columns dimension test: 1048577
Error 2023

这里的学习是,如果使用INDEX函数返回列,则限制为65536列,但您似乎不限于网格中的行数。我怀疑这与我在http://dailydoseofexcel.com/archives/2013/10/23/dictionaries-can-be-rude/

中提到的TRANSPOSE错误有关

答案 2 :(得分:0)

Application.Index对列数和行数有限制。如果超过此值,您将遇到类型不匹配错误。所以这可能就是问题所在。

有关解决此问题的方法,请参阅以下内容:

how-do-i-slice-an-array-in-excel-vba

我不确定当前的限制是什么。它超过65,536行或65,536列。链接中的解决方案主要是使用数组来切片而不是Application.Index。

如果您正确地注意@Vityata的答案和索引,您可能会确定转换为类型不匹配的临界点。在某些情况下,您还可以通过处理块中的列/行来解决此问题,以保持在阈值之下。我举了一个以块为单位来解决这个问题的例子:Slice array to use index on larger than 65000

您可以完全避免索引并使用TimWilliams辅助函数。

使用@TimWilliams辅助函数

Sub test 'your other sub

temp = GetColumn(wsrgcmes,1)

End Sub


Function GetColumn(arr, colNumber)
    Dim arrRet, i As Long
    ReDim arrRet(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        arrRet(i, 1) = arr(i, colNumber)
    Next i
    GetColumn = arrRet
End Function

答案 3 :(得分:0)

我也有这个问题,请参阅here。 我认为application.Index不能应用于包含不同类型变量的数组。 我有一个100 X 2数组,其中第一列包含double类型,第二列包含字符串。 即使我选择了相同类型的内容(仅从第1列或第2列),也无法使用application.Index将数组中的内容粘贴到Excel工作表中。 然后,我用数字双精度值替换了字符串类型值,这次application.Index正常工作了。 但是,我们仍然不知道application.Index是否仅适用于数字类型。