# Zugriff auf ActiveDocument.FormFields(STRING).Result dauert ewig



## excelite (19. Dezember 2010)

Hallo Forum,

ich bastel hier gerade ein Prüfprotokoll das automatisch den Min, Max, Mittelwert usw. erzeugen soll. Später dann auch noch ein Diagramm aus den Daten ermitteln. Eigentlich bin ich ganz gut vorangekommen mit der Umsetzung in VB (ich bin Anfänger). Nun habe ich aber das Problem, dass der Zugriff auf meine Felder via Textmarke ewig dauert! Ich bin mir nicht sicher woran das liegen kann. Es sind aktuell 21 Felder im Dokument. Es sollen natürlich noch viel mehr werden. Ich kann nicht glauben, dass ich jetzt schon an die Grenzen komme. 

Im Debugmode sehe ich deutlich, dass die Zeilen 
ActiveDocument.FormFields(strFieldNameX).Result = strElementX
ActiveDocument.FormFields(strFieldNameY).Result = strElementY
ActiveDocument.FormFields(strFieldNameZ).Result = strElementZ
ewig dauern. Eine CPU Belastung oder Speicherauslastung kann ich jedoch nicht feststellen. es sind ca. 70MB RAM und 13% CPU Last zu sehen. Das ist nix!

Meine Felder haben die Namen 
X_1_
Y_1_
Z_1_
X_2_
Y_2_
Z_2_
jeweils mit 1-7 hinten dran.

Wäre super wenn da jemand eine Idee hat.

Grüße und Danke

excelite


```
Private Sub CommandButton1_Click()

    Dim PosSemikolon, nIdentNumber, i, bla  As Integer
    Dim LengthString As Integer
    Dim strElementX, strElementY, strElementZ As String
    Dim strFieldNameX, strFieldNameY, strFieldNameZ As String
    Dim strIdentifier, strIdentNumber As String
    Dim aryRealValuesX(14), aryRealValuesY(14), aryRealValuesZ(14) As Double
       
    
    Open ".\ínputdatei.txt" For Input As #1
     
    i = 0
    Do While Not EOF(1)
        Line Input #1, temp
            
            If InStr(1, temp, ";") And Left(temp, 7) = "M_PUNKT" Then
                i = i + 1
                If i > 13 Then
                    Exit Do
                    
                End If
                ' strElementX mit X - Wert erzeugen
                PosSemikolon = InStr(1, temp, ";")
                strElementX = Right(temp, Len(temp) - PosSemikolon)
                PosSemikolon = InStr(1, strElementX, ";")
                strElementX = Left(strElementX, PosSemikolon - 1)
                
                ' strElementX mit Y - Wert erzeugen
                PosSemikolon = InStr(1, temp, ";")
                PosSemikolon = InStr(PosSemikolon + 1, temp, ";")
                strElementY = Right(temp, Len(temp) - PosSemikolon)
                PosSemikolon = InStr(1, strElementY, ";")
                strElementY = Left(strElementY, PosSemikolon - 1)
                
                ' strElementX mit Z - Wert erzeugen
                PosSemikolon = InStr(1, temp, ";")
                PosSemikolon = InStr(PosSemikolon + 1, temp, ";")
                PosSemikolon = InStr(PosSemikolon + 1, temp, ";")
                strElementZ = Right(temp, Len(temp) - PosSemikolon)
                PosSemikolon = InStr(1, strElementZ, ";")
                strElementZ = Left(strElementZ, PosSemikolon - 1)
                
                If i < 10 Then
                    strIdentifier = "M_PUNKT00" + CStr(i)
                Else
                    strIdentifier = "M_PUNKT0" + CStr(i)
                End If
                
                strIdentNumber = Right(Left(temp, 10), 3)
                nIdentNumber = Val(strIdentNumber)
                If nIdentNumber < 8 Then
                    strFieldNameX = "X_1_" + CStr(nIdentNumber)
                    strFieldNameY = "Y_1_" + CStr(nIdentNumber)
                    strFieldNameZ = "Z_1_" + CStr(nIdentNumber)
                ElseIf nIdentNumber > 7 Then
                    strFieldNameX = "X_2_" + CStr(nIdentNumber - 7)
                    strFieldNameY = "Y_2_" + CStr(nIdentNumber - 7)
                    strFieldNameZ = "Z_2_" + CStr(nIdentNumber - 7)
                End If
                
                ActiveDocument.FormFields(strFieldNameX).Result = strElementX
                ActiveDocument.FormFields(strFieldNameY).Result = strElementY
                ActiveDocument.FormFields(strFieldNameZ).Result = strElementZ
                aryRealValuesX(i - 1) = CDbl(strElementX)
                aryRealValuesY(i - 1) = CDbl(strElementY)
                aryRealValuesZ(i - 1) = CDbl(strElementZ)
                
            End If
        Loop
     Close #1

End Sub
```

Inhalt der txt Datei



```
Bauteilname: T1_M2
Seriennummer: 1
Gerät: 1
Geräteversion: 1,07
Gerätezertifikationsdatum: 
Tagesdatum: 29.11.2010
Einheiten: Millimeter
Etikett;TatsächlichX;TatsächlichY;TatsächlichZ;I;J;K;TatsächlichX2;TatsächlichY2;TatsächlichZ2;I2;J2;K2;TatsächlichRFS;TatsächlichMMC;MaxFehler;MinFehler;Punktanzahl;Temperatur;AbweichungX;AbweichungY;AbweichungZ;AbweichungDurchm;AbweichungRad;AbweichungLänge;AbweichungWinkel;AbweichungForm;AbweichungRFS;AbweichungMMC;AußerhTolX;AußerhTolY;AußerhTolZ;AußerhTolDurchm;AußerhTolRad;AußerhTolLän;AußerhTolWink;AußerhTolForm;AußerhTolRFS;AußerhTolMMC;TatsächlichWinkel;TatsächlichDurchm;TatsächlichLän;TatsächlichRad;TatsächlichForm;SollwertX;SollwertY;SollwertZ;SollwertDurchm;SollwertRad;SollwertLän;SollwertWink;ObereTolX;ObereTolY;ObereTolZ;ObereTolWink;ObereTolForm;ObereTolLän;ObereTolRad;ObereTolDurchm;ObereTolRFS;ObereTolMMC;UntereTolX;UntereTolY;UntereTolZ;UntereTolWink;UntereTolLän;UntereTolRad;UntereTolDurchm;Bezugsgröße;Bezugsgröße1;Bezugsgröße2;Bezugsgröße3;Bezugsgröße4;Bezugsgröße5;Bezugsgröße6;Bezugsgröße7;StdAbw;Spanne;DURCHSCHN;ObereTolAbwPos;AbweichungGerät;AußerhTolGerät;MerkmalTyp

_KOORDSYS001;+0000,0000;-0000,0000;+0000,0000;-000,0000;+000,0000;-001,0000;;;;;;;;;;;;0,000°C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ALIGN
C_AUSRICHTUNG001;;;;;;;;;;;;;;;+000,0000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+000,0000;+000,0000;+000,0000;+001,2700;+000,0000;**********;ARMPOS
C_KOORDSYS002;+0000,0000;+0000,0000;+0000,0000;+000,0000;+000,0000;+001,0000;;;;;;;;;;;;0,000°C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ALIGN
M_PUNKT001;+0296,9123;-0030,4655;+0736,2765;+000,0000;
M_PUNKT002;+0121,7234;-0205,3282;+0872,3462;+000,0000;
M_PUNKT003;+0121,7358;-0205,3344;+0897,3386;+000,0000;
M_PUNKT004;+0121,7652;-0205,3216;+0922,3805;+000,0000;
M_PUNKT005;+0121,8143;-0205,3488;+0947,4028;+000,0000;
M_PUNKT006;+0121,8703;-0205,3218;+0972,4327;+000,0000;
M_PUNKT007;+0121,8904;-0030,3355;+0872,3274;+000,0000;
M_PUNKT008;+0121,9007;-0030,3381;+0897,3518;+000,0000;
M_PUNKT009;+0121,9428;-0030,2975;+0922,3647;+000,0000;
M_PUNKT010;+0121,9353;-0030,3377;+0947,3974;+000,0000;
M_PUNKT011;+0121,9404;-0030,3254;+0972,3937;+000,0000;
M_PUNKT012;+0122,0863;+0144,6256;+0872,3867;+000,0000;
M_PUNKT013;+0122,1026;+0144,6516;+0897,3832;+000,0000;
M_PUNKT014;+0122,0775;+0144,6854;+0922,3771;+000,0000;
M_PUNKT015;+0122,0801;+0144,6666;+0947,4117;+000,0000;
M_PUNKT016;+0121,9949;+0144,6361;+0972,3894;+000,0000;
M_PUNKT017;+0296,5674;-0205,4371;+0872,3354;+000,0000;
M_PUNKT018;+0296,6057;-0205,4568;+0897,3449;+000,0000;
M_PUNKT019;+0296,6497;-0205,4804;+0922,3572;+000,0000;
M_PUNKT020;+0296,6883;-0205,4817;+0947,3772;+000,0000;
M_PUNKT021;+0296,7052;-0205,4519;+0972,4003;+000,0000;
M_PUNKT022;+0296,8664;-0030,5710;+0872,3370;+000,0000;
```


----------



## DrSoong (20. Dezember 2010)

Kannst du mal eine Word-Beispieldatei posten, damit ich das ganze hier durchtesten kann? Bitte auch eine Testzeit von dir dazu schreiben.


Der Doc!


----------



## excelite (20. Dezember 2010)

Hi Doc,

danke, dass du dir mein VB Problem genauer anschaust. Ich habe die .doc und die .txt Datei auf meinen Webserver geladen. Pruefprotokoll.

Mir fällt auf, dass die Ausführungszeit sehr unterschiedlich ist. Gerade eben habe ich anfangs "nur" 15 Sekunden benötigt für den kompletten Code. Als ich dann den Code debuggen wollte musste ich im Step-by-Step Modus jedesmal eine Minute warten bis die "ActiveDocument.FormFieldstrallala" Zeile abgearbeitet wurde. Ich kann mir da keinen Reim drauf machen. Eigentlich habe ich gehofft der Zugriff geht innerhalb weniger Millisekunden. 

Jetzt bin ich mal gespannt was deine Tests ans Tageslicht bringen werden.

Grüße Excelite


----------



## DrSoong (20. Dezember 2010)

Hallo!

Hab mir das ganze mal angesehen, läuft bei mir in ca. 1 Sekunde durch (mit *Application.ScreenUpdating = False* sogar in einer halben Sekunde). Auf welchem System läuft denn das ganze bei dir (hier Word2003 auf WinXP)?


Der Doc!


----------



## excelite (21. Dezember 2010)

Hallo Doc,

komisch - bei mir ist es Office 2007 und WinXp Sp3. Es ist mein Firmennotebook mit Core 2 Duo und 3,irgendwas GB Ram. Die Firma hat da einige Plugins integriert zum Erstellen von Kundenanschreiben. Vielleicht funken die dazwischen. Mal schauen ob ich die deaktivieren kann. 

Wie gesagt bin ich neu in VB und dachte ich hätte hier etwas grundsätzlich falsch gemacht was zu dieser ellenlangen Ausführungszeit führt. Nach deiner Analyse sollte es aber irgendwo an meinem PC bzw. der Konfiguration liegen.

Danke dir - nun weiß ich wo ich suchen muss!

Grüße excelite

Ach - was meinst du mit Application.ScreenUpdating? Wo kann ich diesen Parameter einstellen? Vielleicht läuft es dann bei mir auch flotter!


----------



## DrSoong (21. Dezember 2010)

*Application.ScreenUpdating* ist ein VBA-Befehl, der schaltet die Aktualisierung der Anzeige in Word aus. Da Word dann das Dokument nicht bei jedem VBA-Schritt aktualisieren muss, läuft dein Makro schneller durch.

Dabei sieht das ganze so aus:

```
'Aktualisierung ausschalten:
Application.ScreenUpdating = False

'hier kommt dann dein VBA-Code rein

'nun muss die Aktualisierung wieder eingeschalten werden, sonst sieht man ja nicht, was per Code geschrieben wurde
Application.ScreenUpdating = True
```


Der Doc!


----------

