为什么redim会阻止类型不匹配错误?

时间:2017-12-28 15:53:17

标签: vba

我有这个简化的代码,其中infosOptions是一个全局变量,其中包含不同的类型:

Dim optionsVecteur As Variant
For j = 0 To UBound(infosOptions)
   If infosOptions(j, 11) & " Index" = transac.optionName Then
      optionsVecteur(1) = infosOptions(j, 6)
      optionsVecteur(2) = infosOptions(j, 5)
      optionsVecteur(3) = infosOptions(j, 10)
      Exit For
   End if
End j

我在optionsVecteur(1) = infosOptions(j, 6)上遇到了类型不匹配错误,但是如果它Redim optionsVecteur(3)有效,为什么呢?

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。正如评论中指出的那样,您创建了一个标量Variant(如在单个变量中)而不是数组。你需要纠正这个。

此外,在多维数组上使用UBound在其他情况下可能会失败。最佳做法是使用UBound的完整定义来确保您实际选择正确的限制。

如下所示的更改应该可以解决您的问题:

Dim optionsVecteur() As Variant 'This creates an array of variants - But has not dimensioned the array.
ReDim optionsVecteur(1 to 3) as Variant 'This dimensions the array as having 3 elements. You could have just put this in the original line above, but doing this allows you to dynamically change the length of the array of required.

For j = 0 To UBound(infosOptions, 1)'This ensures that VBA considers the upper boundary of the first dimension.
   If infosOptions(j, 11) & " Index" = transac.optionName Then
      optionsVecteur(1) = infosOptions(j, 6)
      optionsVecteur(2) = infosOptions(j, 5)
      optionsVecteur(3) = infosOptions(j, 10)
      Exit For
   End if
Next j 'You want next j not end j.