Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1628to1632
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
Prozedur zu groß
21.06.2018 11:50:31
Thorsten
Hallo,
ich habe eine zu groß geratene VBA-Prozedur (also Code der größer als 64 KB ist).
Grundsätzlich ist das vermutlich nicht problematisch. Allerdings ist die Aufgabe recht komplex. Es müssen aus verschiedenen Word-Dokumenten klar definierte Inhaltssteuerlemente identifizieren und ausgelesen werden. Dafür wird Word nicht wirklich geöffnet, bzw. unmittelbar nach dem Auslesevorgang wieder geschlossen (Die Inhaltssteuerelemente sind immer in 10er-Schritten einzeln benannt - also z.B. SE1, SE2,SE3 etc... insgesamt werden in jedem Dokument 6 x 60 Elemente ausgelesen). Das alles funktioniert bis zu einer gewissen Größe (6 x40) auch tadellos. Nun sind allerdings ein paar Inhaltssteuerelemente hinzugekommen (eben 6x60) und ich habe das Problem mit der zu großen Prozedur..Prozedur teilen funktioniert aber nicht, da es vor lauter For/If befehlen am Anfang und am Ende nur so wimmelt. Ich habe in diesem Forum auch schon gefragt, ob der Einbau von Schleifen möglich ist. Trotz guter Vorschläge hat das leider nicht funktioniert.
Meine Frage: Wo muss ich die Prozedur teilen? Welche For/if-Befehle muss ich zwischendurch evt. beenden und neu aufrufen?
Ich kopiere hier mal den (wesentlichen) Code rein, da die Datei für ein Upload zu groß ist.
 _
Sub btnImportForms1()
On Error Resume Next
Dim ws As Worksheet, lo As ListObject, objWord As Object, doc As Object, cXML As  _
CustomXMLPart, myXMLPart As CustomXMLPart, dlg As FileDialog
'Tabelle im Dokument referenzieren
Set ws = Worksheets(1)
'List-Object Tabelle mit Namen referenzieren
Set lo = ws.ListObjects("MeineDatenTabelle")
'Word Objekt erzeugen
Set objWord = CreateObject("Word.Application")
objWord.Visible = False
objWord.DisplayAlerts = False
'Dateiauswahl-Dialog erstellen
Set dlg = Application.FileDialog(msoFileDialogFilePicker)
With dlg
'Einstellungen für den Dialog setzen
.AllowMultiSelect = True
.Title = "Bitte markieren sie ein oder mehere Formulare deren Daten importiert werden    _
_
_
sollen"
.Filters.Add "Word Dateien", "*.docx; *.docm", 1
.FilterIndex = 1
' Wenn der Dialog mit OK geschlossen wurde mache weiter
If .Show = -1 Then
' Für jedes Dokument das im Dialog ausgewählt wurde ..
For i = 1 To .SelectedItems.Count
'Öffne das Dokument
Set doc = objWord.Documents.Open(.SelectedItems(i))
' Suche das CustomXML im Dokument
For Each cXML In doc.CustomXMLParts
If cXML.BuiltIn = False Then
Set rootNode = cXML.SelectSingleNode("root")
If Not rootNode Is Nothing Then
Set myXMLPart = cXML
Exit For
End If
End If
Next
'Wenn der CustomXML-Part gefunden wurde ...
If Not myXMLPart Is Nothing Then
'Formularfelder zu Variablen zuordnen
strHPZielNr = myXMLPart.SelectSingleNode("/root/HPZielNr").Text
strpkHilfe = myXMLPart.SelectSingleNode("/root/pkHilfe").Text
strDatum = myXMLPart.SelectSingleNode("/root/Datum").Text
strKi0 = myXMLPart.SelectSingleNode("/root/Ki0").Text
strKi1 = myXMLPart.SelectSingleNode("/root/Ki1").Text
etc..
AB JETZT FOLGEN ZWEI MAL 360 ZEILEN ZUM AUSLESEN BZW. ZUM ÜBERTRAGEN DER ERGEBNISSE
DAS ENDE SCHAUT DANN FOLGENDERMASSEN AUS:
lo.ListRows(lo.ListRows.Count).Range(1, 45).Value = strSD8f
lo.ListRows(lo.ListRows.Count).Range(1, 46).Value = strSD9f
lo.ListRows(lo.ListRows.Count).Range(1, 47).Value = strSD10f
End If
'Dokument schließen
doc.Close False
Next
End If
End With
'Word schließen
objWord.DisplayAlerts = False
objWord.Quit
Set objWord = Nothing
End Sub

Tja, vielleicht hat ja jemand eine Idee. Wie kriege ich diese Monster-Prozedur geteilt?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prozedur zu groß
21.06.2018 12:13:08
PeterK
Hallo
Schick mal die gesamte Procedur als TextDatei
Schleifen und Arrays ...
21.06.2018 13:00:46
Rudi
.... sollten helfen.
z.B.
Dim strKi(0 to 9)
For x= 0 to 9
strKi(x) = myXMLPart.SelectSingleNode("/root/Ki" & x).Text
'evtl weitere Arrays füllen
Next x
Gruß
Rudi
AW: Schleifen und Arrays ...
21.06.2018 13:55:09
mmat
Aufteilen ist nicht nötig.
Im einfachsten Fall versuche Text einzusparen.
Es macht keinen Sinn "lo.ListRows(lo.ListRows.Count)" 720 mal zu wiederholen, dafür gibt's with:
with lo.ListRows(lo.ListRows.Count)
.Range(1, 45).Value = strSD8f
.Range(1, 46).Value = strSD9f
.Range(1, 47).Value = strSD10f
end with

Anzeige
AW: Schleifen und Arrays ...
21.06.2018 15:26:50
Thorsten
Hallo mmat,
"With/end with" klingt interessant. WIe genau mache ich es? Ich schicke mal einen ganzen 10er-Block als Beispiel: ...vielleicht könntest Du mir sagen, wie ich den "eingedampft kriege?
lo.ListRows.Add
lo.ListRows(lo.ListRows.Count).Range(1, 4).Value = strKi0
lo.ListRows(lo.ListRows.Count).Range(1, 5).Value = strKi1
lo.ListRows(lo.ListRows.Count).Range(1, 6).Value = strKi2
lo.ListRows(lo.ListRows.Count).Range(1, 7).Value = strKi3
lo.ListRows(lo.ListRows.Count).Range(1, 8).Value = strKi4
lo.ListRows(lo.ListRows.Count).Range(1, 9).Value = strKi5
lo.ListRows(lo.ListRows.Count).Range(1, 10).Value = strKi6
lo.ListRows(lo.ListRows.Count).Range(1, 11).Value = strKi7
lo.ListRows(lo.ListRows.Count).Range(1, 12).Value = strKi8
lo.ListRows(lo.ListRows.Count).Range(1, 13).Value = strKi9
lo.ListRows(lo.ListRows.Count).Range(1, 14).Value = strKi10
Anzeige
AW: Schleifen und Arrays ...
21.06.2018 15:39:15
Thorsten
Ich nochmal...hab ein bisschen auf der Leitung gestanden. Du hast es ja
schon deutlich gemacht in der ersten Antwort. Ich probier es mal aus :-)
AW: Schleifen und Arrays ...
21.06.2018 16:08:02
Thorsten
Hurra!
Mit With/End hat es geklappt!
Vielen Dank euch allen nochmal!!
AW: Schleifen und Arrays ...
21.06.2018 16:35:00
Hajo_Zi
warum Offen?

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
AW: Schleifen und Arrays ...
21.06.2018 16:36:24
Hajo_Zi
warum Offen?

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.

122 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige