为什么在Excel VBA中,这种Application.Index函数的用法类型不匹配?

Why is there a type mismatch in this usage of Application.Index function in excel VBA?

我遇到的问题是出现"类型不匹配"错误,此后,"本地窗口"将丢失变量中存储的值的所有内存。因此,我无法调试问题的出处。

出现问题之前的初步代码:

1
2
3
4
5
6
7
8
9
10
11
12
Dim i as Long, j as Long, g as Long
Dim Total_Rows_Help as Long

Total_Rows_Help = Worksheets("Help Worksheet").Range("A" & Rows.Count).End(xlUp).Row

ReDim Min_NDate(2 To Total_Rows_Help, 2 To Total_Rows_Help) As Variant

For i = LBound(Min_NDate, 1) To UBound(Min_NDate, 1)
    For j = LBound(Min_NDate, 2) To UBound(Min_NDate, 2)
        Min_NDate(i, j) = Worksheets("Help Worksheet").Cells(i, 2) - Worksheets("Help Worksheet").Cells(j, 2)
    Next j
Next i

问题围绕这些循环集发生(循环和代码一直工作到出错的某个点。我认为这是由于Application.Index引起的):

1
2
3
4
5
6
7
8
ReDim Count(2 To Total_Rows_Help, 2 To Periods - 1) As Variant
For i = LBound(Min_NDate, 1) To UBound(Min_NDate, 1)
    If Application.Large(Application.Index(Min_NDate, i, 0), Periods - 1) < 0 Then
        For g = LBound(Count, 2) To UBound(Count, 2)
            Count(i, g) = Application.Large(Application.Index(Min_NDate, i, 0), g)
        Next g
    End If
Next i

下面是附加的excel文件,代码位于Compiled工作表上:
Excel文件

奇怪的是,有时它不允许使用Debug选项,而只是立即结束。但是,这次调整了i值后,我可以得到问题的屏幕截图:
1

2

它撞上了i值,该值与达到循环上限的距离为+1。但是,它应该起作用,因为Min_NDateCount的列数与2 To Total_Rows_Help相同

使用UBound函数设置了变量i的上限的相同问题:

3

4

  • 根据切片索引的大小,将抛出适合值,您将获得一个空数组。 测试i的值并查看。 围绕65536的某个地方? 也许。 不能记住。 stackoverflow.com/questions/48598247/
  • 如果在该错误对话框中单击"调试",则代码应停止并突出显示相关行,并保留变量的值。
  • @QHarr感谢当前测试i值。 将更新主要帖子
  • @RonRosenfeld它突然结束了,我大部分时间没有选择按debug的选项。 我相信那只是"好"
  • @MarcSantos-还有许多其他调试选项。 这篇文章(由VBA魔术师Chip Pearson撰写)概述了一些其他内容,以试图深入研究该问题,首先是逐步检查您的代码。
  • 是的,我确实执行了我的代码,但是,在这种情况下,调试只是突然结束。 有时它可能起作用,这可能与Ron提到的主要问题有关。


该错误是因为您的INDEX函数没有指向您认为的位置。

1
Index(Min_NDate, i, 0)

将返回索引ith行的整个行。
但是,您的Min_NDate数组的LBound为2。 那就是数组的第一行。

因此,Index(Min_Ndate,1,0)实际上返回了Min_Ndate(2,{2-Ubound(Min_NDate,2})的内容,并且随之而来的是Index(Min_Ndate, Ubound(Min_NDate,1), 0)将不在您的实际数组之外。

您需要调整索引功能中的值。

您的代码中可能还有其他问题。
调整该条目后,我发现了另一个实例,其中您对Min_NDate的引用超出了为该数组确定尺寸的方式的范围。

运行以下代码可演示我要编写的内容。 在i=9之后,由于与您的代码相同的原因,下一个"运行"将导致Type Mismatch错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Explicit
Sub marine()
    Dim v(2 To 10, 2 To 5)
    Dim i As Long, j As Long
    Dim w
    Dim s As String

'Populate the array
For i = 2 To 10
    For j = 2 To 5
        v(i, j) = i * j
    Next j
Next i

'Examine the contents
For i = 2 To 10
    'contents of the array
    s =""
    For j = 2 To 5
        s = s & vbLf & v(i, j)
    Next j
    s ="Array contents with i =" & i & s & vbLf & vbLf

    'Output of the index function with the same arguments
    w ="Output of Index Function with i =" & i & vbLf & Join(Application.Index(v, i, 0), vbLf)
    MsgBox s & w
Next i


End Sub

  • 正确,我在发布后几秒钟删除了该评论,以实际理解它。对于那个很抱歉。现在确实有一点道理为什么不起作用
  • @MarcSantos好吧,我删除了我的评论。我写的东西现在可以理解了吗?
  • 是的,我有一个主意仍在尝试使其可视化,因此可以修改代码。
  • @MarcSantos我刚刚添加了一个宏,我认为它可以帮助可视化问题。
  • 谢谢,请尝试一下,一旦我修复代码,它就会更新
  • 我不明白您所说的Min_NDate(2,{2-Ubound(Min_NDate,2)}。括号中的含义是什么?我得到的是Min_NDate(2,2-199) = Min_NDate(2,-197)。同样要澄清的是,Index(Min_NDate,1,0)将返回数组Min_NDate的第一行的所有列,因此它将返回Min_NDate(2,:)的列值,对吗?
  • @MarcSantos {2-Ubound(Min_NDate,2}表示从2Ubound(Min_NDate,2)的范围。这不是合法的VBA行。因此,这是表示数组ith行中所有条目的一种简便方法,其中row等效于数组的第一维。即与较短的Min_NDate(2,:)相同
  • 感谢您的澄清,尽管我的理解正确吗? Index(Min_NDate,4,0)会为我的情况提供Min_NDate(5, :)吗?