我正在运行一个代码来创建每日报告,首先我正在使用单元格和偏移来比较日期,但这很慢,现在我正在使用数组来改进代码,但我遇到了一个问题当试图使用一些应用程序函数时,首先我尝试了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
的值:
答案 0 :(得分:2)
当您将范围的值设为Variant
时,它始终是基于1的2D数组:
因此,行索引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
是否仅适用于数字类型。