09. marts 2007 - 09:27Der 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?
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.
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?
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
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?
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
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.
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
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.
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.
Synes godt om
Ny brugerNybegynder
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.