Når jeg forsøger at ændre standardbrevet til en formular, hvor jeg laver tekstfelter de øvrige steder hvor brugeren selv skal udfylde tekst, så kan jeg ikke umiddelbart beskytte formularen, da Call InsertAtBookmark -funktionen ikke virker, da formularen jo er beskyttet.
Kan man:
1) Lave bookmark i et tekstfelt? Eller 2) Beskytte en formular delvist, som man kan med Excel?
Et alternativ var at opbygge den primære kode i et Word-dokument (Menu-system m.v.). Herfra kunne data hentes fra databasen (evt. via SQL-kald) og anvendes i andre word-dokumenter/skabeloner
Når jeg laver den slags løsninger for mine kunder, plejer at starte den procedure, der bliver kaldt - i dit tilfælde InsertAtBookmark-proceduren - med at teste på, om dokumentet er låst med én eller anden form for beskyttelse. Jeg aflæser typen af beskyttelse (som jo typisk er "formularer"), fjerner dokumentbeskyttelsen, afvikler al nødvendig kode, og låser dokumentet igen, "reset" af formularfelter sat til false.
Her får du et kodeeksempel:
Sub TestProcedure_ProtectedDocument() Dim intProtectionType As Integer
'hvis dokumentet er beskyttet, fjern beskyttelsen If ActiveDocument.ProtectionType <> wdNoProtection Then ActiveDocument.Unprotect End If
'Kør nu al den kode, som skal afvikles i Word-dokumentet, her lidt dummy-kode ActiveDocument.Paragraphs(1).Range.Text = "Dokumentet er nu ikke længere låst"
'Lås dokumentet igen med den aflæste beskyttelsestype og sørg for 'at eventuelle formularfelter ikke bliver ryddet (reset) If intProtectionType <> wdNoProtection Then ActiveDocument.Protect Type:=intProtectionType, noreset:=True End If
Jeg har tidligere implementereret koderne i en db for erlandsen, som nu har bedt mig se på dit svar og implementere det i databasen.
Men jeg kan ikke få Access til at ophæve beskyttelsen. Koden der kalder InsertAtBookmark ser således ud:
Private Sub Kommandoknap42_Click() Dim objword As New Word.Application Dim WordDoc As New Word.Document Dim VARa As String Dim VARb As String Dim intprotectionType As Integer On Error GoTo errorhandler Set WordDoc = objword.Documents.Add("E:\Erlandsen\Match 1-3 - Udeblivelse.doc")
If ActiveDocument.ProtectionType <> wdNoProtection Then ActiveDocument.Unprotect End If
Function InsertAtBookmark(objWordDoc As Word.Document, strBookmark As String, strText As String) As Boolean Dim intprotectionType As Integer 'aflæs beskyttelsestypen intprotectionType = ActiveDocument.ProtectionType 'hvis dokumentet er beskyttet, så fjern beskyttelse 'If ActiveDocument.ProtectionType <> wdNoProtection Then 'Debug.Print intprotectionType 'ActiveDocument.Unprotect 'End If With objWordDoc.Bookmarks If .Exists(strBookmark) Then .Item(strBookmark).Range.Text = strText InsertAtBookmark = True End If End With 'If intprotectionType <> wdNoProtection Then 'ActiveDocument.Protect Type:=intprotectionType, noreset:=True End Function
Som du ser, har jeg også prøvet at indsætte din koden i denne funktion, men uden held.
Jeg skal medgive, at jeg langt fra er "gode venner" med Word
Du kan godt fjerne koden med dokumentbeskyttelse fra funktionen InsertAtBookmark - den er unødvendig, da du gør det korrekt med at låse dokumentet op, så snart du har oprettet dokumentet.
Men prøv lige at skifte "ActiveDocument" ud med "objWordDoc" (alle de steder, hvor koden refererer til det", da du jo sætter objectvariablen objWordDoc til at være det dokument, du netop har oprettet. Så i stedet for "ActiveDocument.unprotect" osv. skal du altså skrive "objWordDoc.unprotect" osv.
Hovsa, jeg kom til at skrive "objWordDoc", men jeg kan se, at din variabel hedder WordDoc. Så du skal udskifte ActiveDocument med WordDoc. Sorry for forvirringen.
Jeg kom lige til at kigge nærmere på din kode, da jeg ville prøve at teste den. Og den er ikke i orden.
Du glemmer at sætte variablen intProtectionType til noget, inden du fjerner dokumentbeskyttelsen. Altså får denne variabel aldrig en værdi, og du får aldrig beskyttet dokumentet igen.
Derudover har du ingen "Exit sub" imellem selve koden og fejlhåndteringen, så fejlhåndtering afvikles uanset om der sker fejl i koden eller ej.
Jeg har testet din kode, efter jeg har rettet den, og den virker fint med mit låste testdokument. Her får du den tilrettede kode:
Private Sub Kommandoknap42_Click() Dim objword As New Word.Application Dim WordDoc As New Word.Document Dim VARa As String Dim VARb As String Dim intprotectionType As Integer
On Error GoTo errorhandler
Set WordDoc = objword.Documents.Add("E:\Erlandsen\Match 1-3 - Udeblivelse.doc")
If WordDoc.ProtectionType <> wdNoProtection Then 'sæt variablen til beskyttelsestypen, inden beskyttelsen fjernes intprotectionType = WordDoc.ProtectionType WordDoc.Unprotect End If
Function InsertAtBookmark(objWordDoc As Word.Document, strBookmark As String, strText As String) As Boolean With objWordDoc.Bookmarks If .Exists(strBookmark) Then .Item(strBookmark).Range.Text = strText InsertAtBookmark = True End If End With End Function
Tak for dine svar. Har ikke lige tid til at teste den nu - Men fungere den (og hvorfor skulle den ikke det), lægger jeg 100 point oveni. Det er en kode jeg sagtens selv kan anvende på arbejdet.
Tak, det er fornemt. Omkring min test vil jeg blot tilføje, at jeg erstattede din databasetekst til bogmærkerne med "dummy" tekststrenge, testede på mig eget lokale låste dokument, samt udkommenterede de dele af din kode, hvor du tilgår ting, jeg ikke har adgang til (f.eks. i fejlhåndteringen). Så al den vitale del omkring kald af dokument, oplåsning af dokument og indsættelse af tekst i bogmærkerne, og efterfølgende låsning fungerede smukt. Så du kan godt regne med, at det virker, hvis du ellers ikke har lavet fejl i de kodelinjer, jeg ikke kan teste på :-).
Så vidt jeg kan se fungerer det upåklageligt. Jeg har implementeret koden i en testdb og sendt den til erlandsen. Så ser vi hvilket svar der kommer derfra, når db er afprøvet.
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.