英文:
How can I return the text of a cross-reference when I have a reference to the heading, all inside VBA?
问题
I can help you translate the provided code into Chinese. Here's the translated code:
我想能够在VBA中返回交叉引用的完整段落文本,当我已经有一个对段落标题的交叉引用时。我需要在不修改原始字段代码的情况下完成这个操作。
例如,如果我创建一个对段落标题的交叉引用,字段代码将看起来类似于`{ REF _Ref136248344 \r \h}`,并将返回类似于`1.23`的内容。我可以手动通过移除`\r`将其转换为段落本身的文本,然后会得到`我引用的段落的完整文本`。
**我尝试过的方法**
我尝试使用VBA中的Field对象来获取原始引用(例如`{ REF _Ref136248344 \r \h}`),然后运行`Replace$(strCode, "\r", "")`来去掉`\r`并得到我需要的字段代码(在此示例中为`{ REF _Ref136248344 \h}`),但我找不到任何方法来在VBA中运行这个新的字段代码以获取结果。是否可以创建一个新的字段对象,将此字符串应用到`Field.Code`上,然后获取`Field.Code.Result`?
这是我的当前代码,它不起作用:
```vba
Public Function getTextFromCrossRef()
With Selection
If .Fields.Count > 0 Then
Dim myField As Field, crossRefText As String, crossRefResult As String
Set myField = .Fields(1)
crossRefText = "交叉引用 " & myField.result & " 是:"
crossRefResult = getFullTextFromFieldCode(myField)
modCallUserforms.callDisplayMesageNotModal "交叉引用的结果", crossRefText, crossRefResult
Else
MsgBox "选择中未找到交叉引用"
End If
End With
End Function
Public Function convertFieldCodeFromHeadingToText(strCode As String) As String
convertFieldCodeFromHeadingToText = Replace$(strCode, "\r", "")
End Function
'这是我尝试将字段代码应用于新字段的尝试 - 这不起作用
Public Function getFullTextFromFieldCode(inputField As Field) As String
Dim newField As Field
Dim inputFieldCode As String
Dim result As String
inputFieldCode = convertFieldCodeFromHeadingToText(inputField.Code)
With newField
.Code = inputFieldCode
End With
result = newField.result
End Function
也许另一种选择是使用字段代码返回到原始引用点,然后从那里复制?
我无法将新的字段代码复制并粘贴回原始文档。
我希望避免创建一个新的Word文档,想要的是快速支持新的动态查找。
最终结果
我进行了大量的合同审查,需要来回滚动到多个引用点,这些引用点通常相当复杂。我正在构建一个小型用户窗体,将在屏幕上返回交叉引用的文本,放在引用点旁边,以提高可用性并加快审查速度。
编辑
我尝试创建一个新字段并直接编辑它,但同时也修改了旧字段。我认为Word正在使用_Ref来识别它们。目前看来似乎无法做到我想要的。
请注意,我已经将代码进行了简单的翻译,但在中文环境下运行可能需要进一步的调整和测试。
<details>
<summary>英文:</summary>
I want to be able to return the full paragraph text of a cross-reference in VBA, when I already have a cross-reference to the paragraph heading. I need to do this without modifying the original field code.
For example, if I create a cross-reference to a paragraph heading, the field code will look something like `{ REF _Ref136248344 \r \h}` and will return something like `1.23`. I can manually convert this to the text of the paragraph itself by removing the `\r`, which will then give `the full text of the paragraph I'm cross-referencing`.
**What I've tried**
I've tried using the Field object in VBA to get the original reference (e.g. `{ REF _Ref136248344 \r \h}` ), then running `Replace$(strCode, "\r", "")` to take the `\r` out and give the field code I need (in this example. `{ REF _Ref136248344 \h}` , but I can't find any way of then running this new field code in VBA to get the result. Is it possible to make a new field object, apply this string to `Field.Code` and then get `Field.Code.Result`?
This is my current code, which doesn't work:
Public Function getTextFromCrossRef()
With Selection
If .Fields.Count > 0 Then
Dim myField As Field, crossRefText As String, crossRefResult As String
Set myField = .Fields(1)
crossRefText = "Cross-reference " & myField.result & " is:"
crossRefResult = getFullTextFromFieldCode(myField)
modCallUserforms.callDisplayMesageNotModal "Result of cross-reference", crossRefText, crossRefResult
Else
MsgBox "No cross-references found in selection"
End If
End With
End Function
Public Function convertFieldCodeFromHeadingToText(strCode As String) As String
convertFieldCodeFromHeadingToText = Replace$(strCode, "\r", "")
End Function
'This was my attempt to apply a field code to a new field - this doesn't work
Public Function getFullTextFromFieldCode(inputField As Field) As String
Dim newField As Field
Dim inputFieldCode As String
Dim result As String
inputFieldCode = convertFieldCodeFromHeadingToText(inputField.Code)
With newField
.Code = inputFieldCode
End With
result = newField.result
End Function
Possibly another option is to use the field code to get back to the original reference point, then copy from there?
I can't copy and paste the new field code back into the original document.
I'd prefer to avoid having to create a new Word document, the idea is for this to be quick and support new lookups dynamically.
**End result**
I do a lot of contract reviews, which necessitate scrolling backwards and forwards to multiple references, which are often quite complex. I'm building a small userform that will return the text of a cross-reference on screen, next to the place it is referenced, to aid usability and speed up review.
**Edit**
I tried creating a new field and editing it directly, but this also modifies the old field at the same time. I assume Word is using the _Ref to identify them. At the moment, it doesn't look like it's possible to do what I want.
Public Function getFullTextFromFieldCode(inputField As Field) As String
Dim newField As Field
Dim result As String
Dim newFieldCodeText As String
Set newField = inputField
newFieldCodeText = inputField.Code.text
newFieldCodeText = Replace$(newFieldCodeText, "\r", "")
newField.Code.text = newFieldCodeText
newField.Update 'This line also changes inputField to match newField
result = newField.result.text
getFullTextFromFieldCode = result
End Function
</details>
# 答案1
**得分**: 2
你的代码无法正常工作,因为`newField`只是一个带有Field数据类型的对象变量,它并不是一个字段,所以它无法具有结果。
实现你想要的最简单方法是临时更改字段代码,更新字段以获取结果,然后再将其改回来。
```VBA
Public Function getTextFromCrossRef()
With Selection
If .Fields.Count > 0 Then
Dim myField As Field, crossRefText As String, crossRefResult As String, fldCode As String
Set myField = .Fields(1)
crossRefText = "Cross-reference " & myField.result & " is:"
crossRefResult = getFullTextFromFieldCode(myField)
modCallUserforms.callDisplayMesageNotModal "Result of cross-reference", crossRefText, crossRefResult
Else
MsgBox "No cross-references found in selection"
End If
End With
End Function
Private Function getFullTextFromFieldCode(inputField As Field) As String
Dim origFieldCode As String, editedFieldCode As String
origFieldCode = inputField.Code
editedFieldCode = Replace$(inputField.Code, "\r", "")
With inputField
.Code = editedFieldCode
.Update
getFullTextFromFieldCode = .result
.Code = origFieldCode
.Update
End With
End Function
以上是你要的翻译内容。
英文:
Your code isn't working because newField
is simply an object variable with the datatype of Field. It does not exist as a field, so it cannot have a result.
The simplest way of achieving what you want is to temporarily change the field code, update the field to get the result, and change it back again.
Public Function getTextFromCrossRef()
With Selection
If .Fields.Count > 0 Then
Dim myField As Field, crossRefText As String, crossRefResult As String, fldCode As String
Set myField = .Fields(1)
crossRefText = "Cross-reference " & myField.result & " is:"
crossRefResult = getFullTextFromFieldCode(myField)
modCallUserforms.callDisplayMesageNotModal "Result of cross-reference", crossRefText, crossRefResult
Else
MsgBox "No cross-references found in selection"
End If
End With
End Function
Private Function getFullTextFromFieldCode(inputField As Field) As String
Dim origFieldCode As String, editedFieldCode As String
origFieldCode = inputField.Code
editedFieldCode = Replace$(inputField.Code, "\r", "")
With inputField
.Code = editedFieldCode
.Update
getFullTextFromFieldCode = .result
.Code = origFieldCode
.Update
End With
End Function
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论