VBA数组:在MsgBox中查找范围,偏移值和输出值的最小值

我正在尝试理解数组,但是不能完全包裹我的头。 我有以下数据集:

在这里输入图像说明

而且我写了下面的代码来确认列B中的值大于零,如果是这样的话,它将值送入数组,然后在消息框中输出最小值:

Sub MinFunc() Dim ValLng(1 To 5) As Long, x As Long x = 3 For i = 1 To 5 If Cells(x, 2).Value > 0 Then ValLng(i) = Cells(x, 1).Value Cells(x, 2).Value = Cells(x, 2).Value - 1 x = x + 1 End If Next i MsgBox (Application.WorksheetFunction.Min(ValLng)) End Sub 

现在我有两个问题的代码:

  1. 我需要数组的上端是可变的,因为当macros运行足够频繁时,数组的上端将是4,然后是3,依此类推。
  2. 我不想输出最小值本身,我想输出与最小值相关联的列C中的值。 我试图抵消消息框中的值,但没有成功。

你可以请给我指示,我怎样才能实现点1和2?

谢谢你的帮助!

你需要的是拥有一个dynamic大小的数组。

首先,定义不定义大小的数组,使用Dim ValLng() As Variant

其次,在开始时将其重新设置为较大的尺寸,使用ReDim ValLng(0 To 1000)

第三,在完成For循环中所有匹配的数组后,使用ReDim Preserve ValLng(0 To x - 1)优化数组。 Redim Preserve意味着你正在重新Redim数组,但保留数组中的值。

下面的代码会让你开始:

 Option Explicit Sub MinFunc() Dim ValLng() As Variant, x As Long, i As Long Dim MinRes, RngFind As Range ReDim ValLng(0 To 1000) '<-- init dynamic array size to a very large value , will optimize later x = 3 '-- just for example, loop until the last cell with data in Column B For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row If Cells(x, 2).Value > 0 Then ValLng(i) = Cells(x, 1).Value Cells(x, 2).Value = Cells(x, 2).Value - 1 x = x + 1 End If Next i ReDim Preserve ValLng(0 To x - 1) '<-- resize array to actual size found MinRes = Application.WorksheetFunction.Min(ValLng) Set RngFind = Cells.Find(What:=MinRes, After:=Range("A1"), _ LookIn:=xlValues, LookAt:=xlWhole) '<-- use find method Cells(RngFind.Row, 3) = MinRes '<-- put the Minimum value at column C at the same row End Sub