所以我有一个扫描RAP(运行广告程序)的vb脚本,如果程序没有上次运行时间,但程序的全名是一个数组,那么我将这个数组回显到一个消息框。我初始化数组以存储10个值,但为了保持消息框清洁,我想在找到所有程序后重新调整数组大小(不会超过3但是谁知道客户端)。但是我似乎无法让数组调整大小,它会打印一个带有10个数组插槽的消息框+它找到的程序。
Dim vprglist(10)
Dim i
Dim strBuf
Dim intIndex
Set vprograms = oUIResource.GetAvailableApplications
i = 0
For Each vprogram In vprograms
If vprogram.LastRunTime = "" Then
vprglist(i) = vprogram.FullName
i = i + 1
End If
Next
ReDim Preserve vprglist(i)
If vprglist <> Null Then
For intIndex = LBound(vprglist) To UBound(vprglist)
strBuf = strBuf & " - " & vprglist(intIndex) & vbLf
Next
vmsgbox = MsgBox("Do you want to Install(Yes) or Defer(No) the follow software: " & vbLf & strBuf,64+4)
Select Case vmsgbox
答案 0 :(得分:7)
您无法重新标注固定大小的数组(Dim vprglist(10)
)。如果需要动态数组,请定义“普通”变量并为其指定一个空数组:
Dim vprglist : vprglist = Array()
或直接使用ReDim
定义:
ReDim vprglist(-1)
然后你可以像这样重新标注数组:
If vprogram.LastRunTime = "" Then
ReDim Preserve vprglist(UBound(vprglist)+1)
vprglist(UBound(vprglist)) = vprogram.FullName
i = i + 1
End If
但是, ReDim Preserve
会将数组的所有元素复制到一个新数组中,因此在大规模中它不会表现得太好。如果性能问题,最好使用System.Collections.ArrayList
类:
Dim vprglist : Set vprglist = CreateObject("System.Collections.ArrayList")
...
If vprogram.LastRunTime = "" Then
vprglist.Add vprogram.FullName
i = i + 1
End If