Avatar billede dsj1972 Juniormester
07. februar 2010 - 00:39 Der er 21 kommentarer og
1 løsning

Hvordan kan jeg bruge min UserForm i flere dokumenter på en gang

Hejsa,

Jeg har lavet en Userform som skal lette indtastning af data (nogle gentagende) men disse data skal ind i flere dokumenter.

har f.eks
1 Cd etikette
1 Cd cover
1 tekst side

Userformen skulle så gerne kunne udfyldes på engang og så åbne disse dokumenter og derefter indsætte og til sidst udskrive på respektive printere alt efter hvilket dokument.

Kan det ikke lade sig gøre???

Håber der er nogle som har et bud!

mvh dsj
Avatar billede dsj1972 Juniormester
07. februar 2010 - 01:10 #1
Jeg har umiddelbart ikke kunne finde noget vedr. muligheden for at have flere dokumenter åben hvorved data kan indsættes.

Bruger iøvrigt DocumentVariables som reference.

Hvis det ikke kan lade sig gøre at have flere åbne og herved indsætte data kunne man så alternativt sætte kode på En print event ud for hvert dokument og stadig beholde Userform åben indtil den afsluttes f.eks med en Afslut knap

Bare en tanke

mvh dsj
Avatar billede Lene Fredborg Ekspert
07. februar 2010 - 10:47 #2
Vil du gerne have de tre dokumenter sat sammen til ét, når du indsætter data? (Sådan forstod jeg det, du skrev ved spørgsmålet, hvor du linkede til dette spørgsmål).
Avatar billede dsj1972 Juniormester
07. februar 2010 - 14:26 #3
Hej Lene,

Tjae, det kunne være smartest på en måde.

Må hellere lige forklare det lidt bedre så du får en idé om hvad det er som jeg vil have.

jeg har nogle dokumenter 4-5 stk. som er selvstændige pga. det bl.a er nogle avery skabeloner som er overført i word via avery assistent.
Jeg har så lavet en menu styring hvorved jeg kan vælge hvordan jeg skal sammen sætte dokumenterne (dvs altså kun indsættelse af data)
Der er 3 forskellige hoved valg og inde i dem er der 3 foreskellige konfigurationer mht. hvilke felter som skal benyttes

Hvis jeg sætter flere dokumenter sammen til et hvis dette kan lade sig gøre så skal jeg i såfald lave forskellige udgaver som passer til valg.

Derfor spurgte jeg til om det kunne lade sig gøre at indsætte data fra userform i flere active dokumenter.
Men så vidt jeg har kunne lade mig forstå så kan man kun have et aktivt dokument.

spørg gerne ind til andre ting på dette hvis det kan hjælpe på forståelsen for mit problem.

mvh dsj
Avatar billede Lene Fredborg Ekspert
07. februar 2010 - 15:23 #4
Der kan kun være et dokument aktivt ad gangen, men via VBA kan du styre arbejdet med alle de dokumenter, du ønsker...

Du kan f.eks. gøre noget i denne retning:

Gem hver af dine opsætninger til de forskellige typer dokumenter som skabeloner (3 eller flere - det har du måske allerede gjort) - her kaldt Skabelon1.dot, Skabelon2.dot og Skabelon3.dot. Opret i hver a skabelonerne Document Variables med enslydende navne (måske det, du allerede har gjort). I skabelonerne kan værdierne af disse variable være neutrale (f.eks. = navnet på variablen). Indsæt i dokumenterne felter af typen DocVariable, som skal hente værdierne af de forskellige variabler (måske det, du allerede har gjort). Disse værdier skal du så have udskiftet med det, du indtaster i din UserForm, og det kan du gøre efter disse principper:

Indsæt i din UserForm denne linje i en den procedure, der køres, når du f.eks. klikker på en CommandButton, "Opret og udskriv dokumenter" eller noget i den retning:

    CreateDocsWithUserFormInput strVal1:=TextBox1.Value, strVal2:=TextBox2.Value, strVal3:=TextBox3.Value

Linjen kalder den makro, der er vist nedenfor, og den sender værdierne fra din UserForm med.

BEMÆRK: TextBox1, 2 og 3 er her dem, der indeholder de data, du vil have indsat.

Generelt er det en god idé at give alle Controls og variable sigende navne, men jeg har blot brugt neutrale navne her.

Indsæt så i koden under din UserForm eller i et alm. kode-modul i samme dokument/skabelon følgende makro (her lavet som en Function):


Function CreateDocsWithUserFormInput(strVal1 As String, strVal2 As String, strVal3 As String)
    Dim oDoc As Document
   
    Dim oArray As Variant
    Dim n As Long
   
    'Lav array med de 3 (eller flere) skabelonnavne - udskift med korrekte stier/navne
    oArray = Array("C:\Skabelon1.dot", "C:\Skabelon1.dot", "C:\Skabelon3.dot")
   
    'Opret 3 (eller flere) dokumenter på basis af dine skabeloner
    'Opdater værdierne af variable
    'Opdater felter
    For n = LBound(oArray) To UBound(oArray)
        'Opret dokument
        Set oDoc = Documents.Add(Template:=oArray(n))
        'Opdater variable
        With oDoc
            .Variables("Var1").Value = strVal1
            .Variables("Var2").Value = strVal2
            .Variables("Var3").Value = strVal3
            'Opdater felter
            .Fields.Update
            'Print og luk uden at gemme - eller hvad du nu har brug for
            .PrintOut
            .Close savechanges:=wdDoNotSaveChanges
        End With
    Next n
       
    'Ryd op
    Set oDoc = Nothing
End Function


NB Hvis dine DocVariable felter findes andre steder end i hovedområdet af skabelonerne (f.eks. i hoved/fod), skal du sikre, at alle felter bliver opdateret. I stedet for blot ".Fields.Update" kan du bruge en makro, som opdatere alle felter. Du kan finde en sådan her:
http://wordblog.thedoctools.com/#post38
Avatar billede dsj1972 Juniormester
07. februar 2010 - 15:43 #5
Hej Lene,

Nåe ja det var jo en måde at gøre det på, det vil jeg prøve at passe ind.

Er det muligt med den kode at lave udprint på forskellige printere.

altså således at skabelon1 printes ud på printer1
skabelon2 printes ud på printer2

skabelon3 printes ud på printer3

eller skal man lave en seperat printout kode for hver udprint.

Forstået sådan at din kode ligges ind i f.eks 3 forskellige Print commandoer lagt på 3 knapper.

Smartest ville det jo være at det hele blev bestemt i kode via f.eks option buttons som jeg allerede nu har lavet til at vælge sig ind på den type opgave der skal laves.


Jeg har jo nogle forskellige valg så det bliver en hulens masse If sætninger tror jeg, men der er nok ikk nogen nemmere udvej ;-)

mvh dsj
Avatar billede dsj1972 Juniormester
07. februar 2010 - 15:45 #6
Øhh nu jeg lige kigger koden igennem, så læser jeg det lidt som om at den henter de 3 skabeloner frem og samler som et dokument.

eller det er måske forkert opfattet?
Avatar billede Lene Fredborg Ekspert
07. februar 2010 - 16:29 #7
Dokumenterne bliver ikke samlet til et dokument. De bliver behandlet hver for sig. Koden kører igennem løkken for hver af de skabeloner, du lister i dit array.

Du kan godt styre udskrift på forskellige printere. Princip: Gem den nuværende printerindstilling, vælg printer, kør kode, sæt indstilling tilbage til den oprindelige:

Dim strPrinter As String

Før du udskriver, så gem den nuværende indstilling:

strPrinter = ActivePrinter

'Indsæt den kode, der skal afvikles
'Valg af printer:
ActivePrinter = "[erstat med det korrekte navn på printeren]"
ActiveDocument.PrintOut

'Sæt printer tilbage til den oprindelige
ActivePrinter = strPrinter

Du kan finde diverse kode til styring af printere under overskriften "Working with printers" på denne side:
http://word.mvps.org/FAQs/MacrosVBA/index.htm
Avatar billede dsj1972 Juniormester
07. februar 2010 - 20:05 #8
Når man kører en Array i løkke, hvordan kan man så lige indsætte print styring således at når:

Skabelon1 køres så udskrives denne på printer1
skabelon2 køres så udskrives denne på printer2
skabelon3 køres så udskrives denne på printer3

kan man på en måde lave en kode som opfanger hvilken skablon som løkken kører og derfra springer ned til en printhændelses kode
Avatar billede Lene Fredborg Ekspert
07. februar 2010 - 22:12 #9
Der er flere muligheder. Du kan f.eks. lave et ekstra array, hvor du definerer printere i den rækkefølge, der passer til skabelon-array'et:

Se denne version af den Function, jeg postede tidligere:


Function CreateDocsWithUserFormInput(strVal1 As String, strVal2 As String, strVal3 As String)
    Dim oDoc As Document
    Dim strPrinter As String
    Dim oArray As Variant
    Dim oArrayPrinter As Variant
    Dim n As Long

    'Gem information om printer
    strPrinter = ActivePrinter

    'Lav array med de 3 (eller flere) skabelonnavne - udskift med korrekte stier/navne
    oArray = Array("C:\Skabelon1.dot", "C:\Skabelon1.dot", "C:\Skabelon3.dot")

    'Lav array med de 3 (eller flere) printernavne - udskift med navne
    oArrayPrinter = Array("Printer1", "Printer2", "Printer3")
   
    'Opret 3 (eller flere) dokumenter på basis af dine skabeloner
    'Opdater værdierne af variable
    'Opdater felter
    For n = LBound(oArray) To UBound(oArray)
        'Opret dokument
        Set oDoc = Documents.Add(Template:=oArray(n))
        'Opdater variable
        With oDoc
            .Variables("Var1").Value = strVal1
            .Variables("Var2").Value = strVal2
            .Variables("Var3").Value = strVal3
            'Opdater felter
            .Fields.Update
            'Print og luk uden at gemme - eller hvad du nu har brug for
            'Sæt tilhørende printer - samme plads i printer-array
            ActivePrinter = oArrayPrinter(n)
            .PrintOut
            .Close savechanges:=wdDoNotSaveChanges
        End With
    Next n
       
    'Ryd op
    Set oDoc = Nothing
    'Stil printervalg tilbage
    ActivePrinter = strPrinter
End Function
Avatar billede dsj1972 Juniormester
08. februar 2010 - 18:44 #10
Hej Lene,

Prøvede din kode som test og det gik fint.
Men for at kunne vælge ud så vil jeg lige spørge om det er muligt at lave flere Array´s ud fra valg på Optionbutton

Forestiller mig at det er noget a´la sådan her, men er ikk nogen ekspert.

If optValg1.Value = True Then GoTo oArray1 '(skab1, skab3, skab5)
If optValg2.Value = True Then GoTo oArray2 '(skab1, skab2, skab7)
IfoptValg3.Value = True Then GoTo oArray3 '(skab2, skab3, skab4)

skal man lave en Function for hver af disse Arrays for at kunne kalde dem???

mvh dsj
Avatar billede Lene Fredborg Ekspert
08. februar 2010 - 22:37 #11
Jeg håber, jeg forstår din forklaring rigtigt. Det er jo somme tider lidt svært at komme med en præcis løsning uden at have set den eksisterende kode, som den ser ud.

Du kan f.eks. sende værdien af optButton-valget med som en ekstra parameter til den eksisterende function (her lavet, så det er en Long, "nOpt", som du kan sende med som 1, 2 eller 3 afhængigt af, hvilken option, der er valgt i din UserForm. I stedet for første linje:

Function CreateDocsWithUserFormInput(nOpt as long, strVal1 As String, strVal2 As String, strVal3 As String)

I stedet for linjen:
    oArray = Array("C:\Skabelon1.dot", "C:\Skabelon1.dot", "C:\Skabelon3.dot")

kan du så lave 3 varianter, f.eks. sådan:

'Tjek værdien af nOpt og brug værdier i dit array derefter:
Select case nOpt
  Case 1
        oArray = Array("C:\Skabelon1.dot", "C:\Skabelon3.dot", "C:\Skabelon5.dot")
    Case 2
        oArray = Array("C:\Skabelon1.dot", "C:\Skabelon2.dot", "C:\Skabelon7.dot")
    Case 3
        oArray = Array("C:\Skabelon2.dot", "C:\Skabelon3.dot", "C:\Skabelon4.dot")
End Select

Resten af koden kan være uændret. Hvis der skal bruges forskellige printere afhængigt af nOpt, kan du lave dit printer-array efter samme princip.
Avatar billede dsj1972 Juniormester
09. februar 2010 - 19:06 #12
Ja forstår godt hvad du mener med forsåelsen af koden, egentlig kunne jeg godt smide koden op, men den er i så mange dele at jeg næsten var sikker på at det ville forvirre her, da det jo opstilles som ren tekst herinde i forummet.

Jeg er ikke sikker på at jeg forstår dit kode forslag rigtigt.
NOpt As Long ' er det for en option button eller er det alle

Jeg har mange option buttons på min Userform men det er kun tre bestemte som jeg kunne tænke mig skulle indgå i Array, så derfor forstår jeg ikke helt hvordan der kan læses værdi på lige de bestemte 3 option buttons og hvordan valg derefter defineres om den er sand eller falsk

Er det sådan at man skal lave en:

nOpt1 = optValg1
nOpt2 = optValg2
nOpt3 = optValg3

og så derefter smide disse tre nOpt ind i Function linien???

Mvh dsj
Avatar billede Lene Fredborg Ekspert
09. februar 2010 - 22:51 #13
Jeg prøver, om jeg kan forklare det yderligere...

Da jeg skrev den sidste kode med "Select Case"-linjerne, forestillede jeg mig, at du for hver gang du bruger din UserForm kun vil køre én af udskriftskombinationerne (ét sæt bestående af 3 dokumenter baseret på 3 forskellige skabeloner).

Lad os sige, at du i din UserForm har en OK-knap, som du har navngivet cmdOK. Når du klikker på denne knap, vil du have udskriften af dokumenterne med værdierne fra TextBox1, 2 og 3 til at ske. Derfor skal click-eventen for cmdOK indeholde kode, som får CreateDocsWithUserFormInput til at køre med de rigtige værdier:

I din UserForm kan det se sådan ud:

Private Sub cmdOK_Click()
    Dim nMyOption As Long
   
    'Sæt nMyOption = 1, 2 eller 3 afhængigt af hvilken af de 3 specifikke OptionButtons, der er True (udskift optVal1, 2 og 3 med de rigtige navne):

    If optVal1.Value = True Then
        nMyOption = 1
    ElseIf optVal2.Value = True Then
        nMyOption = 2
    ElseIf optVal3.Value = True Then
        nMyOption = 3
    End If

    'Kør udskrivningsmakro - send det rigtige knapvalg (nMyOption) med + tekstindholdet, der skal indsættes
    CreateDocsWithUserFormInput nOpt:=nMyOption, strVal1:=TextBox1.Value, strVal2:=TextBox2.Value, strVal3:=TextBox3.Value
End Sub


----------------------
Her er hele Function-koden, hvor "Select Case"-linjerne + nOpt er indsat (dvs. jeg har sammensat koden, som jeg forklarede i sidste post):


Function CreateDocsWithUserFormInput(nOpt As Long, strVal1 As String, strVal2 As String, strVal3 As String)
    Dim oDoc As Document
    Dim strPrinter As String
    Dim oArray As Variant
    Dim oArrayPrinter As Variant
    Dim n As Long

    'Gem information om printer
    strPrinter = ActivePrinter

    'Lav array med de 3 (eller flere) skabelonnavne - udskift med korrekte stier/navne
    'Tjek værdien af nOpt og brug værdier i dit array derefter:
    Select Case nOpt
      Case 1
            oArray = Array("C:\Skabelon1.dot", "C:\Skabelon3.dot", "C:\Skabelon5.dot")
        Case 2
            oArray = Array("C:\Skabelon1.dot", "C:\Skabelon2.dot", "C:\Skabelon7.dot")
        Case 3
            oArray = Array("C:\Skabelon2.dot", "C:\Skabelon3.dot", "C:\Skabelon4.dot")
    End Select

    'Lav array med de 3 (eller flere) printernavne - udskift med navne
    oArrayPrinter = Array("Printer1", "Printer2", "Printer3")
   
    'Opret 3 (eller flere) dokumenter på basis af dine skabeloner
    'Opdater værdierne af variable
    'Opdater felter
    For n = LBound(oArray) To UBound(oArray)
        'Opret dokument
        Set oDoc = Documents.Add(Template:=oArray(n))
        'Opdater variable
        With oDoc
            .Variables("Var1").Value = strVal1
            .Variables("Var2").Value = strVal2
            .Variables("Var3").Value = strVal3
            'Opdater felter
            .Fields.Update
            'Print og luk uden at gemme - eller hvad du nu har brug for
            'Sæt tilhørende printer - samme plads i printer-array
            ActivePrinter = oArrayPrinter(n)
            .PrintOut
            .Close savechanges:=wdDoNotSaveChanges
        End With
    Next n
       
    'Ryd op
    Set oDoc = Nothing
    'Stil printervalg tilbage
    ActivePrinter = strPrinter
End Function

----------------------------------------
Hjælper det?
Avatar billede dsj1972 Juniormester
09. februar 2010 - 23:26 #14
Hej Lene,

tak for dit svar,

Ja det var lige det jeg manglede tror jeg.....ser ihvertfald ud som det jeg ville hen på så det prøver jeg lige og vender tilbage imorgen.

Gód aften
Avatar billede dsj1972 Juniormester
10. februar 2010 - 13:14 #15
Hej Lene,

Jeg har prøvet koden og den ser rigtig nok ud, men får en fejl 13 på denne linie:

For n = LBound(oArray) To UBound(oArray)

Når man holder musen hen over den gulemarkering så skriver den at LBound(oArray) er tom og UBound(oArray) "type Mismatch"

under fejl "hjælp" står der noget om "type mismatch" noget med at Variant eller Property ikke stemmer overens hvis jeg tolker det rigtigt.

Har du en idé til hvad det kan være, eller vil du se hele kode??

Hvis den da kan være her i beskedboksen ;-)

Jeg ved ikk om det har nogen betydning men jeg har en knap på værktøjs bæltet som jeg lavede via 2003 og så lage over i 2007 men jeg gjorde den lille fejl at jeg lagde den ind i 2007 Normal skabelonen, hvilket jeg senere har fundet ud af ikke er nødvendigt. men denne knap kalder min Userform frem uden at nogle andre er åbne andet end Normal.dot.

mvh dsj
Avatar billede Lene Fredborg Ekspert
10. februar 2010 - 14:15 #16
Det er jo ved at udvikle sig til en hel roman ;-)

Tjek det, du har skrevet i dine arrays. Har du mon skrevet noget forkert?

I stedet for at køre koden via din knap, så prøv at steppe gennem koden i VBA ved at bruge F8. Hold øje med, hvad der sker, når du kommer til koden, hvor dine arrays skal defineres. Der er sikkert en fejl. LBound og UBound bruges til at finde første og sidste værdi i dit array.

Jeg er meget travlt optaget, så jeg kan ikke få tid til mere lige nu.
Avatar billede dsj1972 Juniormester
10. februar 2010 - 14:26 #17
Hej Lene,

Tak for dit svar.

Det er helt ok, jeg prøver mig lidt frem og du har sikkert ret at der sikkert er en lille fejl som jeg har overset.
Avatar billede dsj1972 Juniormester
11. februar 2010 - 14:01 #18
Hej Lene,

Jeg har fået koden til at virke, det var mig som havde .dotm på filerne, men det skal åbenbart altid være .dot uanset hvad der står under sti finder. dog har jeg lidt problemer med .fields.Update men finder ikke nogen fejl på koden, det kommer også over på ark, men er ikke synligt før jeg manuelt laver update af felter.

Iøvrigt vil jeg lige sige at det var ikke dig som forklarede forkert, du beskriver meget flot tingende og det er dejligt.
Jeg var nok bare lige lidt for tungnem på det tidspunkt og kunne ikke lige gennemskue hvordan den Case kunne finde værdien.
Havde jeg været lidt kvikkere kunne jeg måske nok selv havde indset at man kunne lave en nMyOption, hvilket egentlig også var det jeg ville hen på i mit oplæg 09-02-2010 kl. 19.06.

Du har ret, det bliver hele tiden større, har en slem tendens til at finde på nye smarte ting man kan putte ind så det bliver lettere. f.eks nu har jeg sat mig for at jeg vil have nogle få af de data som bliver indtastet over i et excel ark, som en slags arkiv/registrering men det tager jeg i nyt spørgsmål.

Du skal have dine velfortjente point, så smid et svar.
Avatar billede Lene Fredborg Ekspert
11. februar 2010 - 14:43 #19
Svar kommer her. Jeg ved ikke helt, om der var noget, jeg skulle svare på i din sidste post ;-)

Skabelonerne: typen (.dot/.dom) i makrokoden skal passe til filerne, så jeg forstår ikke helt det, du skriver.

Jeg husker stadig, at jeg selv i første omgang fandt det lidt svært at forstå funktioner og det med at sende parametre med, da jeg kastede mig over det for længe siden.

God fornøjelse med fortsættelsen af projektet.
Avatar billede dsj1972 Juniormester
11. februar 2010 - 15:00 #20
Hej Lene,

Ja, altså jeg havde gemt skabeloner som skabelon med macro disse læsses som skabelon.dotm og en almindelig skabelon læses som skabelon.dotx, men af en eller anden grund ville den Array ikke acceptere andet end skabelon.dot, ved ikk om det kan skyldes at den kun kan læse filtyper på 3 bokstaver som det har været standard med i mange år.

Men det var ihvertfald det som var fejlen, det antager jeg da ihverfald for da jeg rettede det så virkede det.

Jeg har programmeret meget til PLC (elektrisk styring) og har derfor nogen forståelse for funktioner, mit handicap er begreberne, som man åbenbart skal lærer selv hen af vejen for har ikke som sådan kunne finde opslagsværker for sådan noget.

Takker for din hjælp.!!
Avatar billede dsj1972 Juniormester
12. februar 2010 - 11:53 #21
Hej Lene,

Det jeg skrev at jeg havde problemer med .Fields.Update,

Den linie havde ihvertfald ingen virkning,
Men så skiftede jeg det ud med en anden måde som beskrevet i de links du tidligere gav mig. og der ser ud til at virke nu.

mvh dsj
Avatar billede Lene Fredborg Ekspert
12. februar 2010 - 12:30 #22
Det lyder jo godt. Som skrevet, så virker .Fields.Update ikke globalt i et dokument.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Tag et kursus i Word og øg effektiviteten

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester