Array gibt falschen Eintrag zurück...!

Hallo erstmal,

ich habe folgendes Problem:

in einem Array mit n Einträgen stehen sämtliche Dateinamen zum
ausführen. Diese Einträge lass ich mit Hilfe einer FOR…NEXT
Schleife nacheinander ausführen mit Hilfe des Shell-Befehls.

Hier der Source:

’ obig beschriebene Schleife
Private Sub Install(ByRef saArray() As String)

For i = 0 to(UBound(saArray) - LBound(saArray))
ShellWait(saArray(i), vbNormalFocus)
Next

End Sub

'######################################################################
’ führt Shell-Befehl aus + Maximized
Public Function ShellWait(Exec As String, _
Optional WindowStyle As VbAppWinStyle = vbMinimizedFocus) _
As Long

Dim nTaskId As Long
Dim nHProcess As Long
Dim nExitCode As Long

nTaskId = Shell(Exec, WindowStyle)
nHProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, nTaskId)
Do
DoEvents
GetExitCodeProcess nHProcess, nExitCode
Loop While nExitCode = STILL_ACTIVE
CloseHandle nHProcess
ShellWait = nExitCode
End Function

‚######################################################################‘### API für ShellAndWait
'######################################################################'Für CD-Open
'Deklaration: Globale API-Funktionen
Public Declare Function mciExecute Lib „winmm.dll“ (ByVal _
lpstrCommand As String) As Long

’ API’s für ShellAndWait
Private Declare Function OpenProcess Lib „kernel32“ _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib „kernel32“ _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib „kernel32“ _
(ByVal hObject As Long) As Long

’ Konstande
Private Const STILL_ACTIVE = &H103
Private Const STATUS_PENDING = &H103&
Private Const PROCESS_QUERY_INFORMATION = &H400

Const SWP_HIDEWINDOW = &H80
Const SWP_SHOWWINDOW = &H40
'######################################################################

seltsamerweise überspringt er ab Array-Index 2 den eigentlichen Inhalt
von diesem Array, z.B. habe ich in der Liste(Array) 7 Einträge:

Hallo(0)
Bis(1)
später(2)
du(3)
schönes(4)
Kind(5)
chen(6)

Wenn er jetzt die Schleife durchläuft dann bringt er mir für den ersten
Array-Index auch den Eintrag = „Hallo“!!
Beim Eintrag mit dem Index(1) bringt er mir „Bis“. Soweit sogut.
Aber dann bringt er mir für den Index = 2 nicht denn Eintrag=„später“
sondern „du“ (also Index 3).
Danach überspringt er mir immer einen Eintrag, also:

Index 3:
Statt „du“ „Kind“(5)

Index 4:
Statt „schönes“ „chen“(6)

Das schleppt sich dann immer weiter so durch bis er am schluß dann eine
FehlerMeldung bringt, das die Array-Liste außerhalb des gültigen
Index-Bereichs ist…
Statt in dem Fall 7 Einträge sind es tatsächlich nur 4 Einträge
(index/2+1) die durchlaufen werden.
Obwohl er durch Ubound-Lbound den Wert 6 erhält (0-6=7) Endet das Array
plötzlich bei 4 (weil er dort keine Einträge mehr findet, da er ja
immer einen eintrag überspringt - siehe oben…).

Jetzt meine Frage:

Woran liegt es das der Computer immer einen Eintrag überspringt und
nicht den Richtigen Wert aus dem Array ausliest??

Hat es vielleicht was mit ShellWait bzw. Shell zutun??

HILFE…
ich werd sonst noch Irre mit diesem Fehler…

Mit freundlichen Grüssen

Mike Quagliara

Hallo erstmal,

Hallo

ich habe folgendes Problem:

in einem Array mit n Einträgen stehen sämtliche Dateinamen zum
ausführen. Diese Einträge lass ich mit Hilfe einer FOR…NEXT
Schleife nacheinander ausführen mit Hilfe des Shell-Befehls.

Hier der Source:

’ obig beschriebene Schleife
Private Sub Install(ByRef saArray() As String)

For i = 0 to(UBound(saArray) - LBound(saArray))
ShellWait(saArray(i), vbNormalFocus)
Next

End Sub

Hast du die Variable i initialisiert?
Wieso übergibst du das array als Byref?
Warum so umstaendlich?

private Sub Install Byval saArray() as string)
on error resume next
dim i as integer 
 for i=lbound(saarray) to ubound(saarray)
 ShellWait(saarray(i), vbNormalFocus)
 next i
end sub

getestet ist dies net aber sollte functionieren :smile:
Achte nur darauf das du jedes feld in dem Array gefuellt ist :smile:

MFG Alex

Private Sub Install(ByRef saArray() As String)

For i = 0 to(UBound(saArray) - LBound(saArray))
ShellWait(saArray(i), vbNormalFocus)
Next

End Sub

Hallo Mike!
Hast Du das selber geschrieben?
Das mit der nichtinitialisierten Variablen i ist relativ unwichtig. Bei „Option Explizit“ wird das initialisieren der Variablen automatisch angefordert.
Ein größerer fehler ist der:
Du übergibts einen Text in das Sub mit „By Ref“, „As String“.
ByRef istKäse, wurde schon gesagt. „As String“ bedeutet „As String“ und nicht „As Datenfeld“. Hinterher versuchst Du nämlich den String als Datenfeld zu verwenden. Es nutzt nichts, die richtige Adresse mit „ByRef“ zu übergeben, das Datenformat wird nicht automatisch erkannt.
Ich würde lieber das Datenfeld als „Public“ Variable einstellen und dann später nicht übergeben, sondern einfach verwenden.
Dann gibts noch einen weiteren schweren Fehler:
In der Schleife möchtest Du das Array beginnend mit dem Index 0 ansprechen.
Du gehst jedoch im folgendem davon aus, das das Arry unter Umständen nicht mit 0 beginnt: „- LBound(saArray))“.
Was soll der Unsinn?
Versuch doch lieber mal, die Hilfe zu lesen, und wenn dann eine bestimmte Methode ausprobiert werden soll, dann mach es mit überprüfbaren Parametern und im Einzelschritt, dann kann sicher nichts mehr schief gehen.
Viel Erfolg