web-dev-qa-db-ja.com

VBAを介したMicrosoftWordリンクアイテムの更新

VBAを使用して、Excelスプレッドシートを参照するMSWordのリンクのItemを実用的に変更することはできますか?

以下のMSWord2010のリンクの編集メニューに示されている ファイルソースの変更 についての議論が見つかりましたが、アイテムではありません。 :

Edit link tab

まったく同じ質問がすでに出されています ここ 、しかし何の答えもなく、約2年前。リンクのソースを編集するために使用される LinkFormat プロパティのドキュメントも調べましたが、どこにも行きませんでした。

問題を解決する方法についてのアイデアは大歓迎です。

背景:Word文書にデータを供給するExcelスプレッドシートがあります。このドキュメントをテンプレートとして使用しようとしています。分析に応じて、データをWordドキュメントに送るスプレッドシートを変更します。スプレッドシート内のテーブル(そのようにフォーマットされていない)は、範囲が異なる場合があります。ただし、列の数は同じです。行数が異なるため、それに応じて[アイテム]フィールドを変更する必要があります。

編集

この問題のMWEとして2つのサンプルファイルを提供しました。それらは見つけることができます ここ

2
brodoll

私はこれに関連する作業を見つけました。 Itensを変更する代わりに、リンクされているすべての範囲に名前を付けるVBAスクリプトを作成しました。そのため、Wordでリンク項目を変更する代わりに、Excelで名前付き範囲の値を変更します。リンク項目は同じままですが、実用的に変更できる範囲を指しています。範囲に名前を付けるためにまとめたコードは次のとおりです。

Sub CreateNamedRanges()

Dim i As Integer
For i = 1 To Worksheets.Count
     sheetName = "Mysheet" & i
     varName = "Myvar" & CStr(i)
     Set Rng = Sheets(sheetName).Range("G6:I9")
     ActiveWorkbook.Names.Add Name:=varName, RefersTo:=Rng
Next i

End Sub

このアプローチの欠点は、以前に行ったすべての接続を手動で再作成(リンク)する必要があることです。ファイルソースを変更するために、質問リンクのコードを使用しました。完成のために、私はここにそれを書いています:

Sub changeSource()
Dim dlgSelectFile As FileDialog  'FileDialog object
Dim thisField As Field
Dim selectedFile As Variant    'must be Variant to contain filepath of selected item
Dim newFile As Variant
Dim fieldCount As Integer



'create FileDialog object as File Picker dialog box
Set dlgSelectFile = Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)



With dlgSelectFile
'use Show method to display File Picker dialog box and return user's action
    If .Show = -1 Then

        'step through each string in the FileDialogSelectedItems collection
        For Each selectedFile In .SelectedItems
            newFile = selectedFile    'gets new filepath
        Next selectedFile
    Else   'user clicked cancel
    End If
End With
Set dlgSelectFile = Nothing



'update fields
fieldCount = ActiveDocument.Fields.Count
For x = 1 To fieldCount
    ActiveDocument.Fields(x).LinkFormat.SourceFullName = newFile
Next x



End Sub

最後に、すべてのリンクを一度に更新するには:

Sub AutoOpen()
    ActiveDocument.Fields.Update
End Sub
1
brodoll