2017-08-06 1 views
1

J'essaie d'utiliser VBA pour ouvrir un document Word à partir d'Excel et insérer des tables dans le document. Les tables sont remplies avec des informations provenant d'Excel.Les tables semblent être remplacées

Chaque table semble remplacer la précédente.

Voici une mise à jour, je dois m'assurer qu'une table ne se forme pas à l'intérieur d'une table. THis is an example of what Is going on

Comment puis-je éviter cela?

Dim intNoOfRows 
    Dim intNoOfColumns 
    Dim objWord 
    Dim objDoc 
    Dim objRange 
    Dim objTable 

    intNoOfRows = 5 
    intNoOfColumns = 3 

    Set objWord = CreateObject("Word.Application") 
    objWord.Visible = True  

    Set objDoc = objWord.Documents.Add  

    Set objRange = objDoc.Range 

    objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns  

    Set objTable = objDoc.Tables(1) 

    objTable.Borders.Enable = True 

    For i = 1 To intNoOfRows 
     For j = 1 To intNoOfColumns 

     Next 
    Next 
End Function 
+1

peut-être vous n Vous devez réduire la plage que vous utilisez pour insérer? Mais il est impossible de savoir sans code. –

+0

tirer, qui n'a pas coller comme je pensais, un instant – user8426180

+0

http://excel-macro.tutorialhorizon.com/vba-excel-add-table-and-fill-data-to-the-word-document/ – user8426180

Répondre

0

Le modèle d'objet Word a le concept d'une plage; Vous pouvez le considérer comme le bloc de texte actuel avec lequel vous voulez travailler dans le programme.

Cette ligne:

objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns 

ajoute une nouvelle table à la plage donnée (objRange).

En regardant la liste des paramètres dans le documentation for the Add method, nous voyons ce qui suit (nous soulignons):

Nom: Gamme

Description de: La plage où vous voulez que le tableau apparaisse . La table remplace la plage si la plage n'est pas réduite.

regardant la ligne précédente de votre code:

Set objRange = objDoc.Range 

la gamme étend sur l'ensemble du document. Ce n'est probablement pas ce que vous voulez, car il remplacera non seulement toutes les autres tables, mais aussi tout autre texte dans le document.

Afin de réduire la plage, appelez le Collapse method. Les plages peuvent être réduites de deux manières: soit la fin de la plage doit se déplacer jusqu'au début de la plage, soit le début de la plage doit se déplacer jusqu'à la fin de la plage. Ce comportement est contrôlé par le passage dans wdCollapseStart ou wdCollapseEnd la méthode Collapse ou leurs valeurs équivalentes:

'objRange.Collapse wdCollapseEnd 
objRange.Collapse 1 

Une fois que vous avez écroulé la gamme, vous pouvez ajouter la nouvelle table.

objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns 

N.B. Votre code utilise une liaison tardive, ce qui signifie (entre autres choses) que l'éditeur n'est pas conscient des formes des différents objets que vous utilisez.

Fournir l'éditeur avec ces informations, ajoutez une référence (Outils ->Références ...) au Microsoft Word Object Model (ou quelque chose de similaire).

Ensuite, lorsque vous déclarez vos variables, vous pouvez spécifier leur type:

Dim objDoc As Word.Document 

Maintenant, lorsque vous écrivez oDoc., l'éditeur peut vous dire quelles méthodes et propriétés sont disponibles pour un document Word.


Il existe un autre problème avec ce code. Une fois la table insérée, quelques lignes de traitement sont effectuées sur la table. Mais le traitement ne se fait jamais sur la table le plus récemment ajouté dans le document, mais toujours sur la première table dans le document:

objDoc.Tables.Add objRange, intNoOfRows, intNoOfColumns 
Set objTable = objDoc.Tables(1) 'reference to the first table in the document 

La façon la plus simple de résoudre ce problème, serait d'utiliser la référence retournée d'ajouter la table:

'we need the parentheses now because we're using the returned value 
Set objTable = objDoc.Tables.Add(objRange, intNoOfRows, intNoOfColumns) 

le code final pourrait ressembler à ceci:

Dim objWord As New Word.Application 

'in production, keeping the application invisible is often more performant 
'but while debugging, it's useful to see what's going on in the application 
objWord.Visible = True 

Dim objDoc As Word.Document 
Set objDoc = wdApp.Documents.Add 

Dim objRange As Word.Range 
Set objRange = objDoc.Range 
objRange.Collapse wdCollapseEnd 

Dim intNoOfRows As Integer 
intNoOfRows = 5 
Dim intNoOfColumns As Integer 
intNoOfColumns = 3 
Dim objTable As Word.Table 
Set objTable = objDoc.Tables.Add(objRange, intNoOfRows, intNoOfColumns) 

'Fill the table here 

'Collapse the range again (not sure this is needed) 
objRange.Collapse wdCollapseEnd 
'Now you can add a new table: 
Set objTable = objDoc.Tables.Add(objRange, intNoOfRows, intNoOfColumns) 
+0

Merci pour cela! Quelques questions ... puis-je utiliser la méthode d'effondrement en transition pour créer mes autres tables et utiliser les mêmes lignes de code que celles que j'ai postées? – user8426180

+0

une fois que je me suis effondré, je ne sais toujours pas comment placer la table juste sous la table précédente que j'ai faite. – user8426180

+0

@ user8426180 RE _autres lignes de code_: Oui. Une fois que vous avez inséré la nouvelle table dans le document, vous n'avez plus besoin de la plage, car vous avez une référence à la table elle-même. La seule raison pour laquelle vous avez besoin de la plage est de dire à Word où dans le document vous voulez insérer la table. –