VBA for next probleem

Status
Niet open voor verdere reacties.

onkeltje

Gebruiker
Lid geworden
5 jul 2008
Berichten
23
Ik heb hier een tijd geleden een vraag gesteld over "beforeprint/afterprint". Dit probleem heb ik niet kunnen oplossen.
Ik heb dat nu op en ander manier opgelost.
Ik wilde dus een blad afdrukken met 10 kaartjes op, elk kaartje bevat één tekstvak met een nummer. Dus van 1 tot 10.
Ik heb op dat blad ook drie knopjes staan. Eén kopje is plus, één is min en één is reset. Dus als ik op het knopje "plus" klik wordt de waarde van ieder tekstvak met 10 verhoogt. Ik wilde die kaartjes al beginnen knippen maar moest telkens stoppen om weer op die "plus" te klikken en dat hield veel op. De beforeprint wilde niet lukken. Daarom heb ik 5 bladen gemaakt in het worddocument zodanig dat ik die al kan knippen terwijl de volgende 5 afgedrukt worden daardoor heb ik meer tijd.
Nu heb ik een eerder armzalige code geschreven.... iets voor kinderen denk ik en dat wilde ik toch graag verbeteren maar ik krijg telkens een foutmelding... kijk hier naar de kinderachtige code (die wel werkt natuurlijk maar ik vind ze niet mooi)...;-

Code:
Private Sub NumOp_Click()

    txb1.Value = txb1.Value + 50
    txb2.Value = txb2.Value + 50
    txb3.Value = txb3.Value + 50
    txb4.Value = txb4.Value + 50
    txb5.Value = txb5.Value + 50
    txb6.Value = txb6.Value + 50
    txb7.Value = txb7.Value + 50
    enz. tot....  
    txb49.Value = txb49.Value + 50
    txb50.Value = txb50.Value + 50

End Sub

dit is niet echt mooi en dus wilde ik deze code:
Private Sub NumOp_Click()
Dim tekst As String
Dim I As Integer
Dim vak As TextBox

    For I = 1 To 50
        tekst = ""
        tekst = tekst + "txb" + CStr(I)
        vak(Name) = tekst
        vak.Value = 1000 + 50
    Next I
End Sub

maar hier krijg ik altijd de volgende foutmelding:

fout 91 tijdens uitvoering:
Objectvariabele of blokvariabele With is niet ingesteld.
Ik veronderstel dat de meeste kenners hier het wel onmiddellijk weten maar als ik in de help kijk begrijp ik de uitleg daar toch niet.
Ik hoop dat mijn uitleg een beetje duidelijk is en dat iemand mij wil helpen. Alvast bedankt voor de hulp.
 
Laatst bewerkt door een moderator:
Oeps, niet zo rap een kenner te vinden?
Is het dan echt een groot probleem, ik dacht dat het probleem bij mij lag
maar ik sta duidelijk niet alleen.
Enfin nog even wachten misschien..
 
Nou, er is een speciaal VBA forum, mischien kan je je vraag beter daar stellen...

Mn basic-skill is een beetje roestig, maar: in ieder geval dit:
Code:
tekst = tekst + "txb" + CStr(I)
het '+' telt op; als je een string ervan wilt maken, gebruik dan &:
Code:
tekst = tekst & "txb" & cstr(I)

Daarnaast, je kan beter een control-array maken van je textboxen. Dan kan je namelijk wel gewoon door deze items loopen... Op deze manier gaat het niet lukken.




:thumb:
 
Laatst bewerkt:
Nou, er is een speciaal VBA forum, mischien kan je je vraag beter daar stellen...

Mn basic-skill is een beetje roestig, maar: in ieder geval dit:
Code:
tekst = tekst + "txb" + CStr(I)
het '+' telt op; als je een string ervan wilt maken, gebruik dan &:
Code:
tekst = tekst & "txb" & cstr(I)

Daarnaast, je kan beter een control-array maken van je textboxen. Dan kan je namelijk wel gewoon door deze items loopen... Op deze manier gaat het niet lukken.

:thumb:

Hartelijk dank voor de reactie.
Dit is precies wat ik zocht, hiermee moet het zeker lukken.

Ik dacht al dat ik ergens in een verkeerd forum zat, dit was niet mijn bedoeling, ik vond mij eigen post niet meer terug.
Indien een moderator dit ziet, graag verhuizen naar VBA forum.
 
Deze code werkt niet bij mij omdat ik geen UserForm heb in mijn Word-document.
Ik zou dus iets anders moeten gebruiken zoals... ThisDocument of ActiveDocument of iets dergelijks.
Helaas wordt dat bliikbaar niet ondersteunt en krijg ik een foutmelding

Code:
Private Sub Hernum_Click()
Dim ctrl As Control
Dim nummer As Integer
Nummer = 1000
For Each ctrl In UserForm1.Controls     [I] ' hier zou dus iets anders moeten komen maar wat[/I]
    If TypeName(ctrl) = "TextBox" Then
        With ctrl
            .Value = nummer + 1
        End With
    End If
Next ctrl

End Sub
 
Bedankt dat jij mijn post op de juiste plaats hebt gezet.:thumb:
Nu vind ik hem tenminste zelf terug.:d
 
Je was er bijna.

Code:
Private Sub NumOp_Click()
Dim i As Long
On Error GoTo einde
For i = 1 To 50
    Me.Controls("txb" & i).Text = Me.Controls("txb" & i).Text + 50
Next
einde:
Select Case Err.Number
    Case 0      'geen error
    
    Case 13
        MsgBox "txb" & i & " is geen nummer. de bewerking van deze Textbox wordt overgeslagen"
        Resume Next
    Case -2147024809
        MsgBox "txb" & i & " valt buiten het bereik. Procedure afgebroken"
    Case Else
        MsgBox "Nieuwe fout gevonden, foutnr: " & Err.Number & vbCr & _
                Err.Description & vbCr & _
                "breid de foutcontrole uit met deze fout"
End Select
End Sub
 
Laatst bewerkt:
Je was er bijna.

Code:
Private Sub NumOp_Click()
Dim i As Long
On Error GoTo einde
For i = 1 To 50
    Me.Controls("txb" & i).Text = Me.Controls("txb" & i).Text + 50
Next

End Sub

Het zag er heel goed uit maar helaas toch een foutmelding. Bij het stap voor stap uitvoeren krijg ik:
Kan de methode of het gegevenslid niet vinden (Fout 461)
En dat na de codelijn; Me.Controls("txb" & i).Text = Me.Controls("txb" & i).Text + 50
Misschien is dit iets voor VB en niet voor VBA.
Ik weet het niet. Als ik de reacties hier zie weet ik zeker dat we toch een oplossing gaan vinden.:thumb:

Alvast bedankt iedereen hier voor het meedenken.... de oplossing is nabij, ik voel het.:thumb:
 
Laatst bewerkt:
vervang in de regel
Code:
    Me.Controls("txb" & i).Text = Me.Controls("txb" & i).Text + 50

.TExt eens door .Value (voor beide waarden)

als dat niet werkt, moet je maar eens een voorbeeldbestandje posten, want bovenstaandecode werkt perfect voor een userform met textboxen met de naam txb + nummer op de machines hier.
 
vervang in de regel
Code:
    Me.Controls("txb" & i).Text = Me.Controls("txb" & i).Text + 50

.TExt eens door .Value (voor beide waarden)

als dat niet werkt, moet je maar eens een voorbeeldbestandje posten, want bovenstaandecode werkt perfect voor een userform met textboxen met de naam txb + nummer op de machines hier.

Dat had ik al geprobeerd. Ik weet niet of het hier veel mee te maken heeft maar ik schreef al eens dat ik dus geen Userform heb.
Ik heb een Wordducument met een tabel (2 kolonnen en 5 rijen) dus 10 vakken. Elk van die vakken bevat een beeld(image) en een TextBox. Plus heb ik 3 knopjes in het document staan: 1 knopje is om op te tellen, 1 knopje is om af te trekken en 1 knopje is om de nummering te resetten.... dus niet echt een Userform.

Ik heb het document sterk verklein en als bijlage als zipbestand toegevoegd. Ik hoop dat het nu wat duidelijker is.

Ik zal eens proberen om dat Worddocument te posten als het niet te groot is... mag maar 100K zijn.
 

Bijlagen

Laatst bewerkt:
onkeltje,

Ik heb even zitten pielen en ik heb NOGAL (en dat is een flinke understatement) moeite met het boven water krijgen van en je textbox objects. Dat is waarschijnlijk omdat ze in een tabel liggen, want als ik in een leeg document textboxen invoer krijg ik ze wel te pakken, en kan ik de eigenschappen instellen.

hopelijk is er iemand die het wel weet, dan kunnen we er nog wat van opsteken.

Probeer het voorlopig maar zo:
run de macro en plak in een module vanuit je "venster direct"
Code:
Sub totziens_objectmodel()
Debug.Print "Private sub VulTextbox_1_50"
Debug.Print "On Error GoTo einde"
For i = 1 To 50
Debug.Print "ActiveDocument.txb" & i & ".Value = ActiveDocument.txb" & i & ".Value + 50"
Next
Debug.Print "einde:"
Debug.Print "End Sub"
End Sub
 
onkeltje,

Probeer het voorlopig maar zo:
run de macro en plak in een module vanuit je "venster direct"
Code:
Sub totziens_objectmodel()
Debug.Print "Private sub VulTextbox_1_50"
Debug.Print "On Error GoTo einde"
For i = 1 To 50
Debug.Print "ActiveDocument.txb" & i & ".Value = ActiveDocument.txb" & i & ".Value + 50"
Next
Debug.Print "einde:"
Debug.Print "End Sub"
End Sub

Nu zal ik wel beschaamt moeten worden sorry daarvoor.
Ik begrijp niet goed wat je bedoeld met: run de macro... welke macro?
En dit begrijp ik ook niet: en plak in een module vanuit je "venster direct"
Of is een macro en een VBA code hetzelfde maar dan snap ik het nog niet
Als ik de eerste regel weglaat (Sub totziens_objectmodel() ) en ik doorloop dan stap voor stap dan krijg ik geen foutmelding...
dat vind ik al heel positief :thumb: Maar er gebeurt verder niets
En als ik op mijn knopje "optellen" klik gebeurt er ook niets (ik krijg ook geen foutmelding)
Ik begrijp wel dat die tabel een probleem is. Kun je mij iets anders voorstellen waardoor het makkelijker kan?
 
Ga in de visual basic editor naar het menu Beeld > venster direct(Ctrl-G)
daar wordt de text geplakt, die kun je kopieren.
 
Ga in de visual basic editor naar het menu Beeld > venster direct(Ctrl-G)
daar wordt de text geplakt, die kun je kopieren.

Ok dat heb ik gevonden (is echt niet moeilijk als ge het weet)
Ik heb de text (ik veronderstel dat je hier de code mee bedoeld) geselecteerd en in dat "venster direct" geplakt.
Nu heb ik nog een vraag... hoe run je die code, die moet toch door iets opgestart worden of begrijp ik er nog niets van.

Sorry ik word al wat ouder = trager van begrip :shocked:
 
Onkeltje, volgens mij heb ik het nu voor elkaar..
als je deze code runt wordt voor jouw document bij alle textboxen 50 opgeteld.

Code:
Sub Increment_Fifty()
Dim s As Shape
Dim Antwoord As Long
On Error GoTo Einde
For Each s In ActiveDocument.Shapes
    
    '   Oude besturingselementen vallen onder het shape object _
        De naam van de objecten = "Control " + nummer
    If s.Type = msoOLEControlObject And _
        Left(s.Name, 7) = "Control" Then
        
        'eigenschappen van Object lezen / instellen
        With ActiveDocument.Shapes(s.Name).OLEFormat.Object
            
            'controlbuttons hebben waarde -1 (true) _
                                        of 0 (False) _
             de overige objecten zijn textbox
            If .Value > 0 Then .Value = .Value + 50
        
        End With
    
    End If

Next
On Error GoTo 0
Einde:
Select Case Err.Number
    Case 0      '   Geen error(s)

    Case 13     '   Fout bij optellen text bij getal
        With ActiveDocument.Shapes(s.Name).OLEFormat.Object
            Antwoord = MsgBox(.Value & " is geen geldig getal ," & _
                            " wilt u nu doorgaan met invullen?", _
                            vbYesNo)
        End With
        If Antwoord = vbYes Then Resume Next
        
    Case Else   '   Overige fouten (?)
        MsgBox "Er is een onbekende fout opgetreden " & vbCr & _
                "(" & Err.Number & ") - " & Err.Description
End Select
End Sub
 
Laatst bewerkt:
Mark, jongen gij zijt een echte krak, gij weet ook van geen ophouden hé.
Ewel, geloof mij ik heb ondertussen ook niet stil gezeten en ik ben ook blijven zoeken.

Maar gij... gij hebt het gevonden:thumb: :thumb: :thumb:

Ik had al eerder het gevoel dat gij een echte doorbijter zijt en nu is dat bewezen ... het progje draait en nog wel zonder foutmelding.
Proficiat, van harte bedankt.

Onkeltje.

Wel ik heb het programma nu bijgewerkt aangaande de reset- en de aftrek-knop (die waren er ook nog).
Na uw code was dit niet zo moeilijk om dat aan te passen :D
Nu heb ik de verschillende knoppen uitgetest en toch nog een paar onzuiverheden tegen gekomen.
Dit vooral door dingen die gij niet gezien hebt in het voorbeeldje wat ik als bijlage toevoegde. Ik heb het document aardig moeten inkrimpen om onder die 100k te blijven en daardoor heb ge heel wat shapes niet kunnen zien. Zo zitten er per kaartje nog enkele WordArts en Word-tekstvelden bij. Daardoor wordt het progje wel 100X (en veel meer) doorlopen vooraleer ik de 50 bedoelde TextBoxen allemaal gehad heb. Ik zie dat de nummering bovendien op bepaalde plaatsen niet meer in de juiste volgorde gebeurt. Die volgorde kan ook mijn fout zijn, ik zal de nummering van de Boxen eens nakijken. Wat die loop aangaat moet het korter dus sneller kunnen, nu wordt die loop veel te dikwijls doorlopen en dit vertraagt enorm. Enfin, we zoeken verder. Met de gegevens dank zij u zitten we toch al aardig op het goede spoor.
Nogmaals bedankt.
 
Laatst bewerkt:
Ik heb zowat alles bekeken over dat textbox gedoe maar ik denk dat het zowat het moeilijkste component is. Als in mijn code het woordje "TextBox" wil gebruiken en ik ga dan met de cursor op dat woord staan om met de rechter-muisknop de definitie op te vragen dan krijg ik al het bericht dat VBA dat woordje niet kent.
Dus Mark, ik denk dat gij zowat de enige oplossing geboden hebt. Op gans internet kan ik ook niets beter vinden. Toch vind ik het eigenaardig dat die stomme eenvoudige code waar ik 50 regels nodig heb wel aanvaard wordt. Ik kan nog altijd niet begrijpen dat zoiets niet in een For/Next loop te gieten is. Maarja, we kunnen nu eenmaal de spelregels niet veranderen he.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan