我有一个" Datevarie"动态矩阵,包含许多日期。
在例行程序中的某个时刻,我必须从DateVarie中提取最低值。
问题在于,当我使用Lbound函数时,我总是返回值1而不是日期(例如" 01/01/2011")。
我认为当我逐步调试数组时,数组中的数据输入正确。
如何解决而无需在工作表上报告数据并订购它们?我必须使用FOR ... NEXT吗?日期可以是2-3,但也可以是几十
Type interventi
...
data as date
...
public Intervento as interventi
public rs1 as adodb.recordset
...
Sub TheSubWithProblem(...)
...
dim Datevarie() as date
..
redim preserve etc..
DateVarie(k)=format(RS1!DataI,"dd/mm/yyyy") '<<<< correct
...
Intervento.data=lbound(datevarie) '<<<< always return 1
...
答案 0 :(得分:2)
问题是当我使用Lbound函数时,我总是返回值1而不是日期(例如“01/01/2018”)。
LBOUND
和UBOUND
函数返回数组的低层和高层边界,而不是数组中最低和最高的值。
默认情况下,VBA中的数组为base-0,因此初始化数组的LBound
通常应为0。
如果你想获得最低或最高值,那么你需要实现自己的算法(例如,for / next循环),或者如果这是一维数组我们可能{{3其中包括Sort
方法:
Set d = CreateObject("System.Collections.ArrayList")
Dim dateVarie As Variant
Dim i As Long, m As Long, day As Long
For i = 1 To 100
m = Application.WorksheetFunction.RandBetween(1, 12)
day = Application.WorksheetFunction.RandBetween(1, 30)
d.Add (DateValue(DateSerial(2018, m, day)))
Next
'Preserve your un-sorted array, if needed:
ReDim dateVarie(d.Count - 1)
dateVarie = d.ToArray()
Msgbox "The first value is: " & dateVarie(0)
d.Sort ' Sorts the arraylist:
MsgBox "The lowest value is: " & (d(0))
答案 1 :(得分:0)
数组从0开始。这就是为什么以下返回0:
Sub TestMe()
Dim datevarie(2) As Date
Debug.Print LBound(datevarie)
End Sub
无论你是否在数组中放置值都没关系。
如果您希望数组从1开始,请在VBA中写Option Base 1
并确保没有人看到代码,因为您的同事/同事可能有问题:
Option Explicit
Option Base 1
Sub TestMe()
Dim datevarie(2) As Date
Debug.Print LBound(datevarie)
End Sub