Excel VBA 运行-时间错误“13”:类型不匹配,将变体数组传递给 Application.Index 方法时
Excel VBA Run-time error '13': Type mismatch, when passing a Variant Array to Application.Index method
我是 运行 创建每日报告的代码,首先我使用单元格和偏移量来比较日期但是速度很慢,现在我使用数组来改进代码,但是我在尝试使用某些应用程序功能时遇到问题,首先我尝试了 VLookup,但我得到的只是 运行-time error '13': Type mismatch。现在我正在使用 Match 和 Index 方法,我得到了同样的错误,我似乎无法找到我的错误是什么。
我正在传递一个变体数组,我是这样得到的:
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
我 运行 在调试 window 中只有这一行 Application.Index(wsrgcmes, 0, 1)
我得到了同样的错误。变体数组 wsrgcmes 包含带有数字和字符串值的 table。我无法得到任何帮助,我很感激。谢谢!
wbrgc
的值:
当您获取 Variant
范围内的值时,它始终是基于 1 的二维数组:
因此行索引 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 的评论:
Application
在 COM 术语中是一个可扩展接口 - 它在 运行 时用 WorksheetFunction
成员扩展,所以 Application.Index
确实有效,即使它是延迟绑定的成员调用(无智能感知)。它的行为与其早期绑定的等效项略有不同,因为它不是在给定错误结果的情况下引发 运行 次错误,而是 returns 错误结果(例如#VALUE!)。
两种语法都完全有效,并且每种都需要不同的错误处理机制(早期绑定:On Error...,后期绑定:IfError(...))
Application.Index 对列数和行数有限制。如果超出此范围,您将遇到类型不匹配错误。所以这可能是问题所在。
有关解决此问题的方法,请参阅以下内容:
how-do-i-slice-an-array-in-excel-vba
我不确定当前的限制是多少。它超过 65,536 行或 65,536 列。链接中的解决方案本质上是使用数组来切片而不是 Application.Index.
如果您适当地注意@Vityata 的回答和索引,您可能可以确定您陷入类型不匹配的临界点。在某些情况下,您还可以通过分块处理 columns/rows 以保持在阈值以下来解决此问题。我在这里举了一个分块工作的例子来解决这个问题:。
您可以完全避免索引并使用 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
当您向 INDEX 函数输入 0 时,您是在告诉它 "I want the entire row or column"。
如果您将 Application.Index(wsrgcmes, 0, 1)
分配给一个变体,它工作正常...您有一个带有数组的变体。
如果您尝试将 Application.Index(wsrgcmes, 0, 1)
打印到立即数 window,您会得到一个错误,因为您正在尝试打印一个数组。您需要将其包装在 JOIN 函数中。
我不知道您为什么在 Application.Index(wsrgcmes, 14630, 1)
上收到错误,但我的猜测是在您执行此操作时,wsrgcmes 未填充或不是那个维度。我需要查看发生错误时您使用的代码的确切部分的屏幕截图以及 Watch Window.
中数组的屏幕截图
我不认为你的问题是由 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
内容如下 returns:
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 函数 return 列,则限制为 65536 列,但您似乎不受网格中行数的限制。我怀疑这与我在 http://dailydoseofexcel.com/archives/2013/10/23/dictionaries-can-be-rude/
中提到的 TRANSPOSE 错误有关
我也有这个问题,见here。
我认为 application.Index
不能应用于包含不同类型变量的数组。
我有一个 100 X 2 数组,第一列包含双精度类型,第二列包含字符串。
我无法使用 application.Index
将数组中的内容粘贴到 excel sheet,即使我选择了相同类型的内容(仅来自第 1 列或第 2 列)。
然后我将字符串类型值替换为数字双精度值,这次 application.Index
工作正常。
但是,我们仍然不知道 application.Index
是否仅适用于数字类型。
我是 运行 创建每日报告的代码,首先我使用单元格和偏移量来比较日期但是速度很慢,现在我使用数组来改进代码,但是我在尝试使用某些应用程序功能时遇到问题,首先我尝试了 VLookup,但我得到的只是 运行-time error '13': Type mismatch。现在我正在使用 Match 和 Index 方法,我得到了同样的错误,我似乎无法找到我的错误是什么。
我正在传递一个变体数组,我是这样得到的:
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
我 运行 在调试 window 中只有这一行 Application.Index(wsrgcmes, 0, 1)
我得到了同样的错误。变体数组 wsrgcmes 包含带有数字和字符串值的 table。我无法得到任何帮助,我很感激。谢谢!
wbrgc
的值:
当您获取 Variant
范围内的值时,它始终是基于 1 的二维数组:
因此行索引 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 的评论:
Application
在 COM 术语中是一个可扩展接口 - 它在 运行 时用 WorksheetFunction
成员扩展,所以 Application.Index
确实有效,即使它是延迟绑定的成员调用(无智能感知)。它的行为与其早期绑定的等效项略有不同,因为它不是在给定错误结果的情况下引发 运行 次错误,而是 returns 错误结果(例如#VALUE!)。
两种语法都完全有效,并且每种都需要不同的错误处理机制(早期绑定:On Error...,后期绑定:IfError(...))
Application.Index 对列数和行数有限制。如果超出此范围,您将遇到类型不匹配错误。所以这可能是问题所在。
有关解决此问题的方法,请参阅以下内容:
how-do-i-slice-an-array-in-excel-vba
我不确定当前的限制是多少。它超过 65,536 行或 65,536 列。链接中的解决方案本质上是使用数组来切片而不是 Application.Index.
如果您适当地注意@Vityata 的回答和索引,您可能可以确定您陷入类型不匹配的临界点。在某些情况下,您还可以通过分块处理 columns/rows 以保持在阈值以下来解决此问题。我在这里举了一个分块工作的例子来解决这个问题:
您可以完全避免索引并使用 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
当您向 INDEX 函数输入 0 时,您是在告诉它 "I want the entire row or column"。
如果您将 Application.Index(wsrgcmes, 0, 1)
分配给一个变体,它工作正常...您有一个带有数组的变体。
如果您尝试将 Application.Index(wsrgcmes, 0, 1)
打印到立即数 window,您会得到一个错误,因为您正在尝试打印一个数组。您需要将其包装在 JOIN 函数中。
我不知道您为什么在 Application.Index(wsrgcmes, 14630, 1)
上收到错误,但我的猜测是在您执行此操作时,wsrgcmes 未填充或不是那个维度。我需要查看发生错误时您使用的代码的确切部分的屏幕截图以及 Watch Window.
我不认为你的问题是由 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
内容如下 returns:
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 函数 return 列,则限制为 65536 列,但您似乎不受网格中行数的限制。我怀疑这与我在 http://dailydoseofexcel.com/archives/2013/10/23/dictionaries-can-be-rude/
中提到的 TRANSPOSE 错误有关我也有这个问题,见here。
我认为 application.Index
不能应用于包含不同类型变量的数组。
我有一个 100 X 2 数组,第一列包含双精度类型,第二列包含字符串。
我无法使用 application.Index
将数组中的内容粘贴到 excel sheet,即使我选择了相同类型的内容(仅来自第 1 列或第 2 列)。
然后我将字符串类型值替换为数字双精度值,这次 application.Index
工作正常。
但是,我们仍然不知道 application.Index
是否仅适用于数字类型。