Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1332to1336
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

dynamische Arrayerstellung als Public Array

dynamische Arrayerstellung als Public Array
16.10.2013 13:21:13
Kapitän
Hallo Forum!
ich hoffe Ihr könnt mir ein weiteres Mal helfen.Ich habe ein VBA-Makro, dass Messwerte aus mehreren csv liest, diese in einem Array sammelt und dann auf einem Tabellenblatt ausgibt.
Nun möchte ich parallel, dass dieses Array, was bei jedem durchlaufen der Schleife entsteht als Public-Array gespeichert wird.
Weil die Anzahl der csv Dateien sehr unterschiedlich ist, wäre es schön, wenn jeweils ein Array mit neuem Namen entstehen würde, z.B. array1, array2,.. u.s.w.
Das ist mir leider nicht gelungen, weil (imho) Arrays in VBA sehr statisch sind (vielleicht auch nicht und ich weiß nur zu wenig;) )
Weitere Idee wäre ein Public Array zu machen, dass die Daten des Array, welches bei jedem Durchlauf entsteht nebeneinander schreibt. Allerdings befürchte ich Dimensionsprobleme: Zum einen sind die Arrays unterschiedlich lang, zum anderen weiß ich nicht wie groß Arrays werden dürfen. Zum Anderen möchte ich die entstehenden Public-Arrays in anderen Subs benutzen und die Übersicht geht im QC verloren.
Hier mein Sub:
Sub Import_testdata_v1()
Dim Arr
Dim Datei
Dim FSO
Dim Tmp As Variant
Dim vnt_Ausgabe As Variant
Dim path_data As Variant
Dim i, k, l, w As Integer
Dim Str_String As String
Dim z_max
Dim Dat_Strlin As Variant
path_wb = ThisWorkbook.Path
path_data = Dir("C:\Users\test*.csv")
'MsgBox path_wb
Do While path_data  ""
i = i + 1
k = 1
For i = 1 To anzStrlin
Set FSO = CreateObject("Scripting.FilesystemObject")
path_i = path_wb & "\test_ & i & ".csv"
'        MsgBox path_i
Set Datei = FSO.Opentextfile(path_i) 'Anpassen
Str_String = Datei.readall
Datei.Close
intFile = FreeFile
Arr = Split(Str_String, vbCrLf) 'Nach Datensätzen splitten
ReDim Dat_Ausgabe(UBound(Arr), 5)
For l = 0 To UBound(Arr)
Tmp = Split(Arr(l), ",") 'Datensatz nach Werten splittenn
For w = 0 To UBound(Tmp)
Tmp(w) = Replace(Tmp(w), """", "")
Dat_Ausgabe(l, w) = Tmp(w) 'Werte in Dat_Ausgabe
Next
Next
'Ausgeben
'In Tabelle
Sheets("Input_test").Cells(3, k).Resize(UBound(Dat_Ausgabe) + 1, UBound(Dat_Ausgabe, 2)) _
= Dat_Ausgabe
k = k + 6
Next
path_data = Dir
Loop
End Sub

Entschuldigt den langen und hoffentlich nicht zu umständlichen post. Weiß jemand weiter oder hat Anregungen?
Beste Grüße
Kapitän

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

Betreff
Datum
Anwender
Anzeige
AW: dynamische Arrayerstellung als Public Array
16.10.2013 13:41:48
Bastian
Hallo Kapitän,
Du hast ein ziemliches Kuddelmuddel in Deinen Variablen.
Foldende Variablen sind nicht deklariert:
path_wb, path_i, anzStrlin, intFile
Andere Variablen sind zwar deklariert, kommen aber im Code nicht vor.
Tipp: Schreib über Deinen Code mal "OptionExplicit".
Schau Dir mal folgenden Link an zu dem Thema:
http://www.online-excel.de/excel/singsel_vba.php?f=4
Gruß, Bastian

AW: dynamische Arrayerstellung als Public Array
16.10.2013 13:52:14
Raphael
Hallo Kapitän,
ich denke was du möchtest ist in diesem Sinne nicht möglich (ich bin mir aber nicht sicher).
Wenn allerdings die Anzahl der Messwerte ein Maximum hat oder die Anzahl der csv Dateien, dann kannst du es in ein 2D Array schreiben.
Public arrTest(299, 99) as .....
Zu einem Speicherproblem sollte das nicht führen Typ Variant Zahlen = 16 Bytes
16 x 300 x 100 / 1'000'000 = 0,48 MB RAM
Hoffe du kannst was damit anfangen.
Gruess
Raphael

Anzeige
AW: dynamische Arrayerstellung als Public Array
16.10.2013 14:51:20
Rudi
Hallo,
man kann auch Arrays in Arrays speichern, z.B. mehrere unterschiedlich lange 2-dimensionale in einem eindimensionalen.
Ich würde aber ein Dictionary- oder Collection-Objekt bevorzugen.
Option Explicit
Public objArr As Object
Sub Import_testdata_v1()
Dim Arr
Dim objTS As Object
Dim objFS As Object, objFile As Object
Dim Tmp As Variant
Dim vnt_Ausgabe As Variant
Dim path_data As Variant
Dim i As Integer, l As Integer, w As Integer
Dim Str_String As String
Dim anzStrlin As Long
Dim path_i
Dim dat_Ausgabe()
Dim path_wb As String
Set objArr = CreateObject("Scripting.dictionary")
Set objFS = CreateObject("Scripting.FilesystemObject")
path_wb = ThisWorkbook.Path
path_data = Dir("C:\Users\test_*.csv")
Do While path_data  ""
For i = 1 To anzStrlin
path_i = path_wb & "\test_" & i & ".csv"
Set objFile = objFS.GetFile(path_i)
Set objTS = objFile.OpenAsTextStream 'Anpassen
Str_String = objTS.ReadAll
Arr = Split(Str_String, vbCrLf) 'Nach Datensätzen splitten
ReDim dat_Ausgabe(UBound(Arr), 5)
For l = 0 To UBound(Arr)
Tmp = Split(Arr(l), ",") 'Datensatz nach Werten splitten
For w = 0 To UBound(Tmp)
Tmp(w) = Replace(Tmp(w), """", "")
dat_Ausgabe(l, w) = Tmp(w) 'Werte in Dat_Ausgabe
Next w
Next l
'Ausgabe in Dictionary
objArr(i) = dat_Ausgabe
Next
path_data = Dir
Loop
End Sub

Gruß
Rudi

Anzeige
AW: dynamische Arrayerstellung als Public Array
17.10.2013 10:31:25
Kapitän
Vielen Dank für eure Anmerkungen und Hinweise. Option Explicit scheint eine sinnige Sache zu sein um Fehler zu vermeiden und den Code übersichtlich zu halten.(Habe recht viel darin rumgespielt und vergessen aufzuräumen). Ich Versuche mich mal an dem Vorschlag von Rudi Maintaire(sehr sehr cooler Name :) Meine Lösung dann später!
Ciau
Kapitän

AW: dynamische Arrayerstellung als Public Array
17.10.2013 11:44:11
Kapitän
Zur Lösung braucht es noch ein bisschen;) Habe jetzt den QC von Rudi übernommen. Aber so richtig verstehe ich das Object noch nicht. Sind in diesem jetzt in den einzelnen Items meine kompletten Arrays? Ich kann mir diese im Überwachungsmodus nicht genau ansehen. Wie kann ich mir den Inhalt jeweils eines Items in einem anderen Sub wieder in ein Array schreiben? Und wenn das geht: Woher bekomme ich die Information welche Dimension das jeweilige Item hat, um mein Array vorher dimensionieren zu können?
Viele Grüße+ vielen Dank
Kapitän

Anzeige
AW: dynamische Arrayerstellung als Public Array
17.10.2013 12:27:03
Kapitän
Hallo Mitleser!
habe hier nochmal einen QC, der hoffentlich deutlich macht, was ich vor habe. Vielleicht wird _ auch deutlich was ich am Objekt noch nicht verstanden habe. Die Zeile

Array_test(i, j) = objArr(1).Value(i, j)
ist Murks, aber vielleicht versteht Ihr was ich vor habe und habt weitere Ideen.
Option Explicit
Sub testen()
Dim i As Integer
Dim j As Integer
Dim Array_test As Variant
For i = 0 To UBound(objArr(1))
For j = 0 To 4
Array_test(i, j) = objArr(1).Value(i, j) 'hier soll das erste Array im Objekt in das  _
Array_test geschrieben werden
Next j
Next i
End Sub
Gruß
Kapitän

Anzeige
AW: dynamische Arrayerstellung als Public Array
17.10.2013 12:31:50
Kapitän
..vergessen das Kontrollkästchen zu aktivieren:)

AW: dynamische Arrayerstellung als Public Array
17.10.2013 12:27:35
Kapitän
Hallo Mitleser!
habe hier nochmal einen QC, der hoffentlich deutlich macht, was ich vor habe. Vielleicht wird _ auch deutlich was ich am Objekt noch nicht verstanden habe. Die Zeile

Array_test(i, j) = objArr(1).Value(i, j)
ist Murks, aber vielleicht versteht Ihr was ich vor habe und habt weitere Ideen.
Option Explicit
Sub testen()
Dim i As Integer
Dim j As Integer
Dim Array_test As Variant
For i = 0 To UBound(objArr(1))
For j = 0 To 4
Array_test(i, j) = objArr(1).Value(i, j) 'hier soll das erste Array im Objekt in das  _
Array_test geschrieben werden
Next j
Next i
End Sub
Gruß
Kapitän

Anzeige
AW: dynamische Arrayerstellung als Public Array
17.10.2013 12:50:40
Kapitän
Hallo! Ich hab es jetzt gelöst. Manchmal sind die Dinge leichter als man denkt. Es reicht mir so:
Option Explicit
Public Array_SL As Variant
Sub Import_Streamlines_v1()
Dim Arr
Dim objTS As Object
Dim objFS As Object
Dim objFile As Object
Dim Tmp As Variant
Dim Dat_Ausgabe As Variant
Dim path_data As Variant
Dim path_i As String
Dim path_wb As String
Dim Str_String As String
Dim i, k, l, w As Integer
Dim intFile As Variant
Set objArr = CreateObject("Scripting.dictionary")
Set objFS = CreateObject("Scripting.FilesystemObject")
path_wb = ThisWorkbook.Path
path_data = Dir("C:\Users\Tristan\Documents\HiWi\Laufradauslegung\Flutlinien\stromlinie*. _
csv")
'MsgBox path_wb
Do While path_data  ""
i = i + 1
k = 1
For i = 1 To anzStrlin
path_i = path_wb & "\Flutlinien\stromlinie_" & i & ".csv"
'        MsgBox path_i
Set objFile = objFS.Getfile(path_i) 'Anpassen
Set objTS = objFile.OpenAsTextStream
Str_String = objTS.readall
Arr = Split(Str_String, vbCrLf) 'Nach Datensätzen splitten
ReDim Dat_Ausgabe(UBound(Arr), 5)
For l = 0 To UBound(Arr)
Tmp = Split(Arr(l), ",") 'Datensatz nach Werten splittenn
For w = 0 To UBound(Tmp)
Tmp(w) = Replace(Tmp(w), """", "")
Dat_Ausgabe(l, w) = Tmp(w) 'Werte in Dat_Ausgabe
Next w
Next l
'Ausgeben
'In Tabelle
Sheets("Input_Flutlinien").Cells(3, k).Resize(UBound(Dat_Ausgabe) + 1, UBound( _
Dat_Ausgabe, 2)) = Dat_Ausgabe
'Ausgabe in Dictionary
ReDim Preserve Array_SL(anzStrlin)
Array_SL(i) = Dat_Ausgabe
k = k + 6
Next
path_data = Dir
Loop
End Sub
Die offenen Fragen zu den Objekten würden mich jedoch trotzdem interessieren. Danke für Eure Mithilfe! Bis bald;)
Kapitän

Anzeige
ziemlich grenzwertig
17.10.2013 13:26:21
Rudi
Ahoi,
was soll denn das:
    path_data = Dir("C:\Users\Tristan\Documents\HiWi\Laufradauslegung\Flutlinien\stromlinie*. _
csv")
'MsgBox path_wb
Do While path_data  ""

wenn du hier
path_i = path_wb & "\Flutlinien\stromlinie_" & i & ".csv"

einen Dateinamen zusammenbaust?
Der erste Teil ist dann vollkommen überflüssig.
Gruß
Rudi

AW: dynamische Arrayerstellung als Public Array
17.10.2013 12:52:02
Rudi
Hallo,
Sind in diesem jetzt in den einzelnen Items meine kompletten Arrays?
genau.
Ich kann mir diese im Überwachungsmodus nicht genau ansehen.
Lies mal am Ende des Codes die Items aus: ArrItems=objArr.Items
Dann kannst du dir arrItems im Direktfenster anschauen.
Genauso kannst du in jeder anderen Sub das Dictionary auslesen.
Gruß
Rudi

Anzeige
AW: dynamische Arrayerstellung als Public Array
17.10.2013 15:44:17
Kapitän
Ach herrlich! Das bringt ja völlig neue Möglichkeiten! Danke für die Hilfe und Erleuterungen!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige