Probleem met loop in Word

Status
Niet open voor verdere reacties.

marcvc

Nieuwe gebruiker
Lid geworden
13 okt 2010
Berichten
3
Hallo iedereen,

ik heb een probleem met een loop in Word. Ik probeer data van Excel te exporteren naar Word, en dat lukt, maar in die Word-export moeten er verschillende blokken code uitgevoerd worden.
Zo gaat het ongeveer:
- Eerst wordt OpmaakKatern1 behandeld. Daarin wordt een bepaalde invulling gekozen, afhankelijk van de waarde van Katern1. (dat werkt) In die bepaalde invulling, die bereikt wordt met een GoTo-instructie, wordt er opnieuw verwezen naar een soort teller (Voortgang:), en die teller zou moeten zien dat OpmaakKatern1 gebeurd is, en automatisch overgaan naar OpmaakKatern2, en daarna OpmaakKatern3, OpmaakKatern4 enz.
Maar dat doet hij dus niet. Hij blijft vasthangen op Katern2, en die eindeloos herhalen.

Hoe kan ik die loop goedkrijgen?

Alvast bedankt!

Dit is een stukje voorbeeldcode:

Code:
Voortgang:
    
  
    
    If Controle1 = True Then
        GoTo OpmaakKatern2
        
    End If
    If Controle2 = True Then
        GoTo OpmaakKatern3
    
    End If
    
    
     
                
                
                
               
OpmaakKatern1:
                If Datum1 = Empty Then
                        Controle1 = False
                        GoTo Eindsorteren
                Else:
                    Controle1 = True
                End If
                .TypeParagraph  'Hier start katern1
                .TypeParagraph
                .Font.Size = 12
                .Font.Bold = True
                .Font.Underline = True
                .TypeText Text:=Katern1     'Hier staat de naam van de katern
                .Font.Bold = False
                .Font.Underline = False
                .TypeParagraph
                .Font.Size = 10
                .Font.Underline = True
                .TypeText Text:="Datum:"    'Hier komt de gesorteerde datum, in te lezen als variabele
                .Font.Underline = False
                .TypeText Text:=" " & Datum1   'Hier komt de gesorteerde datum, in te lezen als variabele (aanhalingstekens verwijderen voor de variabele)
                .TypeParagraph
                .Font.Underline = True
                .TypeText Text:="Gerealiseerde leerplandoelstellingen:"
                .Font.Underline = False
                If Katern1 = "Een nieuwe start" Then
                    GoTo Invulling_EenNieuweStart
                ElseIf Katern1 = "Alles heeft zijn tijd" Then
                    GoTo Invulling_AllesHeeftZijnTijd
                ElseIf Katern1 = "De wereld aan je voeten" Then
                    GoTo Invulling_DeWereldAanJeVoeten
                ElseIf Katern1 = "Een levend boek" Then
                    GoTo Invulling_EenLevendBoek
                ElseIf Katern1 = "Drempels" Then
                    GoTo Invulling_Drempels
                ElseIf Katern1 = "Kerstmis" Then
                    GoTo Invulling_Kerstmis
                ElseIf Katern1 = "Confituur of choco" Then
                    GoTo Invulling_ConfituurOfChoco
                ElseIf Katern1 = "Hoe groot is de hemel?" Then
                    GoTo Invulling_HoeGrootIsDeHemel
                ElseIf Katern1 = "Ongelovige Thomas" Then
                    GoTo Invulling_OngelovigeThomas
                ElseIf Katern1 = "Feesten" Then
                    GoTo Invulling_Feesten
                ElseIf Katern1 = "Er is er één jarig!" Then
                    GoTo Invulling_ErIsErEénJarig
                ElseIf Katern1 = "Eén van hart" Then
                    GoTo Invulling_EénVanHart
                ElseIf Katern1 = "Ervoor gaan" Then
                    GoTo Invulling_ErvoorGaan
                ElseIf Katern1 = "Groen gras" Then
                    GoTo Invulling_GroenGras
                ElseIf Katern1 = "RELatie" Then
                    GoTo Invulling_RELatie
                ElseIf Katern1 = "Vele plaatjes" Then
                    GoTo Invulling_VelePlaatjes
                ElseIf Katern1 = "Iedereen fan" Then
                    GoTo Invulling_IedereenFan
                ElseIf Katern1 = "Schattenjacht" Then
                    GoTo Invulling_Schattenjacht
                ElseIf Katern1 = "Lichtbakens" Then
                    GoTo Invulling_Lichtbakens
                ElseIf Katern1 = "Rijke Luis" Then
                    GoTo Invulling_RijkeLuis
                ElseIf Katern1 = "Hemel op aarde" Then
                    GoTo Invulling_HemelOpAarde
                ElseIf Katern1 = "Op bezoek" Then
                    GoTo Invulling_OpBezoek
                End If


En tot slot nog een voorbeeld van een Invulling_-blok:


Code:
Invulling_ErIsErEénJarig:
                        
                        
                        If Worksheets("Theo").Rij12_4.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij12
                        End If
                        If Worksheets("Theo").Rij13_4.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij13
                        End If
                        If Worksheets("Theo").Rij14_4.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij14
                        End If
                        If Worksheets("Theo").Rij15_3.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij15
                        End If
                        If Worksheets("Theo").Rij20_6.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij20
                        End If
                        If Worksheets("Theo").Rij22_5.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij22
                        End If
                        If Worksheets("Theo").Rij25_4.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij25
                        End If
                        If Worksheets("Theo").Rij28_4.Value = True Then
                            .TypeParagraph
                            .TypeText Text:=Rij28
                        End If
                        GoTo Voortgang
 
Het is denk wel handig als je ook de code voor OpmaakKatern2 hier zet. Je geeft immers zelf aan dat het daar blijft hangen

Ron

Aanpassing: gokje, zet je in OpmaakKatern2 controle2 wel op true. Is er niet een copy fout waarbij je controle1 weer op true zet?

Ron
 
Laatst bewerkt:
Halle Ron,

bedankt om er eens naar te kijken, dit is de code voor OpmaakKatern2.


Alvast bedankt!

Code:
OpmaakKatern2:
                If Datum2 = Empty Then
                        Controle2 = False
                        GoTo Eindsorteren
                Else:
                    Controle2 = True
                End If
                .TypeParagraph  'Hier start katern2
                .TypeParagraph
                .Font.Size = 12
                .Font.Bold = True
                .Font.Underline = True
                .TypeText Text:=Katern2     'Hier staat de naam van de katern
                .Font.Bold = False
                .Font.Underline = False
                .TypeParagraph
                .Font.Size = 10
                .Font.Underline = True
                .TypeText Text:="Datum:"    'Hier komt de gesorteerde datum, in te lezen als variabele
                .Font.Underline = False
                .TypeText Text:=" " & Datum2   'Hier komt de gesorteerde datum, in te lezen als variabele (aanhalingstekens verwijderen voor de variabele)
                .TypeParagraph
                .Font.Underline = True
                .TypeText Text:="Gerealiseerde leerplandoelstellingen:"
                .Font.Underline = False
                If Katern2 = "Een nieuwe start" Then
                    GoTo Invulling_EenNieuweStart
                ElseIf Katern2 = "Alles heeft zijn tijd" Then
                    GoTo Invulling_AllesHeeftZijnTijd
                ElseIf Katern2 = "De wereld aan je voeten" Then
                    GoTo Invulling_DeWereldAanJeVoeten
                ElseIf Katern2 = "Een levend boek" Then
                    GoTo Invulling_EenLevendBoek
                ElseIf Katern2 = "Drempels" Then
                    GoTo Invulling_Drempels
                ElseIf Katern2 = "Kerstmis" Then
                    GoTo Invulling_Kerstmis
                ElseIf Katern2 = "Confituur of choco" Then
                    GoTo Invulling_ConfituurOfChoco
                ElseIf Katern2 = "Hoe groot is de hemel?" Then
                    GoTo Invulling_HoeGrootIsDeHemel
                ElseIf Katern2 = "Ongelovige Thomas" Then
                    GoTo Invulling_OngelovigeThomas
                ElseIf Katern2 = "Feesten" Then
                    GoTo Invulling_Feesten
                ElseIf Katern2 = "Er is er één jarig!" Then
                    GoTo Invulling_ErIsErEénJarig
                ElseIf Katern2 = "Eén van hart" Then
                    GoTo Invulling_EénVanHart
                ElseIf Katern2 = "Ervoor gaan" Then
                    GoTo Invulling_ErvoorGaan
                ElseIf Katern2 = "Groen gras" Then
                    GoTo Invulling_GroenGras
                ElseIf Katern2 = "RELatie" Then
                    GoTo Invulling_RELatie
                ElseIf Katern2 = "Vele plaatjes" Then
                    GoTo Invulling_VelePlaatjes
                ElseIf Katern2 = "Iedereen fan" Then
                    GoTo Invulling_IedereenFan
                ElseIf Katern2 = "Schattenjacht" Then
                    GoTo Invulling_Schattenjacht
                ElseIf Katern2 = "Lichtbakens" Then
                    GoTo Invulling_Lichtbakens
                ElseIf Katern2 = "Rijke Luis" Then
                    GoTo Invulling_RijkeLuis
                ElseIf Katern2 = "Hemel op aarde" Then
                    GoTo Invulling_HemelOpAarde
                ElseIf Katern2 = "Op bezoek" Then
                    GoTo Invulling_OpBezoek
                End If
 
Je geeft nu allemaal kleine stukjes uit wat waarschijnlijk een enorme lap code is. Op deze manier is de samenhang moeilijk te zien en zie ik hier zo snel geen oplossing.

Persoonlijk vind ik GoTo's een voorbeeld van superslecht programmeren omdat je dan de weg kwijt raakt. Werken met subroutines en functions houdt het allemaal veel overzichtelijker.

Mijn advies op dit moment is om met F8 door de code heen te stappen. Eventueel met F9 breakpoints zetten om wat grotere stappen met F5 te maken. Op die manier kom je vanzelf achter het probleem.

Ron
 
Beste Marcvc,

Wat ron zegt is waar, het is bijna altijd het best om géén GoTo te gebruiken.

De kern van het probleem zit echter ergens anders.

Ik zal eerlijk tegen je zijn: de programmacode zoals je die gepost hebt is eigenlijk gewoon heel slecht. Dat wil echter niet zeggen dat we jou niet met een paar goede tips c.q. voorbeelden naar de oplossing kunnen leiden. Wat daarvoor wel nodig is, is eigenlijk een groter stuk programmacode (liefst alles) maar dat moet je zelf wel willen doen.

Als je dat niet wilt kunnen we nog wat voorbeeldjes geven van hoe je het beter kunt doen.

Mark.


ps.
Hier alvast een tip:
Wat je doet in je voorbeeld Macro is nogal dubbelop. Je gebruikt een conditionele statement (if.. then) om vervolgens via een GoTo statement een ander deel van de code op te roepen.
Wat je beter kunt doen is bijvoorbeeld:
Code:
    If Controle1 = True Then
        'hier de code van katern1:
        If Datum1 = Empty Then
                Controle1 = False
                GoTo Eindsorteren
        Else:
            Controle1 = True
        End If
        .TypeParagraph  'Hier start katern1
        .TypeParagraph
        .Font.Size = 12
        'ETC......
        
    End If
 
Laatst bewerkt:
Hier nog een suggestie voor wat dynamische code (deze Subroutines + functie werken samen). Je moet er nog wel wat aan sleutelen. maar dit is een voorbeeld wat ook kan

Code:
Sub DynamischeCodeTest()
Dim Katern2 As String
Dim strKatern As String

Katern2 = "Er is er één jarig"
strKatern = ReplaceFancyChars(Katern2)

On Error Resume Next

MsgBox "de waarde van strkatern = " & strKatern & vbCr & _
        "de macro ""invulling_" & strKatern & """ wordt nu uitgevoerd"
'uitvoeren macro invulling_[naam van katern2]
Run "invulling_" & strKatern
'als Sub niet bestaat, geeft 1004 terug
If Err.Number = 1004 Then       'wil je iets doen als sub niet bestaat?
    'code
    MsgBox "uitvoeren invulling_" & strKatern & " is mislukt. de sub is niet gevonden"    

End If
'reset fout
Err.Clear

End Sub

Je gelabelde "ErIsErEenJarig:" omgezet naar een aparte "Sub"
Code:
Sub Invulling_ErIsErEenJarig()
    If Worksheets("Theo").Rij12_4.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij12
    End If
    If Worksheets("Theo").Rij13_4.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij13
    End If
    If Worksheets("Theo").Rij14_4.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij14
    End If
    If Worksheets("Theo").Rij15_3.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij15
    End If
    If Worksheets("Theo").Rij20_6.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij20
    End If
    If Worksheets("Theo").Rij22_5.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij22
    End If
    If Worksheets("Theo").Rij25_4.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij25
    End If
    If Worksheets("Theo").Rij28_4.Value = True Then
        .TypeParagraph
        .TypeText Text:=Rij28
    End If
End Sub

Een functie om spaties en vreemde tekens te vervangen zodat de naam van de macro "erisereenjarig" (of een andere) kan worden aangeroepen
Code:
Function ReplaceFancyChars(MyLitteredString As String) As String
'deze functie vervangt tekens uit matrix1 met tekens uit matrix2
Dim matrix1 As Variant
Dim matrix2 As Variant
Dim i As Long
' de te vervangen tekens
matrix1 = Array(" ", "?", "é")
' de tekens waarmee wordt vervangen
matrix2 = Array("", "", "e")
For i = LBound(matrix1) To UBound(matrix1)
    MyLitteredString = Replace(MyLitteredString, matrix1(i), matrix2(i))
Next
ReplaceFancyChars = MyLitteredString
End Function
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan