VBA, Word 2007, Procedure te groot

Status
Niet open voor verdere reacties.
Ik begrijp dat er verschillende elementen zijn. Als ik de textbox bijvoorbeeld niet ct_005 noem (om te voorkomen dat een andersoortig element in de array komt) maar txt_000, dan maakt dat voor de foutmelding op onderstaande code niet uit. Werkelijk, ik heb geen idee hoe textboxen nu te gebruiken.
Code:
.Variables("ct_" & Format(j, "000")) = IIf(Me("ct_" & Format(j, "000")), sn(j), " ")

Overigens, onderstaande code verschilt met de code die ik eerder gebruikte om data weg te schrijven naar excel, met het resize(, 550) en de = sn. Zover ik dat begrijp geef je de range van de kolommen aan en stel je de input gelijk aan de array sn. Ook het aangeven dat er pas weggeschreven kan worden vanaf rij 4 (tbl.Rows.Count - 3) los niets op. de foutmelding op onderstaande code blijft.
Code:
sheets(1).Cells(Rows.Count,1).End(xlup).Offset(1).Resize(, 550) = sn

be advised.

Bekijk bijlage Van userform via array naar excel en document - v2.zip
 
Gebruik F8 om de code stap voor stap door te lopen.

1. kijk eerst naar het userform: geen 'captions'
2. kijk naar het document Alt-F9 en hoe de opmaak van de documentvariabelen is aangepast.
3. kijk naar de macro in This workbook waar de teksten uit de documentvariabele 'teksten" worden geladen
4. Kijk naar de Initialize gebeurtenis van het Userform waar alle controls van 'captions/ worden voorzien vanuit de teksten in de documentvariabele 'teksten'
5. Zorg dat er onderbrekingspunten staan bij kop_document en knop_database
6. Start het userform en klik wat elementen aan en voer tekst in in het tekstvak.
7. klik op de knop docuemnt en kijk stap voor stap wat er gebeurt
8. Doe 7 ook voor de knop database.
 

Bijlagen

2. Wat kun je veel met de documentvariabelen; boeiend. Ik zie dat je daar tekens kunt invoeren als het tussen aanhalingstekens staat.
3. Hoe breek je de code af in Sub M_snb ? Een underscore lijkt niet te werken.
4. Nu de captions gelijk zijn aan de tekstvariabele dat om het eenduidig te krijgen en nadien efficient te werken.
5. Ik heb de rode onderbrekingspunten in de code uitgeprobeerd. Het onderbrekingspunt op onderstaande regel geeft een stop.
Code:
.sheets(1).Cells(Rows.Count, 1).End(xlup).Offset(1).Resize(, UBound(sn) + 1) = sn
Een onderbrekingspunt op onderstaande code geeft een foutmelding; Object vereist. Bij foutopsporing wordt bovenstaande code geel gearceerd.
Code:
.Close True
In het path:\ zitten geen fouten, ook het wissen van het excel bestand maakt geen verschil.

ik durf het bijna niet meer te vragen maar helpmij
 

Bijlagen

Een coderegel kun je in meerdere regels opsplitsen door er & _ achter te zetten.
Heel handig voor de leesbaarheid. Dus voor de duidelijkheid: spatie&spatie_
 
Les 1 in Excel VBA: vermijd 'select' en 'activate'
Les 2 in Excel VBA: gebruik nooit samengevoegde cellen
 
@ snb, ik heb echter al een nieuw excel bestand aangemaakt (vermoedde een probleem met het bestand) maar de foutmelding blijft.

@ edmoor, ik heb eerder die manier gebruikt en toen werkte het goed (zelfs zonder &-teken, waarbij overigens de plek waar je de underscore invoert wel bepalend lijkt) Nu niet ... de regel wordt direct rood; compileerfout. VBA vindt het verticale scheidingsstreepje een ongeldig teken.

Code:
.Variables("CBdystonieManifestAct1") = IIf(CBdystonieManifestAct1, _
"Dystonie doet zich voor tijdens een bepaalde activiteit" & TXTdystonieActiviteit.Text, " ")
    
[COLOR="#FF0000"].Variables("CBdystonieManifestAct1") = IIf(CBdystonieManifestAct1, "Dystonie _
doet zich voor tijdens een bepaalde activiteit" & TXTdystonieActiviteit.Text, " ")[/COLOR]
 
Je gebruikt het nu midden in een start- en endquote (""). Dat gaat uiteraard niet omdat de _ dan als tekst wordt opgenomen in plaats van geïnterpreteerd als opdracht.
 
Ik moet net zoveel zoeken als jij, dus kun jij het ook.
Welke regel geeft de foutmelding.
Kijk in het hulpscherm 'local' naar de waarden van de variabelen, hang met je cursor boven een variabele dan zie je de waarde ook.

ook het wissen van het excel bestand maakt geen verschil
Van trial en error worden we niet wijzer.
Analyseer de code, dan zie je hoe je het funktioneren kunt testen;
bijv. door voor die regel eerst dit te zetten:

Code:
msgbox sheets(1).name
.sheets(1).Cells(Rows.Count, 1).End(xlup).Offset(1).select
 
Laatst bewerkt:
Ik ga kijken met het hulpscherm. De regel die de foutmelding geeft is:
Code:
sheets(1).Cells(Rows.Count, 1).End(xlup).Offset(1).Resize(, UBound(sn) + 1) = sn
 
precies edmoor, niet heel handig van mij om andere codes te gebruiken. Het gaat om het afbreken van onderstaande regel
Code:
Sub M_snb()
    ThisDocument.Variables("Teksten") = "Aspartaam |Glucose|Lithium|Carbamezapine|in tabletvorm|in depotvorm |mg.|frequentie "
End Sub
 
Die kun je dan direct achter het = teken afbreken.
 
alleen is dat niet de bedoeling. ik moet van mijn 'vaste teksten' af (snb #14)
 
snb, ik heb een foutmelding gekregen toen ik ging werken met het hulpscherm: "kan een bestandsnaam of klassennaam niet vinden tijdens een automatiseringsbewerking"
 
Laatst bewerkt:
Vaste teksten kun je ook opslaan in een tekst bestand die je bij het openen van het document dan inleest.
Ook zou je ze in Constant variabelen buiten de procedures kunnen zetten.
Als je veel teksten meerdere malen nodig hebt is dat sowieso aan te bevelen.
Daarnaast is het dan erg eenvoudig een product in meerdere talen te leveren, mocht dat relevant zijn.
 
Tjonge jonge, er stond plots een komma in de naam van het bestand. Nu die weg is gehaald klopt de naam weer en resteerd de foutmelding dat een object vereist is.
 
Zie de 3 bijlagen.
Zet ze in dezelfde direcotry, dan kan verwezen worden in de macro naar ThisDocument.Path.
Ik heb de 573 namen van de 'velden' in gelezen in de documentvariabele 'velden' in het document.
Het lijkt me verstandig voor de veldnamen en de overige teksten aparte documentvariabelen te gebruiken , en dus ook aparte variabelen in VBA.
Het lijkt me eveneens verstadn dit Wordbestadn 'invoer' te noemen en een apart bestadn te maken met de naam 'rapport.docx'. Dat rope je dan aan met Documents.add Thisworkbook.path & "\rapport.docx"
Aan de 'database' macro heb ik kleine wijzigingen aangebracht die het gevolg zijn van 'late binding'.

De invoer van de teksten in een Docuemntvaraibele:

- maak een wordbestand met per regel een aparte tekst die je nodig hebt.
- die teksten kunnen daarna eenvoudig in een documentvariabele worden gezet met variables("teksten")= replace(activedocument.content,vbcr,"|")
 

Bijlagen

Als mijn schoonmoeder belt met een computerprobleem en ik tevergeefs vele ogenschijnlijk logische oplossingen heb aangedragen, dan overvalt mij op een gegeven het gevoel van moedeloosheid. Ik kan mij voorstellen dat ook ik dit gevoel nu bij jullie oproep :d Want ondanks alles lukt het niet. Als blijk van waardering wordt ik wel donateur van helpmij.nl

Zie de 3 bijlagen.
Zet ze in dezelfde direcotry, dan kan verwezen worden in de macro naar ThisDocument.Path.
Ik heb de bestanden in eenzelfde map gezet. Met de drie bestanden (5 zijn ingesloten in zip) doel je op:
- __userform snb 002 (het eigenlijke invulformulier)
- rapport (voor het uiteindelijke verslag)
- __Consult snb (de database)

Ik heb de 573 namen van de 'velden' in gelezen in de documentvariabele 'velden' in het document.
Je hebt de 573 namen van de velden (bijvoorbeeld "CBgezond"), ingelezen in de documentvariabele 'velden' in het document 'rapport'. Ik kan alleen die documentvariabele niet vinden/zien

Het lijkt me verstandig voor de veldnamen en de overige teksten aparte documentvariabelen te gebruiken , en dus ook aparte variabelen in VBA.
Je bedoeld om in het document 'rapport' (het uiteindelijke verslag) de DOCVARIABLE op te nemen zoals
Code:
{ IF {DOCVARIABLE ct_000} = " " "" " {DOCVARIABLE ct_000} " }

Het lijkt me eveneens verstandig dit Wordbestand 'invoer' te noemen en een apart bestand te maken met de naam 'rapport.docx'. Dat roep je dan aan met Documents.add Thisworkbook.path & "\rapport.docx"
Om het probleem van de invoer te omzeilen gebruik je de suggestie van edmoor #34.Omdat je hier zowel de tekst voor de variabelen invoert als met invoer van de gebruiker te maken hebt noem je het bestand 'invoer'. Voor het uiteindelijke rapport gebruik je het alzo genaamde word-bestand 'rapport'. In de macro 'knop_document' zie ik staan dat je het document "rapport.docx" aanroept. Het gekke is dat het de foutmelding 5151 geeft: Document kan niet door Word worden gelezen. het is mogelijk beschadigd. Dat terwijl het bestand wel regulier te openen is en het aanmaken van een nieuw bestand met de naam rapport blijft de foutmelding geven.

Aan de 'database' macro heb ik kleine wijzigingen aangebracht die het gevolg zijn van 'late binding'.
Een technische aanpassing om de foutmelding dat een object vereist is te verhelpen (with late binding, the code does not make an explicit reference to the type of object when the variable is declared. Instead, it will simply use the "Object" type) Toch lukt het wegschrijven van data niet. In het hulpscherm locale variabelen zie ik onder Me\Rowsource: kan de eigenschap rowsource niet verkrijgen. Me\Rowsourcetype: Kan lid niet vinden.

De invoer van de teksten in een Documentvariabele:
Dat is zo een beetje het enige dat goed gelukt is ...

Bekijk bijlage 1 Somatische screening snb.zip
 
Laatst bewerkt:
Wat ik wel irritant vind is dat je alle verbeteringen naar aanleiding van je vorige post ongedaan hebt gemaakt.
Die moest ik daarom opnieuw invoeren/testen.

Wijzig niets aan de bestanden.
Test ze alleen en geef daarover feedback.
Lees ook de begeleidende tekst in het bericht (over het gebruik van de 'velden' bijvoorbeeld)

In de bijlage de aangepaste 3 bestanden.
Pak ze uit in een aparte map.
Open het excelbestand en voer de gegevens in.

Wanneer je het Excelbestand opent wordt het onzichtbaar geladen. Maak het zichtbaar met Menu/View/unhide.
 

Bijlagen

Dat is niet met die bedoeling gedaan; excuses.

Geweldig, ik zie dat de elementen de namen krijgen van hetgeen in excel (reeds) is ingevoerd.

Als ik op de 'knop_document' klik, dan wordt er een document geopend en worden de invoer correct weggeschreven naar de velden in het document. Dan volgt er een foutmelding 438; eigenschap of methode wordt niet ondersteund door dit object. Geel gearceerd door foutopsporing:
Code:
.SaveAs2 ThisDocument.Path & "\rapport.001.docx" &

Als ik op de 'knop_database' klik, dan volgt er een foutmelding 1004; door de toepassing of door object defenieerde fout. Geel gearceerd door foutopsporing:
Code:
.sheets(1).Cells(.Application.Rows.Count, 1).End(-4162).Offset(1).Resize(, UBound(sn) + 1) = sn

Ik kan de begeleidende tekst niet vinden
 
.SaveAs2 ThisDocument.Path & "\rapport.001.docx" &
die ampersand aan het einde staat niet in het bestand dat ik plaatste.
als dit de tweede keer is dat je macro start doe je er goed aan het bestand rapport.001 eerst te verwijderen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan