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

Variablen, Objekt, Prozedur zu groß, Verweisfehler

Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 00:59:55
Thomas
Hallo Forum,
ich möchte ein Makro schreiben welches mir aus einer Liste Werte in Variablen schreibt und dann im weiteren Verlauf diese Variablen in ein Word Dokument überträgt.
Es läuft soweit wunderbar mit
TmpVar(1) = Sheets("xxx").Range("d5").Value
Set wdApp = CreateObject("Word.application")
Set wdDoc = wdApp.Documents.Open(Filename:=Application.ActiveWorkbook.Path & "\" & TmpVari1 & ".docx")
With wdDoc.Content.Find
.Execute findtext:="TmpVar(1)", replacewith:=TmpVar(1), Replace:=wdReplaceAll
End with
Problem
Jetzt habe ich knapp 2500 Variablen wie oben generiert und die Fehlermeldung
Prozedur zu groß bekommen.
Gut also die Variablenschreibung in 5 kleinere Prozeduren (Sub) geteilt und das klappt auch wunderbar. Der erste Block ruft den zweiten auf etc..
Der letzte ruft die Übertragung auf.
Leider bekomme ich bei dem Übertragen ins Word Dokument wieder den Fehler
Prozedur zu groß.
Jetzt habe ich die Übertragung auch zerlegt in 5 Prozeduren.
Aber
nur der erste Übertrag klappt.
Wenn dieser die zweite Übertragungsprozedur aufruft kommt ein Verweisfehler.
Meine Frage wäre nun. Wie übergebe ich sauber das Word Ojekt an die Übertragungsprozedur beim zweiten Mal. Er scheint die erstellten Variablen zu 'Vergessen'.
Oder wie kann ich die Funktion
With wdDoc.Content.Find
.Execute findtext:="TmpVar(1)", replacewith:=TmpVar(1), Replace:=wdReplaceAll
End with
in eine Schleife packen die halt 25ßß durchlaufen wird?
Es wäre nett wenn sich jemand die Zeit nimmt um mir meine Denkfehler zu zeigen und eine Lösung auf zu zeigen.
Vielen Dank Thomas

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 07:16:39
Sepp
Hallo Thomas,
als erstes solltest du die Variablen deklarieren, dann würde dir auffallen, dass du einmal TmpVari1, dann "TmpVar(1)" und dann TmpVar(1) schreibst.
Zweitens, was steht in deiner Liste? Du weißt TmpVar nur die Zelle D5 zu!
So wie ich es verstehe, sollte die Liste so aussehen.
1. Spalte: Dateiname
2. Spalte: Das gesuchte Wort
3. Spalte: Der Ersatztext
Gruß Sepp

AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 07:52:11
Thomas
Hallo,
danke für die Antwort.
Ich hatte die Deklarationen in der Frage nicht aufgenommen:
Dim TmpVar(0 To 5000) As String
Dim TmpVari(1 To 50) As String
Dim wdApp As Object
Dim wdDoc As Object
Ich frage 1638 Zellen aus einem Excelsheet ab und schreibe sie in die TmpVar(x) Variablen ein.
Im Word Template werden dann die Platzhalter entsprechend mit dem .execute Begfehl ersetzt.
Wie geschrieben bis ca. 600 Variablen geht es in einer Prozedur ohne Probleme.
Das Problem mir der Prozedur trat erst auf als ich es wegen der Größe in Teilschritte aufteilen mußte.
Und da auch nur bei dem Suche tauschen Befehl.
Gruß Thomas

Anzeige
AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 07:59:00
Sepp
Hallo Thomas,
werden alle Begriffe in einer Word-Datei ersetzt, oder in verschiedenen?
Zeig doch den gesamten Code.
Weißt du die Variablen alle einzeln zu? Da wäre man ja schneller, wenn man in Word die Begriffe per Hand ersetzt, als den Code zu schreiben.
In deinem Codesschnipsel ist der Suchbegriff identisch mit dem Ersatz!
Gruß Sepp

AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 09:24:33
Thomas
Hallo,
ich wollte die Frage nicht sprengen aber hier in Auschnitten der Code:
Dim TmpVar(0 To 5000) As String
Dim TmpVari(1 To 50) As String
Dim wdApp As Object
Dim wdDoc As Object
'Dim TmpVar(0 To 1000) As String
'Dim TmpVar(500 To 1500) As String
'Dim TmpVar(1000 To 2000) As String
'Dim TmpVar(1500 To 2500) As String
'Dim TmpVar5(2000 To 3000) As String
' Die Routinen eine nach der Anderen aufrufen und die Variablen bleiben erhalten
Sub Gen_Var()
' Generate Variables
TmpVar(1) = Sheets("Data entry").Range("d5").Value
TmpVar(2) = Sheets("Data entry").Range("e5").Value
TmpVar(3) = Sheets("Data entry").Range("f5").Value
TmpVar(4) = Sheets("Data entry").Range("d6").Value
TmpVar(5) = Sheets("Data entry").Range("e6").Value
TmpVar(6) = Sheets("Data entry").Range("f6").Value
TmpVar(7) = Sheets("Data entry").Range("f7").Value
  .... und so weiter für alle Zellen die übertragen werden müssen
TmpVar(510) = Sheets("Results").Range("q23").Value
TmpVar(511) = Sheets("Results").Range("q44").Value
TmpVar(512) = Sheets("Results").Range("q65").Value
Gen_Var1
End Sub

Sub Gen_Var1()
' Resident beginn
TmpVar(513) = Sheets("Results").Range("ad3").Value
TmpVar(514) = Sheets("Results").Range("ae3").Value
TmpVar(515) = Sheets("Results").Range("ap3").Value
  .... und so weiter für alle Zellen die übertragen werden müssen insgesamt 5 Blöcke
.... das funktioniert auch wunderbar
.... die Variablen bleiben erhalten und werden wunderbar ausgelesen.
    TmpVar(2149) = Sheets("Results").Range("am65").Value ' Resident Active 3 Sum adult Crop  _
21
TmpVar(2150) = Sheets("Results").Range("ab65").Value ' Resident Active 3 Sum child Crop 21
Var_Tausch
End Sub

Sub Var_Tausch()
Set wdApp = CreateObject("Word.application")
Set wdDoc = wdApp.Documents.Open(Filename:=Application.ActiveWorkbook.Path & "\template.docx")
wdApp.Visible = True    ' show Word document
With wdDoc.Content.Find
.Execute findtext:="TmpVar(1)", replacewith:=TmpVar(1), Replace:=wdReplaceAll   ' Active 
Sub 1
  .... und so weiter für alle Zellen die übertragen werden müssen
End With
TmpVari(1) = Format(Date, "yyyymmdd") & " " & Format(Time, "hhmmss") & " " & " - " & TmpVar(7)
wdDoc.SaveAs Filename:=Application.ActiveWorkbook.Path & "\" & TmpVari(1) & ".docx"
MsgBox ("File saved in directory: ") & vbCrLf & Application.ActiveWorkbook.Path & vbCrLf & "  _
with filename: " & vbCrLf & TmpVari(1) & ".docx"
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
Var_Tausch1
End Sub
....Und hier im zweten Block der Tauschaktion laufe ich in den Verweisfehler
Sub Var_Tausch1()
Set wdApp = CreateObject("Word.application")
Set wdDoc = wdApp.Documents.Open(Filename:=Application.ActiveWorkbook.Path & "\" & TmpVari1 & ". _
docx")
wdApp.Visible = True    ' show Word document
' Beginn
.Execute findtext:="TmpVar(513)", replacewith:=TmpVar(513), Replace:=wdReplaceAll
.Execute findtext:="TmpVar(514)", replacewith:=TmpVar(514), Replace:=wdReplaceAll
End with
End Sub
.... etc. es sollen alle anderen getauscht werden alles geschlossen und ich hätte ein fertiges Word Dokument.
Zu
Weißt du die Variablen alle einzeln zu? Da wäre man ja schneller, wenn man in Word die Begriffe per Hand ersetzt, als den Code zu schreiben.

Ja. Ich erstellen quasi aus einer komplexen Berechnung ein Sheet mit den Ergebnissen.
Diese lese ich mit meinem Makro aus und übertrage sie nach Word.
Um die weiderkehrenden Berechnungen ohne Fehle zu übertragen der Versuch der Automation.
Ich hoffe es ist jetzt etwas klarer. Vielen Dank schonmal.
Gruß Thomas

Anzeige
AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 09:59:10
Sepp
Hallo Thomas,
sorry, aber das ist "gruselcode"!
"Um die wiederkehrenden Berechnungen ohne Fehler zu übertragen der Versuch der Automation."
Automation? Und dann belegst du 2500 Variablen per Hand!
Nochmal Sorry, aber da steckt keine Logik dahinter.
Stell deine Berechnungen als Liste bereit. 1. Spalte Suchbegriff, 2. Spalte Ersatztext, dann kann man das per Schleife, oder sogar mit direkter Zuweisung erledigen.
Ich weiß immer noch nicht, ob das Ganze in einem Word-File stattfindet, oder in mehreren.
Gruß Sepp

Anzeige
AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
21.12.2015 10:56:01
Thomas
Hallo,
ja den Gruselcode leugne ich nicht. Ist halt learning by doing.
Der Tausch findet in einem einzigen Word Dokument statt das ich immer wieder öffne.
Die Zahlen liegen als Liste vor
in diesem Format

  • 0,0503313 296,07 % 0,00107 6,29 % 0,002933 17,25 % 0,0316406 186,12 %
    0,036527 214,86 % 0,00107 6,29 % 0,0191834 112,84 % 0,0733948 431,73 %
    0,0322626 189,78 % 0,00107 6,29 % 0,002559 15,05 % 0,1189194 699,53 %
    0,0619462 364,39 % 0,00107 6,29 % 0,0184445 108,5 % 0,1614874 949,93 %
    0,0215249 126,62 % 0,00107 6,29 % 0,0031445 18,5 % 0,0398898 234,65 %
    0,0368716 216,89 % 0,00107 6,29 % 0,0033495 19,7 % 0,0375878 221,1 %
    0,3576301 2103,71 % 0,00107 6,29 % 0,0098748 58,09 % 0,0696094 409,47 %

  • Mein Problem ist halt das ich aus verschiedenen Excel Sheets die Werte zusammensuchen muß.
    Die Werte schreibe ich in obige Liste in Spalten.
    Nachdem die Suche fertig ist stoße ich dann den Übertrag in ein Word Template an wo ich dann auch wieder vorgegebenen Tabellen in verschiedenen Formaten fülle. Diese enthalten dann die TmpVar Variable die ich aus Excel heraus tausche.
    Um die .excecute findtext: .... Tauscherei in eine Schleife zu bekommen bin ich gerne für Vorschläge offen. Da fehlt mir noch etwas die Routine um das einfach hinzubekommen und das runterkopieren des Tauschbefehls ging da schneller.
    Die TmpVar Erstellung ist leider organisch gewachsen und nur mit sehr viel Aufwand in die Schleife zu schreiben, da die Werte in dem Berechnungs Sheets nicht in Reihe/Spalte vorliegen sonder verteilt über das Sheet.
    Aber deshalb habe ich ja meine Frage eingestellt, um es eleganter zu lösen.
    Danke und Gruß Thomas
    P.S.: Ich habe bei der Suche jetzt schon zwei Fehler eliminiert
    - Ich hatte in dem zweite Tausche Block vergessen zu schreiben
    With wdDoc.Content.Find
    - Ich hatte die Variable falsch geschrieben statt TmpVari(1) habe ich TmpVari 1 geschrieben

    Anzeige
    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 11:36:31
    Sepp
    Hallo Thomas,
    ohne Beispieldatei(en) wird das nichts, und auch mit, weiß ich nicht, ob ich mir das antun will.
    Aber, warum öffnest du das Word-Dokument jedes mal neu? Das kostet enorm viel Speicher und Zeit
    Gruß Sepp

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 12:17:14
    Thomas
    Hallo,
    da ich wenn ich es beim ersten Öffen in der zweiten Tauschroutine den Fehler bekam, hatte ich jedesmal neu geöffnet und geschloßen.
    Das prüfe ich jetzt nochmal.
    Hättest Du denn ein Beispiel für eine Schleife wo ich den Befehl
    With wdDoc.Content.Find
    .Execute findtext:="TmpVar(1)", replacewith:=TmpVar(1), Replace:=wdReplaceAll
    End with
    mit Hochzähl Variable für die 1 in einer schleife abarbeiten könnte.
    Würde das funktionieren? Oder fehlen noch Definitonen etc. oder so?
    Sub 1
    For i = 1 to 2500
    With wdDoc.Content.Find
    .Execute findtext:="TmpVar(i)", replacewith:=TmpVar(i), Replace:=wdReplaceAll
    End with
    next i
    End Sub
    

    Gruß Thomas
    P.S.: Nur am Anfang öffen und am Ende schließen funktioniert jetzt. Danke

    Anzeige
    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 12:20:02
    Sepp
    Hallo Thomas,
    da du bei .FindText einen String übergibst, müsste das so lauten.
    For i = 1 To 2500
      With wdDoc.Content.Find
        .Execute findtext:="TmpVar(" & i & ")", replacewith:=tmpVar(i), Replace:=wdReplaceAll
      End With
    Next i

    Gruß Sepp

    Anzeige
    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 12:35:02
    Thomas
    Hallo Sepp,
    vielen Dank. Es klappt wunderbar mit der Schleife. Ich habe i als long delariert.
    Die Tauschaktion ist sehr langsam. Das Objekt lasse ich ausgeblendet.
    Gibt es noch Tricks die den Tausch im geöffneten Wordobjekt beschleunigen würde?
    Gruß Thomas

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 13:11:16
    Sepp
    Hallo Thomas,
    k. A. ob man das beschleunigen kann.
    Eine ander Möglichkeit währe, die Zellen als Verknüpfungen in Word einzufügen.
    Gruß Sepp

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 15:37:39
    Thomas
    Hallo,
    ist ja manchmal seltsam mit Excel.
    Aber wahrscheinlich sehe ich auch den Grund nur nicht.
    Ich generiere ja die Variablen via
    TmpVar(1) = Sheets("Data entry").Range("d5").Value
    und wenn ich Prozentzahlen in Word darstellen mußte habe ich es einfach so gemacht
    TmpVar(1) = Sheets("Data entry").Range("d5").Value * 100
    Jetzt gibt er mir ab und an die Fehlermeldung Typen unverträglich aus.
    Wenn ich dann an dieser Stelle einmal die * 100 wegnehme und wieder hinzufüge geht es?
    Liegt da ein Fehler in der Deklaration oder muß ich eine Fehlerabfrage einbauen?
    Gruß Thomas

    Anzeige
    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 16:36:52
    Sepp
    Hallo Thomas,
    wahrscheinlich steht in der Zelle keine Zahl
    Gruß Sepp

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 19:23:01
    Thomas
    Hallo,
    Ich muss also eine Routine einbauen wenn die auszulesende Zelle leer ist? Leere Zelle ist also kein String?
    Darf ich fragen ob es für sowas eine Routine gibt in der Art kein String also weiter zur nächsten Zelle und die Variable bleibt leer?
    Hättest du da vielleicht ein Beispiel für?
    Danke & Gruß Thomas

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    21.12.2015 19:28:19
    Sepp
    Hallo Thomas,
    abfrage ob nicht leer
    If TempVar(i)  "" Then
    
    abfrage ob Zahl
    If IsNumeric(TempVar(i)) Then
    
    Gruß Sepp

    Anzeige
    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    22.12.2015 16:54:29
    Thomas
    Hallo Sepp,
    vielen Dank. Auch nochmal für die schon gegebenen Tipps.
    Wird direkt eingebaut.
    Hatte es schon - unelegant - umgangen via
    On Error Resume Next
    
    .
    Eine neue Frage?!
    Du hattest erwähnt ich solle eine Liste bauen und die verwenden.
    Würde das heißen ich schreibe alle benötigten Adressen in eine Spalte und greife dann darauf via Vba zu?
    Hättest Du dafür ein Beispiel?
    Gruß Thomas

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    22.12.2015 17:46:48
    Sepp
    Hallo Thomas,
    dazu brauch ich kein Beispiel machen, ist leicht erklärt.
    Ich würde ein neues Tabellenblatt erstellen, nennen wir es 'Replacements', dieses kannst du im 'Normalbetrieb' dann ausblenden, so das es nicht stört und auch nicht unbeabsichtigt verändert wird.
    Von A1 bis Ax schreibst du nun die Texte die du in Word ersetzen willst.
    Von B1 bis Bx holst du dir per einfacher Verknüpfung nun den entsprechenden Wert. Z. B.: '=Tabelle1!A1'
    In Spalte C kannst du evtl. entsprechende Anmerkungen unterbringen, das hilft sicher bei der Pflege.
    Im Code verwendest du das dann folgendermaßen.
    
    Dim TmpVar as variant
    Dim lngIndex As Long
    With Sheets("Replacements")
    TmpVar = .Range("A1:B" & .Cells(.Rows.Count, 1).End(xlUp).Row)
    End With
    With wdDoc.Content.Find
    For lngIndex = 1 to Ubound(TmpVar, 1)
    If TmpVar(lngIndex, 1)  "" And TmpVar(lngIndex, 2)  "" Then
    .Execute findtext:=TmpVar(lngIndex, 1), _
    replacewith:=TmpVar(lngIndex, 2), _
    Replace:=wdReplaceAll
    End If
    Next
    End with
    

    Gruß Sepp

    Anzeige
    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    22.12.2015 18:52:38
    Thomas
    Hallo Sepp,
    für mein Verständnis...
    In Spalte A würde ich also die 'Bookmarks' die ich in Word ersetzten möchte auflisten:
  • TmpVar(1) TmpVar(2) TmpVar(4) TmpVar(4) etc.

  • In Spalte B meine Werte:
  • 0,12 2,35 2,15 0,2145 etc.

  • Besetzt dann - hier bin ich mir nicht sicher -
    TmpVar = .Range("A1:B" & .Cells(.Rows.Count, 1).End(xlUp).Row)
    
    den Wert aus Zeile B als Wert für den Text in Zeile A ein,

    End(xlUp.row)
    bis zum Zeilenende?
    Jetzt
    If TmpVar(lngIndex, 1)  "" And TmpVar(lngIndex, 2)  "" Then
    

    Solange beide nicht leer sind.
    Tausche
    .Execute findtext:=TmpVar(lngIndex, 1), _
    replacewith:=TmpVar(lngIndex, 2), _
    Replace:=wdReplaceAll
    
    Bis zum Ende?
    Ich hoffe das ist richtig interpretiert?
    Da es in Spalten läuft ist es kein Problem 2500 Werte zu lesen/schreiben.
    Wenn ich es 21 mal hintereinander machen muß, macht es da eher Sinn es für das 2te Mal in Spalte D, E, F und das 3te Mal in Spalte G, H, I etc. zu schreiben oder eher die Spalten A, B, C immer weiter zu füllen?
    Wow Danke schonmal, macht echt Spaß sich da rein zu arbeiten.
    Gruß Thomas

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    22.12.2015 19:05:49
    Sepp
    Hallo Thomas,
    mit
    
    .Cells(.Rows.Count, 1).End(xlUp).Row)
    
    wird der letzte Eintrag in Spalte A ermittelt.
    Warum 21-Mal?
    Wie du das löst, ist Geschmackssache, wenn der Code nicht durchläuft, vielleicht hilft es nach ein paar Hundert Schleifendurchläufen, die Worddatei zwischendurch zu speichern.
    Gruß Sepp

    AW: Variablen, Objekt, Prozedur zu groß, Verweisfehler
    22.12.2015 19:44:29
    Thomas
    Hallo,
    als Erläuterung
    - ich schreibe in ein Eingabeblatt Ausgangsparameter (die Zellen sind mit Namen belegt). Daraus wird ohne Vba einfach via Excelformeln in einem Ergebnisblatt ein Berechnungsergebnis ausgegeben, in den Formeln unter Verwendung von den Zellnamen.
    Die Werte des Ergebnisblattes schreibe ich in mein Resultsblatt via Vba.
    Jetzt ändere via Vba die Adressen der Zellnamen, da ich die sehr komplexen Formeln nicht verändern möchte = neue Werte im Ergebnisblatt = wieder Übertrag in mein Resultsblatt = insgesamt 21 * 3.
    Habe es gerade mal mit einem Fünftel der Variablen getestet.
    Läuft ähnlich schnell beim Tauschen.
    Es ist aber besser in der Übersicht...
    Danke und Gruß Thomas

    122 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige