Normal.dot gewijzigd

Status
Niet open voor verdere reacties.

gcjvanbeek

Gebruiker
Lid geworden
27 nov 2006
Berichten
164
Hallo,
In Access 2003 heb ik code gemaakt om via een keuze menu Word documenten te genereren. Bijvoorbeeld een document "Uitnodiging" dit document wordt vervolgens opgeslagen met een gegenereerde naam. bijv. "uitnodiging-10G" . Sinds kort krijg ik telkens de vraag bij het uitvoeren van de code de melding dat Normal.Dot is gewijzigd en of ik die wijziging wil opslaan. Ik gebruik echter de template "uitnodiging.Dot" om het Word document te genereren.
Wat kan hier aan de hand zijn?
Apestaart
 
Van alles, dat slechts te beoordelen is als je de code die vanuit Access naar Word wordt gezonden hier plaatst.
 
De code

Hallo SNB,
Hierbij de code, er zijn meerdere document keuzes mogelijk. Vandaar dat de code lijst nogal lang is geworden. Het vreemde is dat het wel werkte onder versie 2002 van Office.
Ik hoop dat je de fout kunt vinden.
Code:
I used code Written by Helen Feddema 4-22-98
'Last modified 8-2-2000



Private Sub Command50_Click()
  Dim appWord As Word.Application
   Dim docs As Word.Documents
   Dim doc As Object
   Dim strLetter As String
   Dim strTemplateDir As String
   Dim strLetterDir As String
    Dim strDocID As String
   Dim prps As Object
   Dim strDate As String
   Dim strWordDoc As String
   Dim strString As String
   Dim strGeachte As String
   Dim strTav As String
   Dim strMedewerker As String
   Dim strSofinummer As String
   Dim strGeboortedatum As String
   Dim strAdres As String
   Dim strPostcodeplaats As String
   Dim strTelefoonr As String
   Dim strTelefoonw As String
   Dim strAanhefrel As String
   Dim strEindArbeidproces As String
   Dim strContactpersoonbedrijf As String
   Dim strBedrijfsnaam As String
   Dim strPlaats As String
   Dim strPostcode As String
   Dim strStraat As String
   Dim rs As Recordset
   Dim ctl As Access.Control
   Dim Rec As Integer
   ' DoCmd.OpenForm "Instellingen", , , , , acHidden 'Toegevoegd 16-5
  ' strDocPad = Forms![Instellingen]![Doc pad] 'Toegevoegd 16-5
   'DoCmd.Close acForm, "Instellingen"
   
  If appWord Is Nothing Then ' Sets variable to the running instance of the Word ' Global object (which is nearly the same as Word.Application)...
Set appWord = CreateObject("Word.Application")
'MsgBox "Word wordt geopend"
 End If
If Nz(Me![Document].Value) = True Then
MsgBox " Kies een document"
End If

   strWordDoc = Nz(Me![Document].Value)
   Set ctl = Me![Document]
   If strWordDoc = "" Then
      MsgBox "Kies een document"
      ctl.SetFocus
      ctl.Dropdown
      GoTo ErrorHandlerExit
   End If
        On Error GoTo ErrorHandler  
          
Nieuw_doc:

   Set appWord = GetObject(, "Word.Application")
   If Err.Number <> 0 Then
   MsgBox "de code hapert bij Get Object" & Err.Source & Err.Number
   Err.Clear
   Set appWord = CreateObject("Word.Application")
    If Err.Number <> 0 Then
   ' MsgBox "Word wordt geopend"
      Err.Clear
   End If
   End If
   
   
   strDate = CStr(Date)
   strTemplateDir = appWord.Options.DefaultFilePath(wdUserTemplatesPath)
   strTemplateDir = strTemplateDir & "\Personal Documents\"
  'strTemplateDir = "E:\Personal Documents\"
   strLetter = strTemplateDir & strWordDoc & ".dot"
   Debug.Print "Letter: " & strLetter
   Set docs = appWord.Documents
   docs.Add strLetter
   Set doc = appWord.ActiveDocument 'Toegevoegd
   appWord.Visible = True 'Toegevoegd
   Debug.Print " Pad van actief document=" & doc.Path & doc.Name 'activeDocument vervangen door doc
   
'zetten van de bookmarks vanuit database
strTav = Nz(Me![TabBedrijven Subform].Form![Tav]) & " " & Nz(Me![TabBedrijven Subform].Form![Voorletters]) & " " & Nz(Me![TabBedrijven Subform].Form![Contactpersoon bedrijf])
strGeachte = Nz(Me![TabBedrijven Subform].Form![Geachte]) & " " & Nz(Me![TabBedrijven Subform].Form![Contactpersoon bedrijf])
strMedewerker = Nz(Me![Aanhef]) & " " & Nz(Me![Voorletters]) & " " & Nz(Me![Voorvoegsel]) & " " & Nz(Me![Achternaam])
strSofinummer = Nz(Me![Sofi nummer])
strAdres = Nz(Me![Bezoekadres])
strPostcodeplaats = Nz(Me![Postcode]) & " " & Nz(Me![Plaats])
strTelefoonr = Nz(Me![Telefoonnummer])
strTelefoonw = Nz(Me![TabBedrijven Subform].Form![Telefoonnummer bedrijf])
strAanhefrel = Nz(Me![Geachte]) & " " & Nz(Me![Voorvoegsel]) & " " & Nz(Me![Achternaam])
strEindArbeidproces = Nz(Me![Eind arbeidsproc])
strContactpersoonbedrijf = strTav
strBedrijfsnaam = Nz(Me![TabBedrijven Subform].Form![Naam bedrijf])
strGeboortedatum = Nz(Me![Geboortedatum])
strPlaats = Nz(Me![TabBedrijven Subform].Form![Plaats])
strPostcode = Nz(Me![TabBedrijven Subform].Form![Postcode])
strStraat = Nz(Me![TabBedrijven Subform].Form![Straat])


'gemeenschappelijke bookmarks adresgegevens bedrijf en kop brief
With appWord.Selection
.GoTo What:=wdGoToBookmark, Name:="Bedrijfsnaam"
.TypeText Text:=strBedrijfsnaam
.GoTo What:=wdGoToBookmark, Name:="Plaats"
.TypeText Text:=Nz(Me![TabBedrijven Subform].Form![Plaats])
.GoTo What:=wdGoToBookmark, Name:="Medewerker"
.TypeText Text:=strMedewerker
.GoTo What:=wdGoToBookmark, Name:="Sofinummer"
.TypeText Text:=strSofinummer
.GoTo What:=wdGoToBookmark, Name:="Geboortedatum"
.TypeText Text:=strGeboortedatum
.GoTo What:=wdGoToBookmark, Name:="Bezoekadres"
.TypeText Text:=Nz(Me![Bezoekadres]) & ", " & Nz(Me![Postcode]) & " " & Nz(Me![Plaats])

.GoTo What:=wdGoToBookmark, Name:="Datum" 'Datum hier toegevoegd
.TypeText Text:=strDate
End With

'Idem behalve voor "Info Medisch BenG"

If strWordDoc <> "Info Medisch BenG" Then 'Deze bookmarks niet
With appWord.Selection
.GoTo What:=wdGoToBookmark, Name:="Contactpersoon_Bedrijf"
.TypeText Text:=strTav
If strWordDoc <> "Terugkoppeling" Then 'Bij formulier terugkoppeling het volgende niet
.GoTo What:=wdGoToBookmark, Name:="Straat"
.TypeText Text:=Nz(Me![TabBedrijven Subform].Form![Straat])
.GoTo What:=wdGoToBookmark, Name:="Postcode"
.TypeText Text:=Nz(Me![TabBedrijven Subform].Form![Postcode])
.GoTo What:=wdGoToBookmark, Name:="Werknemernummer"
.TypeText Text:=Nz(Me![Werknemernummer])

.GoTo What:=wdGoToBookmark, Name:="Aanhef"
.TypeText Text:=strGeachte
End If
End With
Else
With appWord.Selection
.GoTo What:=wdGoToBookmark, Name:="Functie"
.TypeText Text:=Nz(Me![Functie])
End With
With appWord.Selection
'Datum hier weggehaald
.GoTo What:=wdGoToBookmark, Name:="Medewerker2"
.TypeText Text:=strMedewerker
End With

End If
 
 If strWordDoc = "nokd BenG" Then
With appWord.Selection
.GoTo What:=wdGoToBookmark, Name:="Eind_arbeidsproces"
.TypeText Text:=Nz(Me![Eind arbeidsproc])
.GoTo What:=wdGoToBookmark, Name:="Medewerker2"
.TypeText Text:=strMedewerker
End With
End If

If strWordDoc = "su volledig ao Beng" Or strWordDoc = "su volledig ag Beng" Or strWordDoc = "ivra2 leeg" Then
With appWord.Selection
.GoTo What:=wdGoToBookmark, Name:="Eind_arbeidsproces"
.TypeText Text:=Nz(Me![Eind arbeidsproc])
End With
End If
 
If strWordDoc = "uitnodiging BenG-G" Or strWordDoc = "uitnodiging BenG-G" Then
With appWord.Selection
.GoTo What:=wdGoToBookmark, Name:="Eind_arbeidsproces"
.TypeText Text:=Nz(Me![Eind arbeidsproc])
End With
End If
 

  With appWord
      .Visible = True
      .Activate
      .Selection.WholeStory
      .Selection.Fields.Update
      .Selection.MoveDown Unit:=wdLine, Count:=1
   End With


Me("Sub verzonden").SetFocus
Rec = Me.[Sub verzonden].Form.RecordsetClone.RecordCount + 1
 DoCmd.GoToRecord , , acGoTo, Rec
     Me![Sub verzonden].Form![RelatieID] = Me!RelatieID
     Me![Sub verzonden].Form![Datum verstuurd] = strDate
     strDocID = str(Me!RelatieID) & "-" & str(Rec)
        If Geert = 1 Then                      'Toegevoegd mei 2006
     strDocID = strDocID & "G"
     Else
     strDocID = strDocID & "J"
     End If
     strLetterDir = strDocPad & strWordDoc & strDocID
   Me![Sub verzonden].Form![Document] = strWordDoc & strDocID 'Tot hier
  
 If strWordDoc = "Leeg document" Then
 appWord.Visible = False
strWordDoc = InputBox("Onder welke naam wilt u het lege document opslaan?", , , 5000, 5000)
 Me![Sub verzonden].Form![Document] = strWordDoc
   strLetterDir = strDocPad & strWordDoc
    With appWord
      .Visible = True
      .Activate
      .Selection.WholeStory
      .Selection.Fields.Update
      .Selection.MoveDown Unit:=wdLine, Count:=1
   End With
End If


  Refresh
  Debug.Print strLetterDir
   doc.SaveAs FileName:=strLetterDir 'ActiveDocument vervangen door doc
        
    
   ' MsgBox " Uw document is opgeslagen in :" & strLetterDir
ErrorHandlerExit:
   Exit Sub

ErrorHandler:
   If Err = 429 Then
    MsgBox "Word is not running; open Word with CreateObject"
      Set appWord = CreateObject("Word.Application")
      Resume Next
      
       Else
         ' If Err.Number = 462 Then
          '  MsgBox " error 462 gevonden"
          ' Err.Clear
          '  Resume Next
        ' End If
      
      MsgBox "Error No: " & Err.Number & "; Description: " & Err.Description
      Resume ErrorHandlerExit
   End If


    
End Sub
 
1. in je code zie ik geen ongerechtigheden.
2. het kan zijn dat in de normal.dot een startmacro is opgenomen die tot wijzigingen van de normal.dot leidt als Word wordt geopend. Dan wordt die vraag gesteld.

3. maak een keuze voor een veel simpeler werkwijze
  • maak een document op basis van het specifieke sjabloon; sla dit bijv. op als 'E:\voorbeeld.doc'
  • dan kun je in acces dat bestand altijd simpel openen met Getobject("E:\voorbeeld.doc")
jouw code kan daardoor aanzienlijk gereduceerd worden.

Als je vervolgens werkt met documentvariabelen (menubalk/invoegen/veld/docvariable) hoef je alleen de waarden uit je tabel naar die variabelen te schrijven. Fields.update doet vervolgens voor jou het werk.


Al die goto aktiviteiten zijn gebruikersinterface-termen. In VBA kun je rechtstreeks naar objecten schrijven. En bladwijzers zijn al helemaal niet geschikt om tekst in een document te voegen.

Je hoeft in je VBA-code geen enkele variabele te gebruiken, noch te declareren
Met deze code bereik je hetzelfde effekt als met die van jou.
Code:
Sub brief()
  With GetObject(("E:\voorbeeld.doc")
     .Variables("Tav") = Nz(Me![TabBedrijven Subform].Form![Tav]) & " " & Nz(Me![TabBedrijven Subform].Form![Voorletters]) & " " & Nz(Me![TabBedrijven Subform].Form![Contactpersoon bedrijf])
     .Variables("Geachte") = Nz(Me![TabBedrijven Subform].Form![Geachte]) & " " & Nz(Me![TabBedrijven Subform].Form![Contactpersoon bedrijf])
     .Variables("Medewerker") = Nz(Me![Aanhef]) & " " & Nz(Me![Voorletters]) & " " & Nz(Me![Voorvoegsel]) & " " & Nz(Me![Achternaam])
     .Variables("Sofinummer") = Nz(Me![Sofi nummer])
     .Variables("Adres") = Nz(Me![Bezoekadres])
     .Variables("Postcodeplaats") = Nz(Me![Postcode]) & " " & Nz(Me![Plaats])
     .Variables("Telefoonr") = Nz(Me![Telefoonnummer])
     .Variables("Telefoonw") = Nz(Me![TabBedrijven Subform].Form![Telefoonnummer bedrijf])
     .Variables("Aanhefrel") = Nz(Me![Geachte]) & " " & Nz(Me![Voorvoegsel]) & " " & Nz(Me![Achternaam])
     .Variables("EindArbeidproces") = Nz(Me![Eind arbeidsproc])
     .Variables("Bedrijfsnaam") = Nz(Me![TabBedrijven Subform].Form![Naam bedrijf])
     .Variables("Geboortedatum") = Nz(Me![Geboortedatum])
     .Variables("Plaats") = Nz(Me![TabBedrijven Subform].Form![Plaats])
     .Variables("Postcode") = Nz(Me![TabBedrijven Subform].Form![Postcode])
     .Variables("Straat") = Nz(Me![TabBedrijven Subform].Form![Straat])
     .fields.update
     .SaveAs "nieuwe naam.doc"
     .close
  End With
End Sub
 
Laatst bewerkt:
Meerdere sjablonen zijn nodig

Hallo SNB,

In mijn programma maak ik gebruik van een keuze mogelijkheid om te kiezen uit 8 verschillende sjablonen. Ik ga in iedergeval wel je sugestie uittesten.

2. het kan zijn dat in de normal.dot een startmacro is opgenomen die tot wijzigingen van de normal.dot leidt als Word wordt geopend. Dan wordt die vraag gesteld.

Hoe kan ik daar achter komen en hoe is het te verhinderen? Het is erg lastig om te antwoorden dat ik Normal.DOT niet wil opslaan. Overigens als ik dat wel doe krijg ik ook nog een melding dat Word op dit moment door een ander proces wordt gebruikt en kan ik helemaal niet opslaan.

Apestaart
 
Open Word en controleer via de VBEditor welke code zich in normal.dot bevindt.

Maar het feit dat 2 instanties van normal.dot geopend zijn, maakt natuurlijk al dat de 2e normal.dot een andere eigenschap krijgt (alleen lezen) en andere tijdelijke naam krijgt. Dat veroorzaakt waarschijnlijk die wijzigignsvraag.
Als je mijn methode gebruikt krijg je die problemen niet.
 
Laatst bewerkt:
hoe moeten velden worden toegevoegd?

Hallo SBN,
Ik probeer je code werkend te krijgen. Inmiddels ben ik zover dat het programma wordt uitgevoerd, en opnieuw wordt opgeslagen, echter zonder de wijzigingen.
Ik denk dat ik iets niet goed heb gedaan met het invoegen van document velden. Ik gebruik office 2007 en daarin komt : (menubalk/invoegen/veld/docvariable) niet voor.
Wel (lint/invoegen/snelonderdelen/veld). Als ik daar naartoe ga kan ik onder Categorien documentengegevens kiezen. Daaronder staan vaste veldnamen. Hoe maak ik een nieuw veld aan? Ik heb het geprobeerd met control f9, maar de veldnaam die ik dan invul werkt niet.
Wat moet ik doen om een goed document met de juiste velden te krijgen?
Apestaart
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan