Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array-Übergabe führt zu Endlosschleife

Array-Übergabe führt zu Endlosschleife
25.08.2023 12:36:04
Shadowfoxl
Hallo zusammen,
ich durchstöbere nun schon seit 4 Tagen das Internet und habe immernoch keinen Lösungsansatz für mein Problem gefunden.

Mein Problem:
Ich lese aus einer geschlossenen Tabelle Informationen aus und schreibe sie in einen 2D-Array (Variant). Das funktioniert auch soweit. Wenn ich den Array allerdings als Ausgabe der Funktion definieren/ rein schreiben möchte, lädt Excel gefühlt endlos (nach max. 3 min hab ich abgebrochen).

Hab Folgendes mehrfach mit diversen Debug.Print Befehlen überprüft:
Die Informationen können in einen 2D Array > dem Array der Funktion geschrieben werden
Sobald der Array der Funktion übergeben wird, gerät das Programm in eine Endlosschleife (wenn ich nur den Array der Funktion ausgeben lassen möchte, wird keine Ausgabe erzeugt und Excel lädt gefühlt endlos; wenn ich vorher zusätzlich den Array mit den übergebenen Informationen ausgeben lasse, wiederholt sich die Ausgabe gefühlt endlos; wenn ich nur den Array mit den übergebenen Informationen ausgeben lasse, klappt alles Einwandfrei)

Ziel ist:
Ich möchte den Array in einer anderen Funktion aufrufen können um die Informationen darin mit den an die Funktion übergebenen Funktionen zu vergleichen.
Der Pseudocode sieht folgender Maßen aus:



'Funktion die die Tabelle ausließt und in den Array schreibt
Public Function GetInformationen() as Variant

InfoPfad="C:\Test\...\"
InfoName="Excel1.xlsx"
InfoBlatt="Tabelle1"

Dim InformationenArray as Variant
ReDim InformationenArray(2 To 50, 1 To 7)
For x=2 To 50
Zeile="R"&x
For y=1 To 7
Spalte="C"&y
InformationenArray(x,y)=ExecuteExcel4Makro("'" & InfoPfad & "[" & InfoName & "]" & InfoBlatt & "'!" & Zeile & Spalte)
Next
Next

'mit dem folgenden Befehl läut es in eine Endlosschleife
GetInformationen=InformationenArray

End Function


Ich habe schon versucht die Informationen der Tabelle direkt in die Funktionsausgabe laden zu lassen, den GetInformationen Array genauer/ neu zu definieren, GetInformationen(x,y)=InformationenArray(x,y) so und mit For-Schleifen zu beschreiben und vieles mehr. Auch der Versuch den Array mit den übergebenen Informationen in der 2. Funktion direkt aufzurufen ist mir nicht gelungen.

In der folgenden Funktion möchte ich den Array folgender Maßen aufrufen:



Function Vergleich(Kommentar)
'...
Dim KommentarVergleich As Variant
KommentarVergleich=GetInformationen()
...
End Function


Da ich diese Funktion aus einem Excel Sheet heraus aufrufen und dabei die Informationen aus einer anderen Zelle übertragen möchte, scheint mir die Option mit ByVal nicht möglich zu sein. Lasse mich hier aber auch gerne korrigieren.

Hoffe ihr könnt mir weiterhelfen.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 13:25:47
Rudi Maintaire
Hallo,
warum holst du dir die Daten nicht einfach per Formel oder Power Query in ein (ausgeblendetes) Blatt?

Davon ab funktioniert der Code, wenn man alle Fehler beseitigt, ohne Endlosschleife.

Public Function GetInformationen() As Variant

Dim InformationenArray(1 To 50, 1 To 7) As Variant, x, y

Const InfoPfad = "'C:\Test\"
Const InfoName = "[Excel1.xlsx]"
Const InfoBlatt = "Tabelle1'!"

For x = 1 To 50
For y = 1 To 7
InformationenArray(x, y) = _
ExecuteExcel4Macro(InfoPfad & InfoName & InfoBlatt & Cells(x + 1, y).Address(, , xlR1C1))
Next
Next

GetInformationen = InformationenArray

End Function

Sub aaa()
Dim x
x = GetInformationen()
End Sub

Gruß
Rudi
Anzeige
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 14:03:32
Shadowfoxl
Danke für deinen Vorschlag.
Power Query kenne ich nicht und das Ganze auf ein anderes Blatt zu kopieren klingt für mich nach einem unnötigen Schritt den ich gerne vermeiden möchte. Die Zuweisung zum Array InformationenArray funktioniert ja auch so.
Ansonsten sehe ich keine relevanten Änderungen zu meinem Code.
Die 2. Funktion muss auch eine Funktion bleiben, da sie einen Wert zurück geben muss.
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 14:46:44
Rudi Maintaire
das Ganze auf ein anderes Blatt zu kopieren klingt für mich nach einem unnötigen Schritt
wer spricht von kopieren?
Einfach auf einem anderen Blatt
=c:\test\[excel1.xlsx]Tabelle1'!A1
und nach rechts und unten kopieren. Das Blatt kannst du ausblenden und von dort das Array füllen.
DasArray=AugeblendeteTabelle.Range("A1:G50").Value

Gruß
Rudi
Anzeige
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 13:30:56
Matthias
Moin!
Also ich habe es mal getestet. Bei ExecuteExcel4Makro habe ich das k in ein c umgewandelt. Da hat es geklappt.
Lass sonst mal deinen Pfad im Direktbereich ausgeben und schaue, ob das Sinn macht.
Debug.Print "'" & InfoPfad & "[" & InfoName & "]" & InfoBlatt & "'!" & Zeile & Spalte
Kann ja sein, dass dort ein Fehler existiert - falsche Name, Blatt etc.

VG
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 14:54:08
Oberschlumpf
Hi,

nur mal ne Gegenfrage:

Wieso versuchst du es nicht so:

1. Datei "C:\Test\...\Excel1.xlsx" per VBA-Code im Hintergrund öffnen
2. Alle gewünschten Infos, ergeben sich aus For x... und For y..., aus Blatt "Tabelle1" auslesen UND gleich sofort dort speichern, wo sie hinsollen
3. Datei "C:\Test\...\Excel1.xlsx" per VBA-Code wieder schließen...ohne zu speichern

So könntest du die ganz einfachen Befehl Range("ZielZelle").Value = Range("QuellZelle").Value und sonstigen, einfachen Befehle verwenden, und musst nicht so was wie in GetInformationen "zaubern"

Oder was genau hab ich nicht verstanden, weshalb meine Idee nicht hilfreich ist?

Ciao
Thorsten
Anzeige
Array-Übergabe führt zu Endlosschleife
25.08.2023 15:36:54
Shadowfoxl
@Oberschlumpf
Mein Ansatz ist die Informationen aus dem Datenblatt in dem Array zu speichern und dann mit Daten aus einem anderen Datenblatt zu vergleichen. Wenn Daten davon identisch sind -> "ok", wenn nicht ->"nok" ausgeben.
Aber du hast mich auf einen Gedanken gebracht: Warum die Daten erst in einem Array speichern und nicht gleich mit dem anderen Datenblatt vergleichen?

Im Prinzip bräuchte ich dann sowas:


extrahiere Daten aus Tabelle1
Vergleiche Daten mit Informationen aus Tabelle2 (würde mit For-Schleife die einzelnen Zellen addressieren)
Wenn Daten=Informationen
"ok"
Sonst
"nok"


Ich würde dabei die Tabelle mit den Informationen aber gerne geschlossen halten. Fände es blöd die jedes mal auf machen zu müssen. Sollte denke ich aber mit ExecuteExcel4Macro funktionieren...
Ich mach mich mal dran und schau was bei rum kommt ;)
Anzeige
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 15:46:16
Oberschlumpf
Hi,

viel Erfolg.
Mit Application.ScreenUpdating = False / True könntest du das Flackern vermeiden, welches bei Öffnen/Schließen von Dateien passieren kann.

Ciao
Thorsten
Array-Übergabe führt zu Endlosschleife
25.08.2023 15:53:51
daniel
Hi
wenn du Daten aus Zellen aus geschlossenen Dateien benötigst und die Datei nicht öffnen willst, dann geht das am einfachsten über Formeln in einem Tabellenblatt
wenn es ein zusammenhängender Bereich ist, dann kannst du die Formeln auch in einem Rutsch in das Tabellenblatt eintragen, das vermeidet u.A. das Flackern, insbesondere dann, wenn dieses Tabellenblatt nicht aktiv ist.
Ist vielleicht nicht elegant, aber viel einfacher.
Beispiele dafür wurden dir schon genannt.
Gruß Daniel
Anzeige
Array-Übergabe führt zu Endlosschleife
25.08.2023 15:18:55
daniel
HI
ich würde mir die Auswertung als Formel in ein extra Tabellenblatt schreiben (dann kannst du auch die parallelen Zelladressen verwenden:

InfoPfad="C:\Test\...\"

InfoName="Excel1.xlsx"
InfoBlatt="Tabelle1"
Sheets("Ausgabe").Range("A2:G50") .FormulaR1C1 = "='" & InfoPfad & "[" & InfoName & "]" & InfoBlatt & "'!RC"

von dort kannst du sie dann beliebig weiter verarbeiten.
Gruß Daniel
Array-Übergabe führt zu Endlosschleife
25.08.2023 15:36:56
snb
Sub M_snb()

with getobject("G:\OF\Beispiel.xlsb")
with .sheets(1).usedrange
sheets(1).cells(1).resize(.rows.count,.columns.count)=.value
end with
.close 0
End With
End Sub
Anzeige
Array-Übergabe führt zu Endlosschleife
30.08.2023 10:14:24
Shadowfoxl
So, neuer Zwischenstand:
Hab die Funktion überarbeitet und nochmal versucht mir mit Internetrecherche selbst zu helfen. Wie ihr euch denken könnt vergeblich.
Mein Code sieht inzwischen so aus:


Public Function GetInformationen(Comment)

InfoPfad="C:\Test\...\"
InfoName="Excel1.xlsx"
InfoBlatt="Tabelle1"
c=0

For x=2 To 50
Zeile="R"& x
For y=1 To 7
Spalte="C"& y
If Comment=ExecuteExcel4Macro("'" & InfoPfad & "[" & InfoName & "]" & InfoBlatt & "'!" & Zeile & Spalte) Then
c=c+1
Else
c=c+0
End If
Next
Next

If c=0 Then
Ergebnis="Nicht gefunden. nok"
ElseIf c=1 Then
Ergebnis="Gefunden. ok"
ElseIf c>1 Then
Ergebnis="Mehrere gefunden. nok"
End If

GetInformationen = Ergebnis

End Function

Wenn ich diese Funktion in einem Sub wie folgt aufrufe


Sub test()
Debug.Print GetInformationen("Info")
End Sub

bekomme ich auch ein korrektes Ergebnis.
Möchte ich die Funktion aber in einem Tabellenblatt aufrufen, bricht die Funktion bei der If-Schleife


...
If Comment=ExecuteExcel4Macro("'" & InfoPfad & "[" & InfoName & "]" & InfoBlatt & "'!" & Zeile & Spalte) Then
...

ab und ich bekomme nur die Rückmeldung #Wert. Ich hatte auch schon alle Variablen vorblidlich deklariert, leider ohne Erfolg. Deswegen hier die kürzere Variante.

Weiß jemand von euch woran das liegen könnte und wie ich das beheben kann?
Wie bereits gesagt möchte ich das stumpfe kopieren der Daten in das File in dem ich die Funktion aufrufe möglichst vermeiden. Ein erster Versuch das darüber zu lösen ist nämlich auch schon gescheitert.

Ziel ist es diese Funktion in einer anderen aufzurufen und das Ergebnis zusammen mit Ergebnissen aus anderen Funktionen als String auszugeben.
Anzeige
AW: Array-Übergabe führt zu Endlosschleife
25.08.2023 14:07:56
Shadowfoxl
Hallo Mathias, danke für den Hinweis.
Im eigentlichen Code stimmt das mit dem ExecuteExcel4Macro. Bin neu hier und weiß daher leider nicht wie ich das in der Originalnachricht anpassen kann.
Der Pfad stimmt auch. Auch wenn ich mir den InformationenArray (einzelne Zellen davon) ausgeben lasse stimmen alle mit der Tabelle überein.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige