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

VBA Stream Objekte zusammenführen

VBA Stream Objekte zusammenführen
23.07.2018 17:17:21
R.Wichert
Hi,
ich möchte eine XML erstellen. Diese besteht aus 2 Abschnitten ( Definition / Daten).
Jetzt habe ich eine 'For' Schleife in der ich gerne beide Abschnitte befüllen und am Ende zusammen in einer XML-Datei speichern möchte.
Mein Code:

Sub gen_030()
Dim i As Integer, Name As String, intLen As Long, TYP As String
'XML Definieren
Set FstOB = CreateObject("ADODB.Stream")
FstOB.Type = 2                'Stream-Typ: Text/String
FstOB.Charset = "utf-8"       'Zeichensatz
FstOB.Open                    'Stream öffnen
'XML Start
XMLStart FstOB 'Sub
OB_Start FstOB 'Sub
'For schleife
i = 4 ' Startziele
For i = i To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
If i > 50 Then
Exit For
End If
'Typauswahl
Select Case Cells(i, 2)
Case "PID_Regl_1500"
PID_Regl_1500 FstOB, XMLName(Cells(i, 3)), i * 10, Cells(i, 4) 'Sub
Case Else
MsgBox "Typ für " + Cells(i, 3) + "unbekannt"
End Select
Next i
OB_Ende FstOB  'Sub
'XML-ENDE
FstOB.WriteText "/Document>" + vbCrLf
FstOB.SaveToFile "C:\Mailbox\ILS705\OPN\032.xml", 2 'Datei speichern
Set FstOB = Nothing
End Sub

Meine Idee ein 2. ("ADODB.Stream")-Objekt aber wie fürhe cih die zusammen habt ihr noch eine IDEE?
Gr R.

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Stream Objekte zusammenführen
24.07.2018 10:53:21
R.Wichert
Hi,
ist die Frage zu "doof"?
Keiner eine Idee?
Danke r.
AW: VBA Stream Objekte zusammenführen
24.07.2018 12:21:42
Zwenn
Hallo,
zu doof ist Deine Frage sicher nicht. Aber Du stattest uns mit zu wenig Infos aus. Wie sehen die ganzen Subs aus, die aus Deinem Makro aufgerufen werden und was sollen sie machen?

XMLStart FstOB
OB_Start FstOB
PID_Regl_1500 FstOB, XMLName(Cells(i, 3)), i * 10, Cells(i, 4)
Darin: XMLName(Cells(i, 3))
OB_Ende FstOB
Hier mal Dein gezeigter Code, in dem ich die gröbsten Fehler behoben habe:

Option Explicit
Sub gen_030()
Dim i As Long
Dim start As Long   'Start für Schleife
'Dim Name As String 'Wird nicht verwendet
'Dim intLen As Long 'Wird nicht verwendet
'Dim TYP As String  'Wird nicht verwendet
Dim FstOB As Object 'War nicht definiert
'XML Definieren
Set FstOB = CreateObject("ADODB.Stream")
FstOB.Type = 2                'Stream-Typ: Text/String
FstOB.Charset = "utf-8"       'Zeichensatz
FstOB.Open                    'Stream öffnen
'XML Start
XMLStart FstOB 'Sub
OB_Start FstOB 'Sub
'For schleife
'i = 4 ' Startziele 'Nein! Schleifenzähler!
start = 4
'For i = i To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row 'falsch
For i = start To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
If i > 50 Then
Exit For
End If
'Typauswahl
Select Case Cells(i, 2)
Case "PID_Regl_1500"
PID_Regl_1500 FstOB, XMLName(Cells(i, 3)), i * 10, Cells(i, 4) 'Sub
Case Else
MsgBox "Typ für " + Cells(i, 3) + " unbekannt"
End Select
Next i
OB_Ende FstOB 'Sub
'XML-ENDE
FstOB.WriteText "/Document>" + vbCrLf
FstOB.SaveToFile "C:\Mailbox\ILS705\OPN\032.xml", 2 'Datei speichern
Set FstOB = Nothing
End Sub
Die Zeile:

For i = start To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row

dürfte 1 ergeben, außer Du hast in den Zeilen 1 bis 3 noch etwas drin stehen. Falls nicht, funktioniert die Schleife nicht.
Warum die Schleife maximal bis Zeile 50 laufen soll erschließt sich mir nicht. Aber falls das wirklich so sein soll, würde ich keine For Schleife nehmen, sondern eine Do ... Loop Until Schleife. Dann sparst Du Dir das If-Konstrukt zur Prüfung auf Zeile 50.
Die Verwendung von Select Case würde ich hier der Übersichtlichkeit gegen If ... Then ... Else austauschen, ausser es kommen noch weitere abzufangende Fälle hinzu. Das ist aber Geschmackssache, was Du da verwendest.
Warum verwendest Du ADODB.Stream? Wo greifst Du auf eine Datenbank zu? Was liefert die zurück?
Insgesamt kann man Deinen Code leider nicht testen. Eine Beispielmappe mit "was ich habe, was ich will" als Beispiel wäre sicher hilfreicher, als ein Codeausschnitt und 'nur' eine textliche Beschreibung.
Viele Grüße,
Zwenn
Anzeige
AW: VBA Stream Objekte zusammenführen
24.07.2018 15:13:45
R.Wichert
Hallo Zwenn,
danke für deine Gedanken.
Die Sub's schreiben nur weitere Zeile in den Stream.( .WriteText "...")
Ja es kommen noch mehrere Cases dazu.
Eine Beispieldatei:
https://www.herber.de/bbs/user/122858.xlsm
Unschön nur das 2 For-schleifen benötig werden.(außer in FC11)
Was ich will :Nur eine For- Schleife.
Danke und Gruß
AW: VBA Stream Objekte zusammenführen
24.07.2018 23:33:37
Zwenn
Hallo,
habe mich nun mit Deinem Problem beschäftigt und habe es auch gelöst. Da ich mich bisher mit diesen Streams nicht auskannte, musste ich erstmal ein paar Dinge rausfinden. Aber es ist wie immer: Wenn man erstmal weiß wie es geht, ist es plötzlich ganz einfach.
Also die Grundidee, die ich gleich hatte, als ich Deinen ganzen Code sichtete, war das Erzeugen eines zweiten Streams, in dem Du die IDB's parallel zum Rest aufbauen kannst. An der richtigen Stelle werden die beiden Streams dann zusammengeführt. Ich habe mich für die CopyTo Methode entschieden. Es ginge auch mit ReadText nehme ich an. Wie das funktioniert, habe ich im Code Kommentiert. Hat etwas gedauert, bis ich die Methode Position gefunden habe. Aber ohne die gehts nicht.
Ich habe den Code für Deine Sub gen_014() umgeschrieben. Du kannst die Änderungen aber für die anderen Subs leicht übernehmen:

Sub gen_014()
Dim i As Integer
Dim Name As String
Dim intLen As Long
Dim Anf As Integer
Dim LZeil As Integer
Dim Zelle As Range
Dim FstOB_1 As Object
Dim FstOB_2 As Object
Dim streamZwischenSpeicher As String
'XML Definieren
Set FstOB_1 = CreateObject("ADODB.Stream")
FstOB_1.Type = 2                'Stream-Typ: Text/String
FstOB_1.Charset = "utf-8"       'Zeichensatz
FstOB_1.Open                    'Stream öffnen
'Eigener Stream für IDB's
Set FstOB_2 = CreateObject("ADODB.Stream")
FstOB_2.Type = 2                'Stream-Typ: Text/String
FstOB_2.Charset = "utf-8"       'Zeichensatz
FstOB_2.Open                    'Stream öffnen
'XML Start
XMLStart FstOB_1
FC14_Start FstOB_1
LZeil = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row 'Letzte Zeile
If LZeil > 500 Then
LZeil = 1
End If
'Abbruch bei doppeltem Wert
For Each Zelle In ActiveSheet.Range(Cells(4, 3), Cells(LZeil, 3))
If Application.WorksheetFunction.CountIf(Range(Cells(4, 3), Cells(LZeil, 3)), Zelle) _
> 1 Then
'Hinweis ausgeben Aufräumen und Makro verlassen
MsgBox "Doppelter Wert vorhanden in Spalte C, Zeile " & Zelle.Row
Set FstOB_1 = Nothing
Set FstOB_2 = Nothing
Exit Sub
End If
Next Zelle
'XML parallel in zwei Streams aufbauen
For i = 4 To LZeil
Select Case Cells(i, 2)
Case "Antrieb 2DR_1200"
Antrieb2DR_1200 FstOB_1, XMLName(Cells(i, 3)), i * 10, Cells(i, 4)
'IDB's erzeugen in Stream 2
IDBAntrieb2DR_1200 FstOB_2, XMLName(Cells(i, 3)), (i + LZeil) * 10
Case Else
'Hinweis ausgeben Aufräumen und Makro verlassen
MsgBox "FC/FB Typ oder IDB Typ " + Cells(i, 2) + " für " + Cells(i, 3) + _
" in Zeile " & i & " unbekannt."
Set FstOB_1 = Nothing
Set FstOB_2 = Nothing
Exit Sub
End Select
Next i
'Den Abschlussteil in Stream 1 schreiben
FC14_Ende FstOB_1
'Streams zusammenführen
'Die Curser Position muss vor der nächsten Operation
'auf den Anfang des Streams, der kopiert werden soll
'gesetzt werden. Sonst wird nix kopiert, da die aktuelle
'Position nach dem letzten Schreiben in den Stream immer
'nach dem letzten Zeichen ist
FstOB_2.Position = 0
'Stream 2 (IDB's) in Stream 1 kopieren
'Die Methode CopyTo kopiert den angegebenen Stream ab
'der aktuelle Curser Position im zu kopierenden Stream
'in den Ziel-Stream
FstOB_2.CopyTo FstOB_1
'XML-ENDE
FstOB_1.writeText "" + vbCrLf
'Datei speichern
FstOB_1.SaveToFile "C:\Mailbox\ILS705\OPN\014.xml", 2
'Aufräumen
Set FstOB_1 = Nothing
Set FstOB_2 = Nothing
End Sub

Ich hoffe das nun auch wirklich das, was Du gesucht hast ;-)
Viele Grüße,
Zwenn
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige