4

所以我有一个扫描 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
4

1 回答 1

10

您不能重新确定固定大小数组 ( 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
于 2013-07-15T21:50:55.477 回答