2017-04-14 5 views
2

Ich versuche, eine Reihe von 78 Werten aus einem Excel-Blatt in ein Word-Dokument einzufügen. Dies ermöglicht eine einfache Erzeugung von Word-Dokumenten. Der folgende Code ist mir erlaubt, einfügen:Word VBA Einfügen von Lesezeichen und Formatierung

Option Explicit 

Sub WriteExtension() 
' 
' WriteExtension Macro 
' 
' 
     copyFile 

     Dim nWord As New Document 
     word.Application.ScreenUpdating = False 

     Set nWord = Documents.Open("C:\target\file\here\targetfile", Visible:=False) 


     'initialize excel variables 
     Dim oExcel As Excel.Application 
     Dim oWorkbook As workbook 
     Dim oWorksheet As worksheet 

     'initialize excel object 
     Set oExcel = New Excel.Application 
     oExcel.ScreenUpdating = False 
     Set oWorkbook = oExcel.Workbooks.Open("source\spreadsheet\here\sourcespreadsheet.xlsx") 
     Set oWorksheet = oWorkbook.Worksheets(Sheets("Extensions").Index) 

     'setup loop variables 
     Dim tempString As String 
     Dim i As Long 
     Dim bkMark As Bookmark 

     'insert items from spreadsheet onto word document 
     Dim insertText As String 

     For i = 1 To 78 
      nWord.Bookmarks("BM" & i).Select 
      nWord.Bookmarks.Item("BM" & i).Range.InsertAfter (Cells(4, i + 6)) 
     Next i 

     Dim filePath As String 
     Dim fileName As String 
     Dim newName As String 

     'save the file as a PDF and close the PDF 
     filePath = "C:\target\path\here" 
     fileName = Cells(4, 13) & Cells(4, 12) & Cells(4, 79) & ".pdf" 
     newName = filePath & fileName 
     nWord.SaveAs2 fileName:=newName, FileFormat:=wdFormatPDF 

     'close things 
     nWord.Close False 
     ' oWorksheet. 
     oWorkbook.Close False 
     oExcel.Quit 
End Sub 

'function takes the current extension template which has this macro in it, and copies it to a new blank word document 
Function copyFile() 

    Dim fso As Object 
    Set fso = VBA.CreateObject("Scripting.FileSystemObject") 

    Dim sourceFile As String 
    Dim targetFile As String 

    sourceFile = "c:\source\file\here\sourcedocument.docx" 
    targetFile = "c:\target\file\here\targetfile" 

    fso.copyFile sourceFile, targetFile 

End Function 

Auf den Punkt gebracht, was dieses Programm tut, ist es Informationen aus einer Tabelle nimmt und versucht, Informationen in einer bestimmten Zelle einzufügen (oder werden bestimmte Berechnungen) auf ein bestimmter Ort auf dem Dokument. Dazu nimmt es zunächst ein Beispieldokument (Quelldatei), erstellt eine neue Datei (Zieldatei) und kopiert dann die Quelldatei in die Zieldatei. Das bedeutet, dass die Platzierung von Text, Formatierung und Lesezeichen genau kopiert wird.

Dann initialisiert es ein neues Excel-Objekt, wo ich meine Daten aufbewahre, die ich in das Dokument einspeisen möchte. Es öffnet es und führt eine Schleife 78 Einheiten lang für jede der 78 Lesezeichen. Es speichert das neue Dokument (zuvor als Zieldatei bezeichnet) und benennt es basierend auf den Werten in der Excel-Tabelle. Es speichert das neue Dokument als PDF. Dann schließt es das Dokument, schließt Excel und schließt das Wort.

Das Problem, das ich habe, ist eines der Formatierung. Im Grunde suche ich nach dem Einschub, der oberhalb einer Art Unterstrich oder Grenze stattfindet, statt dass er die Linie verschiebt. Stellen Sie sich vor, Sie füllen eine Anwendung aus - Sie schreiben über die Zeile und nicht daneben. Es scheint nicht so, als ob font.underline funktioniert, da es nur den Text umarmt, anstatt eine Unterstreichung zu machen. Vielleicht hatte ich es noch nicht ganz ausgearbeitet, aber ich hatte gehofft, dass die Genies von Stackoverflow mir dabei helfen könnten.

Also lautet die Frage: Wie füge ich Dinge neben Lesezeichen ein, damit ich sie über die Zeile einfügen kann und nicht neben? Mit anderen Worten, wie verwende ich Lesezeichen/Seitenformatierung, um den Text als # 3 und nicht als # 1 oder # 2 erscheinen zu lassen. Die meiste Zeit erscheint es als # 1.

Dieser Code funktioniert

 Dim i As Long 
     Dim bkMark As Bookmark 

     'insert items from spreadsheet onto word document 
     Dim insertText As String 

     Dim startX As Long 
     Dim startY As Long 


    For i = 1 To 2 

     startX = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdHorizontalPositionRelativeToPage) 
     startY = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdVerticalPositionRelativeToPage) + 13 
     'Dim shp As Shape 
     With ActiveDocument.Shapes.AddLine(startX, startY, startX + 200, startY).Line 
      .ForeColor.RGB = RGB(0, 0, 0) 

     End With 
    Next i 
' 

enter image description here

+1

In Ihrem Beispiel-Screenshot gehe ich davon aus, dass die "Unterstreichung" eine simulierte Unterstreichung ist, die durch Shift & '-' Tasten erzeugt wird? Ich denke, Sie müssten diese aus Ihrer Vorlage entfernen und stattdessen ein Zeichenobjekt (Linie) einfügen, das sich unterhalb des Textes befindet. –

+0

Ja, Sie stimmen mit Ihrer Annahme überein. OK. Ich werde in Zeichnungslinien schauen. – bdpolinsky

+0

Ja, sonst glaube ich nicht, dass es funktionieren kann, weil diese "Unterstreichungen" tatsächlich Zeichen sind, die in das Dokument eingegeben werden, und Sie können diese nicht in Verbindung mit Text selbst verwenden. Es ist das eine oder das andere, Sie werden mit # 1 oder # 2 enden, je nachdem, wo Sie einfügen, aber niemals # 3, weil das "Hallo Welt" 'überschreibt/ersetzt nur das' "______________" '. –

Antwort

1

Mein ursprünglicher Vorschlag war, um manuell die Zeichnen von Linien in der Vorlage Datei hinzufügen, die Sie verwenden, die die Notwendigkeit zu vermeiden, würde sie in jedem neu kopierte Version, die Sie mit dieser VBA-Prozedur erstellen, und ich denke immer noch, dass dies vorzuziehen wäre. Wenn Sie jedoch aus irgendeinem Grund die Vorlagendatei nicht ändern können, sollten Sie in der Lage sein, etwas wie unten zu tun.

Dim objLine as Shape 'declare a Shape object to represent the drawing object lines you'll insert 

    For i = 1 To 2 

     startX = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdHorizontalPositionRelativeToPage) 
     startY = ActiveDocument.Bookmarks.Item("BM" & i).Range.Information(wdVerticalPositionRelativeToPage) + 13 
     ' at each iteration, assign the return from AddLine method to the objLine variable 
     Set objLine = ActiveDocument.Shapes.AddLine(beginX:=startX, beginy:=startY, endx:=startX + 200, endY:=startY) 
     ' assign the RGB color to the objLine.Line.ForeColor 
     objLine.Line.ForeColor.RGB = RGB(0, 0, 0) 
     ActiveDocument.Bookmarks.Item("BM" & i).Range.InsertAfter ("Bookmark" & i) 

    Next i 

Was wir hier tun, eine Objektvariable verwendet objLine vom Typ Shape (die Zeichnungsobjekte wie Linien, Textfelder usw. der Objekttypdie Sie in das Dokument einfügen könnten, und weisen diesem Formobjekt bei jeder Iteration den Rückgabewert der Methode AddLine zu. Anschließend verwenden wir objLine und weisen ihm die RGB-Farbe Line.ForeColor zu (Zeilen haben keine -Eigenschaft).

0

Aus Ihrer Beschreibung, es klingt, als ob Sie ein Formular erstellen möchten.

Wenn Sie Ihr Formular in Excel erstellen, formatieren Sie jede Zelle, die eine Antwort enthält, mit einem einzelnen unteren Rand.

Jetzt übersetzen Sie das gleiche Denken in Word - setzen Sie Ihr Formular als eine Tabelle mit den Zellen, wo Eingabe erforderlich ist mit einem unteren Rand formatiert. Platzieren Sie Ihre Lesezeichen in den Zellen, in denen Sie Daten aus Excel hinzufügen müssen.

Wenn Sie den Wert am Lesezeichen eingeben, müssen Sie ihn nicht auswählen. So können Sie diesen Teil des Codes vereinfachen:

For i = 1 To 78 
    nWord.Bookmarks("BM" & i).Range.InsertAfter (Cells(4, i + 6)) 
Next i 
Verwandte Themen