#excel #vba #bookmarks #cross-reference
Вопрос:
Я пытаюсь получить нумерованные местоположения моих закладок (номер абзаца без контекста) в документе Word (длинный шаблон юридического документа) и. В настоящее время я использую следующий код для извлечения текстовых значений с закладками из документа Word в книгу Excel, которую я создал, чтобы получить другие данные из других источников, но я не смог понять, как манипулировать кодом, чтобы захватить номера абзацев в закладках (я тоже искал их повсюду, и я новичок в VBA. Я знаю ровно столько, чтобы быть опасным, но недостаточно, чтобы быть полезным, лол). Пожалуйста, Помогите!
Sub SectionLocationImportTESTING()
Dim intDocCount As Integer
Dim wdApp As Word.Application, wdDoc As Word.Document, xlWb As Excel.Workbook, xlWs As Excel.Worksheet
Dim BookmarkText As String
Set wdApp = GetObject(, "Word.Application")
On Error GoTo 0
If wdApp Is Nothing Then
MsgBox "There are no MS Word Documents open.", vbInformation, "No Word Documents open"
Exit Sub
End If
Set xlWb = ThisWorkbook
Set xlWs = ActiveWorkbook.Sheets("Data Input")
intDocCount = wdApp.Documents.Count
If intDocCount > 1 Then
MsgBox "There are " amp; intDocCount amp; " Word Documents open." amp; vbNewLine amp; vbNewLine amp; _
"Please close the additional MS Word Documents", vbCritical, "Too many Word Documents open!"
Set wdApp = Nothing
Exit Sub
End If
With wdApp
Set wdDoc = wdApp.ActiveDocument
wdDoc.Activate
'This is very abbreviated, I have about 300 bookmarks that transfer
If wdDoc.Bookmarks.Exists("Section_Rent") = True Then
BookmarkText = wdDoc.Bookmarks("Section_Rent").Range.Text
xlWs.Cells(202, 22) = ("Section_Rent")
xlWs.Cells(202, 23) = BookmarkText
End If
End With
ActiveWorkbook.RefreshAll
ActiveSheet.PivotTables("Data_Input_Table").PivotFields("Trimmed Data"). _
PivotFilters.Add2 Type:=xlCaptionIsGreaterThan, Value1:="0"
Columns("D:D").EntireColumn.AutoFit
Range("A1").Select
MsgBox "Transfer is complete."
End Sub
Комментарии:
1. Вы ищете автоматически пронумерованный текст абзаца закладки? например, (a), (1) и т. Д. В вашем коде это может быть
wdDoc.Bookmarks("Section_Rent").Range.ListFormat.ListString
, и вместо жесткого кодирования имени вашей закладки вы можете подумать о циклическом просмотре коллекции закладок (но я надеюсь, что у вас есть формат для закладки, который вы можете использовать для фильтрации, поскольку закладка, как правило, используется и для множества других вещей).2. Я понятия не имею, что такое автоматический номер. Я хотел бы, чтобы word сообщил excel, в каком номере раздела находится текст, который я добавляю в закладку. Как номер раздела с перекрестной ссылкой из word.
3. Я также понятия не имею, что такое зацикливание и как это делается.
4. Основываясь на вашем комментарии в ответе Тима, то, что вы хотите, должно быть
wdDoc.Bookmarks("Section_Rent").Range.ListFormat.ListString
.
Ответ №1:
Я не думаю, что есть прямой способ сделать это.
Вы могли бы сделать это, например:
Sub Tester()
Debug.Print ParagraphNumber(Selection.Range)
End Sub
Function ParagraphNumber(rng As Range)
ParagraphNumber = rng.Document.Range(0, rng.End).Paragraphs.Count
End Function
…но это также будет учитывать «пустые» абзацы.
Если у вас много закладок, вы можете просмотреть список имен на листе Excel, а затем выполнить цикл по этому диапазону для извлечения текста. Если вы жестко закодируете все эти имена в свой VBA, это будет очень сложно поддерживать.
Напр.
'...
Dim c As Range, bm As String, rngBM As Word.Range
'...
'...
Set wdDoc = wdApp.ActiveDocument
wdDoc.Activate
'range with your bookmark names
Set rngBM = ThisWorkbook.Sheets("Bookmarks").Range("A2:A300")
For Each c In rngBM.Cells
bm = c.Value 'bookmark name
If wdDoc.Bookmarks.Exists(bm) Then
Set rngBM = wdDoc.Bookmarks(bm).Range
'for demo purposes just putting info next to the bookmark name...
c.Offset(0, 1).Value = rngBM.Text
c.Offset(0, 2).Value = ParagraphNumber(rngBM)
End If
Next c
Комментарии:
1. У меня есть формула excel, которая объединяет имеющиеся у меня закладки в общие формулы. Я надеялся, что есть какой-то способ интегрировать «перекрестную ссылку» или «перекрестную ссылку», которые, как я вижу, используются в word. Пример: Выбор. Тип ссылки InsertCrossReference:=»Закладка», ссылка на ссылку:= _ wdNumberNoContext, элемент ссылки:=»SECTION_RENT», ссылка на вставку:=True _ , Включение:=Ложь, Отдельные номера:=Ложь, строка разделителя:=» » Но в любом случае я понятия не имею, как подключить то, что вы только что перечислили… ПОЛНЫЙ новичок.
2. *** Это не позволит мне редактировать, у меня есть рабочий лист excel, который генерирует основную часть кода для закладок. это более 800 строк, поэтому я не включил его сюда
3. Если вы используете Excel для создания VBA, то вместо этого вы можете использовать ту же информацию для управления извлечением (т. Е. Без создания более 800 строк VBA). Однако вы показываете только одну отметку книги, поэтому трудно увидеть, какой схеме следуют другие. Это может помочь вашему вопросу включить скриншот части документа (отредактированный соответствующим образом) с указанием расположения примера закладки и «Номера абзаца», который вы хотите извлечь вместе с текстом закладки.
Ответ №2:
Есть 2 способа получить номер абзаца, в зависимости от того, что вы хотите:
Вариант 1
Это позволит получить точную строку автоматической нумерации, которую вы видите в самом абзаце:
Например, приведенный ниже абзац поможет вам 1.
- Это тестовый абзац.
If wdDoc.Bookmarks.Exists("Section_Rent") Then
Dim BookmarkText As String
BookmarkText = wdDoc.Bookmarks("Section_Rent").Range.Text
xlWs.Cells(202, 22) = "Section_Rent"
xlWs.Cells(202, 23) = BookmarkText
Dim BookmarkParaNum As String
BookmarkParaNum = wdDoc.Bookmarks("Section_Rent").Range.ListFormat.ListString
xlWs.Cells(202, 24) = BookmarkParaNum
End If
Вариант 2
Это приведет к получению строки, которую вы увидите, если вставите перекрестную ссылку на абзац:
Использование приведенного ниже кода для того же абзаца в варианте 1 даст вам то 1
же самое , что и вставка его в качестве перекрестной ссылки.
wdDoc.Paragraphs.Last.Range.InsertParagraphAfter 'A temporary paragraph for inserting field later
Dim fieldRng As Range
Set fieldRng = wdDoc.Paragraphs.Last.Range.Duplicate
If wdDoc.Bookmarks.Exists("Section_Rent") Then
Dim BookmarkText As String
BookmarkText = wdDoc.Bookmarks("Section_Rent").Range.Text
xlWs.Cells(202, 22) = "Section_Rent"
xlWs.Cells(202, 23) = BookmarkText
fieldRng.InsertCrossReference ReferenceType:="Bookmark", ReferenceKind:=wdNumberNoContext, ReferenceItem:="Section_Term", InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
Dim tempField As Field
Set tempField = fieldRng.Fields(1)
Dim BookmarkParaNum As String
BookmarkParaNum = tempField.Result
xlWs.Cells(202, 24) = BookmarkParaNum
tempField.Delete
End If
fieldRng.Delete 'Delete the temporary paragraph