Avatar billede erlandsen Seniormester
12. juli 2009 - 08:46 Der er 9 kommentarer og
1 løsning

Beskyt formular og InsertAtBookmark fra Access

Jeg har en Access database hvorfra jeg åbner nogle standardbreve og samtidig overfører kontaktinformationer fra via denne call funktion:

Call InsertAtBookmark(WordDoc, "Udtryk1", Me!Udtryk1)

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?
Avatar billede supertekst Ekspert
12. juli 2009 - 17:52 #1
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
Avatar billede Wordspecialisten Nybegynder
15. juli 2009 - 14:31 #2
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
   
    'Aflæs beskyttelsestypen
    intProtectionType = ActiveDocument.ProtectionType
   
    '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
   
   
End Sub
Avatar billede mugs Novice
16. juli 2009 - 10:08 #3
Wordspecialisten >

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

Call InsertAtBookmark(WordDoc, "Udtryk1", Me!Udtryk1)
Call InsertAtBookmark(WordDoc, "adresse", Me!Adresse)
Call InsertAtBookmark(WordDoc, "egn", Me!Egn)
Call InsertAtBookmark(WordDoc, "postnr", Me!PostNr)
Call InsertAtBookmark(WordDoc, "by", Me!By)
objword.Visible = True
DoCmd.Hourglass False

If intprotectionType <> wdNoProtection Then
ActiveDocument.Protect Type:=intprotectionType, noreset:=True
End If

errorhandler:
MsgBox "Fejlkode: " & Err.Number & vbNewLine & "Fejlbeskrivelse: " & Err.Description
VARa = Left(CPRnr, 6)
VARb = Right(CPRnr, 4)
Me.brevsti = "F:\borgere\" & VARa & "-" & VARb & "\Match 1 til 3 Udeblivelse.doc"

End Sub

InsertAtBookmark:

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
Avatar billede Wordspecialisten Nybegynder
16. juli 2009 - 12:08 #4
Hej,

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.
Avatar billede Wordspecialisten Nybegynder
16. juli 2009 - 12:17 #5
Hej igen,

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.
Avatar billede Wordspecialisten Nybegynder
16. juli 2009 - 12:30 #6
Hej igen,

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
   
Call InsertAtBookmark(WordDoc, "Udtryk1", Me!Udtryk1)
Call InsertAtBookmark(WordDoc, "adresse", Me!Adresse)
Call InsertAtBookmark(WordDoc, "egn", Me!Egn)
Call InsertAtBookmark(WordDoc, "postnr", Me!PostNr)
Call InsertAtBookmark(WordDoc, "by", Me!By)

objword.Visible = True
    DoCmd.Hourglass False
   
    If intprotectionType <> wdNoProtection Then
        WordDoc.Protect Type:=intprotectionType, noreset:=True
    End If

    'afslut proceduren, så fejlhåndtering ikke afvikles, hvis der ikke er fejl
    Exit Sub
   
errorhandler:
    MsgBox "Fejlkode: " & Err.Number & vbNewLine & "Fejlbeskrivelse: " & Err.Description
    VARa = Left(CPRnr, 6)
    VARb = Right(CPRnr, 4)
    Me.brevsti = "F:\borgere\" & VARa & "-" & VARb & "\Match 1 til 3 Udeblivelse.doc"

End Sub

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
Avatar billede mugs Novice
16. juli 2009 - 12:57 #7
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.
Avatar billede Wordspecialisten Nybegynder
16. juli 2009 - 14:18 #8
Hej igen,

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å :-).
Avatar billede mugs Novice
16. juli 2009 - 19:51 #9
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.
Avatar billede mugs Novice
16. juli 2009 - 21:55 #10
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

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