2016-04-26 15 views
1

Ich arbeite an einem bestehenden Skript-Makro in MSword 2007 (Ich habe es nicht selbst gemacht, tadeln Sie mich nicht für ein nicht so gut gemacht Code-Design!) .VBA - Makro msword - Einfügen Tabellenkopf nach csv Konvertierung

Dieses Skript verwendet SQL-Ergebnisse aus einer ADODB-Verbindung und füllt (löscht und ersetzt, um genau zu sein) eine Reihe von Tabellen an einem bestimmten Lesezeichen unter Verwendung der CSV-Konvertierung.

Die Aufgabe besteht darin, den vorhandenen Header beizubehalten und alle Ergebnisse dynamisch in die nächsten Zeilen zu schreiben. Catch ist ... der Header kann aus verbundenen Zellen gemacht werden

Ich werde nicht viel Code ändern, und ich bin kein Experte in VBA, aber das ist, was ich denke, sollte der Workflow sein:

  • speichern die Kopfzeile (die „erste“ Zeile der Basistabelle ist)
  • löschen gesamte Tabelle
  • Tabelle aus den
  • Insert-Header in die neue erzeugte Tabellenergebnisse CSV gewandelten Insert

Kopieren eines Zeilenwurffehlers, wenn einige verbundene Zellen vorhanden sind. Und es scheint, dass VBA kann nur leere Zeilen hinzufügen ... so wahrscheinlich kann ich nicht den Header "wie einfügen". Wie kann ich diesen Header auf den Tisch legen?

Hilfe !!!

Private Sub setRangeTable(bookmark As String, sqlCmd As String) 
    Dim rs As ADODB.Recordset 
    Dim r As Range 
    Dim t As table 
    Dim c As Column 
    Dim row As row 
    Dim i As Integer 
    'this variable should copy header 
    Dim oldHeader As Range 
    Set r = ActiveDocument.Bookmarks(bookmark).Range 
    With r.Tables(1) 
     ' try to memorize the header (?) 
     oldHeader = .Range(Start:=.Rows(1).Range.Start, _ 
      End:=.Rows(1).Range.End) 
    End With 
    r.Tables(1).Delete 
    r.InsertAfter (getTableData(sqlCmd)) 
    r.Select 
     r.ConvertToTable Separator:=wdSeparateByTabs, AutoFitBehavior:=wdAutoFitContent 
     r.Tables(1).Rows(1).Select 
     Selection.InsertRowsAbove 
End Sub 

Beispiel für vorhandene Tabelle

---------------------- 
|  |  |  .... | << cell of real row 1 \ 
| .... | .... |-------------|      | << header 
|  |  | .... | .... | << cell of real row 2/
----------------------------- 
|  |  |  |  | << all results... 
----------------------------- 
|  |  |  |  | << all results... 
----------------------------- 
|  |  |  |  | << all results... 
----------------------------- 

Antwort

1

Ja, das ist eine schwierige Situation. Ein Problem mit dem von Ihnen bereitgestellten Code besteht darin, dass Sie die Tabelle löschen, die den Bereich mit der Überschrift enthält. das Zuweisen des Tabellenheaders zu einer Variablen schützt sie nicht vor dem Löschen ... Ein weiterer Faktor ist, dass Sie tatsächlich die Zeilen 1 und 2 benötigen, nicht nur 1. Und schließlich lässt Word keine Zeilen (Indizes) mit verbundenen Zellen adressieren .

Das folgende funktioniert für mich, in einem schnellen Test. Der Schlüssel ist, dass es möglich ist, die Reihe (n) mit den verbundenen Zellen analog zu der Art und Weise, wie der Benutzer es macht, mit der Tastatur aufzunehmen.

Anstatt die Originaltabelle zu löschen (entspricht tblOriginal in meinem Beispiel), arbeitet der Code zuerst mit einer zweiten Tabelle und löscht nur die ursprüngliche Tabelle, nachdem die Überschrift kopiert wurde. Theoretisch könnten Sie Range.Cut oder Range.Copy und später Range.Paste verwenden, mit denen Sie die ursprüngliche Tabelle früher löschen können, aber im Allgemeinen ist es besser, die Zwischenablage nicht zu verwenden, wenn ein anderer Ansatz möglich ist.

Das bedeutet, Sie sollten einen oder zwei leere Absätze nach der ersten Tabelle einfügen, fügen Sie die csv dort ein und konvertieren Sie es in eine Tabelle, wenn Sie eine Variable zuweisen (entspricht tblTarget in meinem Codebeispiel).

Dim tblOriginal As word.Table 
Dim tblTarget As word.Table 
Dim rngTblHeader As word.Range 
Dim rngTarget As word.Range 

Set tblOriginal = ActiveDocument.Tables(1) 
Set rngTblHeader = tblOriginal.Range 
'Range at the beginning of first cell, then extend 
rngTblHeader.Collapse wdCollapseStart 
rngTblHeader.MoveEnd wdRow, 2 
'rngTblHeader.Select 'debug/testing 

Set tblTarget = ActiveDocument.Tables(2) 'You use r.ConvertToTable 
Set rngTarget = tblTarget.Range 
rngTarget.Collapse wdCollapseStart 
rngTarget.FormattedText = rngTblHeader.FormattedText 

tblOriginal.Delete 
+0

Magischer Code! Vielen Dank. Da Sie in VBA ziemlich gut zu sein scheinen, gibt es eine Methode, um zu wissen, ob in den ersten beiden Zeilen verbundene Zellen vorhanden sind. Traurigerweise wird 'setRangeTable()' blind auf Tabellen aufgerufen, die einen 1-Zeilen-Header oder 2-Zeilen-Header haben können. Übrigens, wenn Sie nicht die Zeit haben, kein Problem zu beantworten, ist dieses eine gut genug für mich. Ich werde einen Test machen. –

+0

@NereoCostacurta: Sie könnten zum Beispiel nach .Cell (2,1) suchen und den Fehler 5941 auffangen. –

+0

@NereoCostacurta Dies würde eine neue Frage verdienen, und bitte denken Sie daran, das Problem im Detail zu beschreiben, einschließlich Code, den Sie ausprobiert haben. Ich habe nichts, was ich "aus meinem Ärmel schütteln kann" und es ist schon eine Weile her, dass ich über das Problem nachgedacht habe ... –