2017-04-04 4 views
2

Excelのデータに基づいてWord文書を作成しようとしています。特定の仕事の要件の数のため、Wordでブックマークを保持する必要があります。私はこれらのサイトをリソースとして使用しました。ブックマークを削除せずにExcelからWord文書を取り込む

Replace Text in Bookmark in Word without Deleting Bookmark http://wordmvp.com/FAQs/MacrosVBA/InsertingTextAtBookmark.htm http://www.wiseowl.co.uk/blog/s199/word-bookmarks.htm

私はCopyCellの最後の行でコンパイルエラーを取得しています。

Option Explicit 
Dim wd As New Word.Application 
Dim DataCell As Range 

Sub ReportData() 

'Open word template 
wd.Documents.Open (Range("D4") & Range("D5")) 
wd.Visible = True 

'Creates range with all of the data used in the report 
Dim DataRange As Range 
Range("D7").Select 
Set DataRange = Range(ActiveCell, ActiveCell.End(xlDown)) 

'Uses copycell function. "Name" is the bookmark name, 0 is the Rowoffset 
For Each DataCell In DataRange 
    CopyCell "Name", 0 
    CopyCell "Employer", 1 
Next 

End Sub 

Sub CopyCell(BookMarkName As String, RowOffset As Integer) 

Dim BMRange As Word.Range 

wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName 
Set BMRange = wd.Selection.Range.Duplicate 
BMRange.Text = DataCell.Offset(RowOffset, 0).Value 
wd.Bookmarks.Add BookMarkName, BMRange 

End Sub 

答えて

1

Bookmarksので、変更する必要はありませWordのApplicationオブジェクト

Documentオブジェクトのプロパティです:

wd.Bookmarks.Add BookMarkName、BMRange

に:

wd.ActiveDocument.Bookmarks.Add BookMarkName、BMRange

さらに、あなたは以下のものを考えることがあります。

  • をあなたは(例:ユーザーフォームと通信する)厳密に避けられないところにパブリック変数の使用を制限する必要があり

  • Activate/ActiveXXX/Selectionを避けます/ Selectパターンを使用し、完全修飾範囲参照を使用する

  • "垂直"範囲を反復処理し、現在のセルを垂直方向にオフセットしています。 (すなわち、 1つ下のセル)もう一度:「水平に」(つまり、隣接するセルに)オフセットすることができますか?私はあなたの次のコードのリファクタリングを提案したいの上に何のすべてについて

Option Explicit 

Sub ReportData() 

    Dim wd As Word.Application 
    Dim DataCell As Range 

    Set wd = New Word.Application 

    'Open word template 
    wd.Documents.Open Range("D4") & Range("D5") 
    wd.Visible = True 

    'Creates range with all of the data used in the report 
    With Range("D7") 
     'Uses copycell function. "Name" is the bookmark name, 0 is the Rowoffset 
     For Each DataCell In Range(.Cells, .End(xlDown)) 
      CopyCell wd, DataCell, "Name", 0 
      CopyCell wd, DataCell, "Employer", 1 
     Next 
    End With 

    wd.ActiveDocument.Close True '<--| close and save word document 
    wd.Quit '<--| close word application 
    Set wd = Nothing '<--| clean memory 
End Sub 

Sub CopyCell(wd As Word.Application, DataCell As Range, BookMarkName As String, ColOffset As Integer) 

    Dim BMRange As Word.Range 

    wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName 
    Set BMRange = wd.Selection.Range.Duplicate 
    BMRange.Text = DataCell.Offset(0, ColOffset).Value 
    wd.ActiveDocument.Bookmarks.Add BookMarkName, BMRange 

End Sub 
+0

リファクタリングは素晴らしい作品。ありがとうございました – MaineBlackBears

関連する問題