vba ReDim 保留“下标超出范围”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23393123/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 18:09:32  来源:igfitidea点击:

ReDim Preserve "Subscript Out of Range"

arraysexcelvbaexcel-vbavb6

提问by atomant

I am trying to move data from 2 Double Arrays to 2 different Double Arrays. I'm not sure what the size is going to be because I am taking a randomized sample out of the first arrays and putting it into the 2nd arrays.

我正在尝试将数据从 2 个双精度数组移动到 2 个不同的双精度数组。我不确定大小会是多少,因为我从第一个数组中随机抽取样本并将其放入第二个数组中。

When I add the ReDim Preserve line I get the Subscript Out of Range error.

当我添加 ReDim Preserve 行时,出现下标超出范围错误。

Function CreateTrainingSet(TrainingPercent As Double, Inputs() As Double, Outputs() As Double)
 ' Create Randomized Training set data
 Dim TrainingInputs() As Double, TrainingOutputs() As Double
 Dim i As Integer, j As Integer, count As Integer
 'ReDim TrainingInputs(UBound(Inputs, 1), UBound(Inputs, 2))
 'ReDim TrainingOutputs(UBound(Outputs, 1), UBound(Outputs, 2))
 count = 0

 ' Move TraningPercent % of data from Inputs and Outputs to TrainingInputs and TrainingOutputs
 For i = LBound(Inputs, 1) To UBound(Inputs, 1)
  Dim ran As Double
  ran = Rnd()
  If ran <= TrainingPercent Then
   count = count + 1
   For j = LBound(Inputs, 2) To UBound(Inputs, 2)
    ReDim Preserve TrainingInputs(1 To count, 1 To UBound(Inputs, 2))
    TrainingInputs(count, j) = Inputs(i, j)
   Next j
   For j = LBound(Outputs, 2) To UBound(Outputs, 2)
    ReDim Preserve TrainingOutputs(1 To count, 1 To UBound(Outputs, 2))
    TrainingOutputs(count, j) = Outputs(i, j)
   Next j
  End If
 Next i

 For i = LBound(TrainingInputs, 1) To UBound(TrainingInputs, 1)
  For j = LBound(TrainingInputs, 2) To UBound(TrainingInputs, 2)
   Cells(i, j + 10).Value = TrainingInputs(i, j)
  Next j
 Next i


End Function

回答by Carl Onager

To summarise the comments above into an answer:

将上述评论总结为答案:

  • You can only redim the last dimension of a multi dimension array
  • 您只能重新调整多维数组的最后一个维度

Therefore in order to resize a multiple dimension array there are a couple of simple options:

因此,为了调整多维数组的大小,有几个简单的选项:

  1. If only one dimension needs to be resized flip the loops and logic around so that the dimension to be resized becomes the last dimension
  2. If both dimensions must be resized use either an array of arrays or a collection of arrays and correct the loops as required
  1. 如果只有一个维度需要调整大小,则翻转循环和逻辑,以便要调整大小的维度成为最后一个维度
  2. 如果必须调整两个维度的大小,请使用数组数组或数组集合并根据需要更正循环