4

だから私はRAP(アドバタイズされたプログラムを実行する)を一掃するvbスクリプトを持っています。プログラムに最後の実行時間がなく、そのプログラムのフルネームが配列にある場合、この配列をメッセージボックスにエコーさせます。配列を初期化して 10 個の値を格納しますが、メッセージ ボックスをきれいに保つために、すべてのプログラムが見つかったら配列サイズを ReDim したいと思いました (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 に答える