1

もう少し詳細:

  1. コンテンツコントロールを含む(多くの)ドキュメントを1つのドキュメントに挿入しています。
  2. 各ドキュメントのコンテンツコントロールの1つは、タイトルコントロール(ドキュメントプロパティにリンクされている)です。これは、挿入時に宛先ドキュメントのタイトルと同じ値を自然に受け取ります。
  3. コントロールのタイトルやタグの名前を変更し、wordまたはvbaを使用しても、問題は解決しません(奇妙なことです!)
  4. 私が提案する解決策は、別の名前で新しいコントロールを作成し、元のタイトルコントロールから.range.textをコピーしてから、タイトルコントロールを削除することです。

変更が必要なすべてのファイルを通過するループがあり、正常に機能します。ただし、私が何をしているように見えても、作成した新しいコントロールはドキュメントの先頭に表示され、正しい場所には表示されません(ドキュメントのコードが前にあるコントロールがあります)。

アイデア?余談ですが、コントロール名の変更が機能しない論理的な理由はありますか?

現在のコード:

Sub FieldChanger()

Dim docCur As Document
Dim strCurPath As String
Dim strCurFile As String
Dim rngTitle As Range
Dim strTitle As String
Dim ccName As ContentControl

strCurPath = "C:\Users\User\Desktop\BGS\Final\"
strCurFile = Dir(strCurPath & "*.docx")

Do While strCurrentFile <> ""
    Set docCur = Application.Documents.Open(strCurPath & strCurFile)
        With docCur.ContentControls
            .Item(1).LockContents = False //Unlock outer content control
            Set rngTitle = .Item(3).Range
            strTitle = rngTitle.Text
            rngTitle = rngTitle.Move(wdCharacter, 1)
            ccName = rngTitle.ContentControls.Add(wdContentControlRichText) //This line throws a 4198 error
            ccName.Title = "ccName"
            ccName.Tag = "ccName"
            ccName.Range = strTitle
            ccName.LockContentControl = True
            .Item(3).LockContentControl = False
            .Item(3).Delete
            .Item(1).LockContents = True //Lock outer content control
        End With
    docCur.Save
    docCur.Close
    strCurFile = Dir
Loop

End Sub
4

1 に答える 1

3

余談ですが、コントロール名の変更が機能しない論理的な理由はありますか?

コンテンツコントロール(CC)の名前は単なる名前です。CCの名前を「タイトル」から変更しても、Wordがコンテンツを取得する場所は変わりません。また、CCに「タイトル」という名前を付けると、Wordがドキュメントのタイトル文字列をCCに配置することもありません。空のドキュメントを作成する場合は、Titleドキュメントプロパティを(CCとして)挿入し、次の値を確認します。

activedocument.ContentControls(1).XMLMapping.XPath

あなたはおそらく価値を見るでしょう

/ ns1:coreProperties [1] / ns0:title [1]

これは、Title組み込みドキュメントプロパティの値をCCに配置する必要があること、およびそれを取得する場所をWordに通知するものです。同じメカニズムを使用して、独自のプレーンテキストCCを組み込みプロパティにリンクすることも、独自の「カスタムXMLパーツ」のノードにリンクすることもできます。しかし、それらは何かにリンクされている必要はありません。

コードに関しては、このようなものはどうですか(NB、「strCurrentFile」もstrCurFileに変更しました)。CC値を新しいCCとして本当に再挿入する必要があるのか​​(つまり、CCを削除して既存の値をそのままにしておくのではないのか)疑問に思いましたが、そこにCCが必要であると想定しました。

注意:VBAの原則として、範囲変数やCCなどのオブジェクトの値を設定するときはSetキーワードを使用する必要があります。理論的には、オブジェクトを使い終わったら、オブジェクトをNothingに設定する必要があります(たとえば、Set rngTitle = Nothing)。ここにはそのようなものは追加していません。VB.NETでは、これらのいずれかを実行する必要はありません。

Dim docCur As Document
Dim strCurPath As String
Dim strCurFile As String
Dim rngTitle As Range
Dim strTitle As String
Dim ccName As ContentControl

strCurPath = "C:\a\test\"
strCurFile = Dir(strCurPath & "*.docx")

Do While strCurFile <> ""
    Set docCur = Application.Documents.Open(strCurPath & strCurFile)
        With docCur.ContentControls
            .Item(1).LockContents = False 'Unlock outer content control
            Set rngTitle = .Item(3).Range
            strTitle = rngTitle.Text
            ' we need the following line to ensure that deleting the range
            ' does not remove the CC prematurely
            .Item(3).Temporary = False
            rngTitle.Delete
            rngTitle.Collapse wdCollapseStart
            ' Delete the control here instead of later
            .Item(3).LockContentControl = False
            .Item(3).Delete
            Set ccName = rngTitle.ContentControls.Add(wdContentControlRichText) 
            ccName.Title = "ccName"
            ccName.Tag = "ccName"
            ccName.Range = strTitle
            ccName.LockContentControl = True
            .Item(1).LockContents = True 'Lock outer content control
        End With
    docCur.Save
    docCur.Close
    strCurFile = Dir
Loop

コメントの統合...

役立つ可能性のあるアドインがあります。たとえば、cctw.codeplex.comのデータバインディングツールキット(最近そのリンクをチェックしていません)

于 2012-09-03T09:13:13.150 に答える