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

时间:2017-01-19 13:52:11

标签: arrays excel vba excel-vba

我正在尝试理解数组,但是我无法完全围绕这个概念。我有以下数据集:

enter image description here

我编写了以下代码以确认B列中的值大于零,如果是这样,它将值提供给数组,然后在消息框中输出最小值:

>=

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

  1. 我需要数组的上端是可变的,因为当宏在某个时刻经常运行时,数组的上端将是4,然后是3,依此类推。
  2. 我想输出与最小值相关联的C列中的值,而不是输出最小值本身。我试图在消息框中偏移值,但没有成功。
  3. 请您指点一下如何实现第1点和第2点?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要的是拥有动态大小的数组。

首先,定义数组而不定义常量,使用Dim ValLng() As Variant

其次,Redim在开始时将其设为较大的尺寸,请使用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