Opgelost xls data naar word dmv macro.

Dit topic is als opgelost gemarkeerd

roycke

Gebruiker
Lid geworden
23 sep 2010
Berichten
94
Beste,

Ik heb bepaalde data in xls staan. (deze data is telkens anders maar de cel locatie altijd gelijk)
Nu wil ik graag dat XLS word doet openen (die macro zit al in het xls bestand)
Echter vervolgens wil ik dat de data van de cellen wordt ingevoerd in het document 1.docx via deze macro.
Het is me gelukt om de macro "te laten schrijven in word" maar niet de juiste data uit xls te kopiëren en de plakken op de juiste plek in het word tabel. Hopelijk kan me hier iemand (op weg) helpen.
 

Bijlagen

  • 1.xlsm
    12,1 KB · Weergaven: 2
  • 1.docx
    11,9 KB · Weergaven: 4
Al eens van afdruk samenvoegen gehoord ? (les 6 Word basiskennis)
 
Dank voor je reactie. Maar ik wil t via vba.
Kan wel een heel verhaal kan ophangen waarom wel/niet via “afdrukken samenvoegen” maar dat bespaar ik je maar 😊
 
Nou, verras ons eens…. Waarom zouden de basistechnieken niet werken of genegeerd moeten worden? Is de simpelste methode te makkelijk? Ben daar ook wel benieuwd naar…
 
las laatst op een forum met de vraag hoe een hondenhok gebouwd moest worden. uiteindelijk ging het hele topic erover of honden wel een in hok thuishoren. ik krijg nu het zelfde gevoel. Om een soortgelijke situatie te voorkomen zet hem maar op opgelost. :)
Ik zal bovengenoemde oplossing eens in de groep gooien.
 
Laatst bewerkt:
Via VBA:
 

Bijlagen

  • 1.xlsm
    20,3 KB · Weergaven: 7
  • 1.docx
    11,6 KB · Weergaven: 8
Als je via een sjabloon werkt, moet je het document niet openen, maar een nieuw document maken. De code van ah kan een heel stuk simpeler, dus in mijn voorbeeld werkt het dan zo:

Code:
Dim WordApp As Word.Application
Dim NewDoc As Word.Document

Code:
Sub Word()
Dim strFile As String
    Set WordApp = GetObject(, "Word.Application")
    If Not Err.Number = 0 Then Set WordApp = CreateObject("word.Application")
    Set NewDoc = Documents.Add(Template:="\K:\5. S&JT\5. Sjablonen\advies.dotx")

    WordApp.Visible = True
    With NewDoc
        .Variables("varAan").Value = [C2]
        .Variables("varKenmerk").Value = [G2]
        .Variables("varDatum").Value = [F9]
        .Variables("varVan").Value = [M1]
        .Fields.Update
    End With
End Sub

Ik heb het zoek- en vervang vervangen door DocVariabelen; werkt een heel stuk prettiger vind ik.
 
@AHulpje

Je suggestie:
- verhindert dat de TS zijn gegevens in Excel goed struktureert; een correcte struktuur is de basis van geautomatiseerede gegevensverwerking
- verhindert dat TS zich verdiept in de hulpmiddelen die de provincie hem geeft om zijn werk te doen
- houdt de illusie van TS in stand dat hij met' Office kan werken'.
- zet bezoekers van deze draad op het verkeerde spoor hoe je in Office moet werken.

In de bijlagen een Excel bronbestand en een Word doelbestand.
Zet ze in dezelfde directory en open het Wordbestand.
Dat is het enige.

De suggestie van Octafish is voor degenen die niet van VBA kunnen afblijven ;)
En dan meteen de beste aanpak: met Docvariables.
 

Bijlagen

  • __doel.docx
    14,2 KB · Weergaven: 4
  • __bron.xlsb
    14,4 KB · Weergaven: 3
Dim WordApp As Word.Application Dim NewDoc As Word.Document
hier krijg ik een foutmelding:
Compileer fout:
Een door de gebruiker gedefinieerd gegevenstype is niet gedefinieerd.

Kan dit te maken hebben met de office versie? we gebruiken office 2019.
 
Dat komt dan omdat je de Word bibliotheek niet hebt geladen. Dat doe ik wel, omdat je dan IntelliSense hebt (dank zij de Early Binding), wat een stuk makkelijker programmeert. Doe je dat dus niet, dan werk je met Late Binding en moet je de juiste getalwaarden van parameters dus weten, wat een stuk lastiger is. bovendien is Early Binding nét even wat sneller in de uitvoering. Niet dat je dat tegenwoordig nog kan meten :). Maar het grote voordeel is dus de IntelliSense.
 
Dat komt dan omdat je de Word bibliotheek niet hebt geladen. Dat doe ik wel, omdat je dan IntelliSense hebt (dank zij de Early Binding), wat een stuk makkelijker programmeert. Doe je dat dus niet, dan werk je met Late Binding en moet je de juiste getalwaarden van parameters dus weten, wat een stuk lastiger is. bovendien is Early Binding nét even wat sneller in de uitvoering. Niet dat je dat tegenwoordig nog kan meten :). Maar het grote voordeel is dus de IntelliSense.
uhm ok. :) dit is chinees voor mij. Ik ga dit bij helpdesk voorleggen. :)
Bedankt voor de snelle reactie!
 
Ik heb e.e.a. uiteraard ook in de bestanden gezet. Die zitten hierbij.
De Sjabloon is gezipt, omdat je blijkbaar geen dotx mag uploaden.
 

Bijlagen

  • 1.docx
    12,6 KB · Weergaven: 4
  • 1.xlsm
    15,2 KB · Weergaven: 3
  • advies.zip
    10,1 KB · Weergaven: 4
De suggestie van Octafish is voor degenen die niet van VBA kunnen afblijven ;)
Dat is natuurlijk een vreemde oplossing, aangezien de oplossing van ah óók is geprogrammeerd met VBA. Wellicht bedoelt hij:
"De suggestie van Octafish is voor degenen die kunnen programmeren ;)" :D
 
En, om nog even op de eerste discussie te komen, je kunt het hele zooitje uiteraard prima zonder programmeren doen, zelfs zonder dat je jouw 'systeem' van willekeurige cellen overboord moet gooien. In dit geval maak je een extra tabblad waarin je een tabel maakt met a) de veldnamen in rij 1 en b) de waarden in rij 2.

Ik heb dat in je voorbeeldje aangepast, en nu kun je dus zonder programmeren de gegevens in je sjabloon laten verschijnen.

Wel vermoedelijk in de sjabloon nog even de padverwijzing naar het excel bestand aanpassen, maar daarna kun je vanuit Word een nieuw document maken op basis van de sjabloon en krijg je de gegevens netjes in je Word document.
 

Bijlagen

  • advies 2.zip
    12,4 KB · Weergaven: 1
  • 1.xlsm
    17,5 KB · Weergaven: 1
@OctaFish kunnen we jou niet inhuren :) We hebben een xls document wat boordevol links en macro's zit. (deze is gemaakt door een voorganger) Ik denk dat hier en daar heel veel te optimaliseren valt. Zelf ben ik maar aan het voortborduren op dit bestaande document. Wellicht is het goed dat een profi dit alles her-programmeert met ook nog de uitbreidingen.

Ik heb het geheel nu werkend op de manier van Ahulpje. :)

Code:
Dim objWord
Dim objDoc

Sub Word()
    StartWord
    Dim strFile As String
    strFile = "K:\5. S&JT\5. Sjablonen\advies.dotx"
    Set objDoc = objWord.Documents.Open(strFile)
    ZoekEnVervang "{1}", Range("q507")
    ZoekEnVervang "{2}", Range("l1")
    ZoekEnVervang "{3}", Range("q508")
    ZoekEnVervang "{4}", Range("q509")
    ZoekEnVervang "{5}", Range("c2")
    ZoekEnVervang "{6}", Range("g2")
    MsgBox "Plak de opmerkingen onder het kopje advies en sla het document op in de werkmap. Sleep vervolgens het documenten vanuit de werkmap naar RXmission.", vbInformation
End Sub

Function StartWord() As Boolean
   ' Zoek actieve Word applicatie, start nieuw indien niet gevonden.
   On Error Resume Next
   Set objWord = GetObject(, "Word.application")
   If Err.Number <> 0 Then
      DoEvents
      Err.Number = 0
      Set objWord = CreateObject("Word.application")
      If Err.Number <> 0 Then
         MsgBox Err.Number & "  " & Err.Description & Chr(13) & _
         "Er is een fout opgetreden, Word kan niet gestart worden.", vbCritical
         GoTo errHandler
      End If
   End If
   objWord.Visible = True
   StartWord = True
   Exit Function
 
errHandler:
   StartWord = False
End Function

Function ZoekEnVervang(strKey, strData)
   ' Zoek strKey in Word document en vervang die door strData.
   On Error GoTo errHandler
   objDoc.Content.Find.Execute FindText:=strKey, ReplaceWith:=strData

   Exit Function
 
errHandler:
   MsgBox Err.Description

End Function




op alle andere manieren krijg ik foutmeldingen. Ik ga me wel verdiepen in "docvariables" :)
 
Laatst bewerkt:
@Octa

Ik zou geen .dotx gebruiken
In het Wordbestand op de gewenste plaatsen de docvariable-velden met de kolomnamen uit het Excelbestand.

Dan vanuit Excel:

CSS:
Sub M_snb()
  sn=Range("A1:D2")

   with getobject("G:\OF\__doel.docx")
     for j=1 to ubound(sn,2)
       .variables(sn(1,j))=sn(2,j)
     next
    .fields.update
    .saveas2 "G:\OF\gevuld.docx"
 end with
End Sub
 
@snb: Voordeel van een sjabloon: je krijgt altijd een leeg, nieuw document. Je kunt dus nooit je origineel overschrijven. Verder zit er niet zoveel verschil in de werkwijze; ook ik gebruik Docvariabelen. En conform jouw bericht uit #2: met een sjabloon kan het zonder programmeren. Jij spreekt jezelf nu tegen :)
 
heb hem nu omgebouwd met docvariables:
Code:
Sub OpenDoc()
    Dim wordapp
    Dim strFile As String
    strFile = "K:\5. S&JT\5. Sjablonen\adviesBrand.dotx"
    Set wordapp = CreateObject("word.Application")
    wordapp.Documents.Open strFile, ReadOnly:=True
    wordapp.Visible = True

With GetObject(strFile)
    .variables("varNaam") = ['Startscherm'!aa2]
    .variables("zaaknr") = ['Startscherm'!ak2]
    .variables("inrichting") = ['Startscherm'!aa5]
    .variables("omschrijving") = ['Startscherm'!aa8]
    .variables("datum") = ['Brandveiligheid'!c2]
    .variables("adviseur") = ['Brandveiligheid'!g2]
    MsgBox "Plak de opmerkingen onder het kopje advies en sla het document op in de werkmap. Sleep vervolgens het documenten vanuit de werkmap naar RXmission.", vbInformation
    .Fields.Update
    .Windows(1).Visible = True
  End With
End Sub
 
Het ware beter de struktuur van je Excelbestand te verbeteren: 1 record met gegevens

Nu:

CSS:
Sub M_snb()
  sn=sheets("Startscherm").range("AA2:AK8")
  With GetObject("K:\5. S&JT\5. Sjablonen\adviesBrand.dotx")
    .variables("varNaam") = sn(1,1)
    .variables("zaaknr") = sn(4,11))
    .variables("inrichting") = sn(1,4)
    .variables("omschrijving") =sn(1,7)
    .variables("datum") = ['Brandveiligheid'!c2]
    .variables("adviseur") = ['Brandveiligheid'!g2]
    .Fields.Update
    .Windows(1).Visible = True
    MsgBox "Plak de opmerkingen onder het kopje advies
   .saveas2 "K:\RXmission/nieuw.docx"
  End With
End Sub
 
Terug
Bovenaan Onderaan