以下は、コードから可能な限り変更されていないaposの進行状況を示す小さなテストプロジェクトです。
sInput + 1の文字列長を持つ最後の要素を除いて、最終的にaposは「1」で埋められることがわかります。
'1 form with
' 1 command button : name=Command1
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim X As Integer
Dim sInput As String
Dim apos() As Integer
Dim lngTime As Long
sInput = "Hello"
ReDim apos(1 To Len(sInput)) As Integer
Do
apos(1) = apos(1) + 1
For X = 1 To Len(sInput) - 1
If apos(X) > Len(sInput) Then
apos(X) = 1
apos(X + 1) = apos(X + 1) + 1
ShowApos apos
lngTime = GetTickCount + 100
Do Until GetTickCount > lngTime
DoEvents
Loop
End If
Next X
If apos(Len(sInput)) > Len(sInput) Then Exit Do
Loop
End Sub
Private Sub ShowApos(apos() As Integer)
Dim intIndex As Integer
Dim strShow As String
For intIndex = LBound(apos) To UBound(apos)
strShow = strShow & CStr(apos(intIndex)) & " "
Next intIndex
Caption = strShow
End Sub
つまり、len(sInput)+1までいっぱいになり、配列の他のすべての要素を1に設定するカウンターが必要です。
最後の行は、最終的な値に達したときにループから抜け出すことを確認します