Avatar billede lsskaarup Nybegynder
09. marts 2007 - 09:27 Der er 12 kommentarer og
1 løsning

VBA: Lukke kun et dokument

Jeg har lavet nogle skabeloner i Word, der indeholder en userform, som brugerne skal udfylde for at få noget i f.eks. brevet.

Men brugeren kan på userformen trykke på annullere for at lukke den (hvis de skulle være kommet til at vælge den forkerte), og så bliver de spurgt om de vil lukke dokumentet uden at gemme det.

Hvis nu brgueren allerede har nogle dokumenter åbne, og så vælge at bruge en skabelon. Deri annullere de for at lukke userformen, MEN så lukker min kode, også alle de andre dokumenter uden at gemme dem. Det dur ikke.

Hvordan kan jeg sikre mig, at kun det dokument, som brugeren begyndte på, bliver lukket?
Avatar billede lsskaarup Nybegynder
09. marts 2007 - 09:44 #1
Okay, det er fordi jeg tidligere i koden skjuler dokumentet, så brugeren kun ser userformen indtil data bliver indsat i dokumentet.

Så jeg skal altså have koden til at fange det skjulte dokument og kun lukke det, hvis der ellers er flere dokumenter åbne. Det kunne egentlig også være dejligt, hvis det var tilfældet at der ikke var andre dokumenter åbne, at så selve word blev lukket samtidig.
Avatar billede lsskaarup Nybegynder
09. marts 2007 - 20:29 #2
Hmm, det ser ud til at det ikke kun er lukke funktionen der fanger alle de andre åbne dokumenter, min stavekontrol, save funktion og værste af alt beskyttelse af formular felter med kode, indgriber også på andre dokumenter.

Jeg opdagede det, da jeg testede en skabelon på en bruger pc, som have et andet dokument åbent. Skabelonen virkede fint, men da brugeren bagefter skulle arbejde videre i hans egent dokument, så var det blevet låst, fordi jeg beskytter skabelonen. Det holder ikke.

Kan man ikke på en eller anden måde, få makroen til blive udført, kun for skabelonen og ingen af de andre dokumenter?
Avatar billede rvm Nybegynder
12. marts 2007 - 20:03 #3
jeg ville sikre mig at jeg altid arbejdede i det rigtige dokument ved at oprette en variabel, som jeg indsatte navnet i:

Dim NytDok as String

NytDok = ActiveDocument.name

Når jeg så skulle tilgår noget i dokumentet kan jeg altid referere til NytDok:

NytDok.SaveAs ....
documents(NytDok).activate

i stedet for activedocument.saveas

Eller

documents(NytDok).activate

Angående det med at du lukker Word, så må du tælle aktive dokumenter lige når du har åbnet skabelonen

antal = Application.Documents.Count

If antal > 1 Then
    '  der er flere dokumenter åbne
Else
    'luk bare
End If
Avatar billede rvm Nybegynder
12. marts 2007 - 20:08 #4
Lidt uddybning:

Du kan også indsætte dit aktive dokument i et objekt og så bruge objektet. hver gang du skal tilgå dit dokument:

Sub test()
Dim myDok As Document

Set myDok = ActiveDocument

If myDok.ProtectionType <> wdAllowOnlyFormFields Then
    myDok.Protect True
End If

End Sub
Avatar billede lsskaarup Nybegynder
12. marts 2007 - 22:19 #5
Hvad er den bedste og mest korrekte måde at gøre det på, navnevariablen eller objektet?
Avatar billede rvm Nybegynder
13. marts 2007 - 08:08 #6
Det er 2 metoder, hvor du kommer lige langt ;-) Men den mest korrekte er nok den med objektet - spørg mig ikke hvorfor - er ikke stiv nok i teorien, men det er det ville blive brugt i f.eks. .Net eller VB
Avatar billede lsskaarup Nybegynder
13. marts 2007 - 12:24 #7
Når nu jeg kun har følgende kode i selve dokumentet

Private Sub Document_New()

    ' Finder brugernes navne og indsætter dem i combobox1
    startBoks.find_bruger
   
    ' Viser indtastningsformen
    startBoks.Show
End Sub

og resten i userformen

Hvor kan jeg så placere myDok?

Skal jeg lave en public sub i dokumentet, eller kan jeg bare ændre Document_New() til public?

Jeg kom også til at tænke på det der med at lukke dokumentet. Hvis jeg laver et objekt, kan jeg vel bare lukke det, så behøves jeg ikke at tælle hvor mange dokumenter der er åbne i forvejen eller hvad?
Avatar billede rvm Nybegynder
13. marts 2007 - 12:36 #8
Public myDok As Document

Private Sub Document_New()
 
    Set myDok = ActiveDocument

    ' Finder brugernes navne og indsætter dem i combobox1
    startBoks.find_bruger
   
    ' Viser indtastningsformen
    startBoks.Show
End Sub

Angående det med at lukke, så kan du ganske rigtigt lukke objektet, men det lukker du ikke Word af, hvis der kun er dit objekt åbent.
Avatar billede lsskaarup Nybegynder
13. marts 2007 - 13:18 #9
Hmm, nu har jeg tilpasset så jeg kalder et objekt, men nu er det ikke al kode der virker.

F.eks. kan jeg ikke få lov til at sige cancel til følgende.
ThisDocument.myDok.Save

og jeg kan heller ikke få lov til at lukke userformen via annullere

Private Sub cdAnnuller_Click()
If MsgBox("Vil du lukke uden at oprette og gemme brevet?", vbYesNo, "Lukke dokument") = vbYes Then
    startBoks.Hide
    ThisDocument.Close SaveChanges:=False
End If
End Sub
Avatar billede rvm Nybegynder
13. marts 2007 - 13:34 #10
ThisDocument er det dokument koden ligger i - altså din template - men du arbejder jo i et nyt dokument, der er lavet på baggrund af templeten, så derfor kan ThisDocument godt give fejl. Brug i stedet dit nye objekt.
Avatar billede lsskaarup Nybegynder
13. marts 2007 - 13:48 #11
Men jeg kan ikke fange myDok med mindre jeg bruger ThisDocument først.

Så lige at jag havde glemt myDok i cdAnnullere_Click() den skulle have været

Private Sub cdAnnuller_Click()
If MsgBox("Vil du lukke uden at oprette og gemme brevet?", vbYesNo, "Lukke dokument") = vbYes Then
    startBoks.Hide
    ThisDocument.myDok.Close SaveChanges:=False
End If
End Sub
Avatar billede word-hajen Nybegynder
31. marts 2007 - 21:39 #12
Hvad er egentlig årsagen til, at du vælger at skjule dokumentet, indtil brugeren har tastet det ønskede i dialogboksen? Du kan godt håndtere det skjulte dokument, som rvm har beskrevet, men hvis ikke der er en rigtig god grund til at skjule dokumentet, så lad være med det.
Avatar billede lsskaarup Nybegynder
01. april 2007 - 16:25 #13
Egentlig var det kun for at brugeren kun skulle se userformen indtil dokumentet blev udfyldt.

Jeg har også fået løst problemet ud fra rvm's svar, men kan ikke huske den præcises løsning, da jeg sidder hjemme lige nu.
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