Как указать значение перечисления в слове interop?

#vb.net #ms-word

#vb.net #ms-word

Вопрос:

Я работаю над инструментом для автоматизации редактирования в документах Word с использованием Visual Basic .NET. Я сослался на библиотеку Word и импортировал Microsoft.Офис.Пространство имен Interop.

Поскольку я новичок, я сначала запускаю пример по следующей ссылке ( https://support.microsoft.com/en-us/help/313193/how-to-automate-microsoft-word-by-using-visual-basic-to-create-a-new-d ). Однако код по этой ссылке устарел, и все ссылки, которые я проверил, не помогли исправить присвоение параметров методам перечисления, это выдает следующую ошибку

wdcollapseEnd не объявлен. Оно может быть недоступно из-за своего уровня защиты

Вот выдержка из моего кода

 Do 
  oRng = oDoc.Bookmarks("endofdoc").Range
  oRng.ParagraphFormat.SpaceAfter = 6
  oRng.InsertAfter("A line of text")
  oRng.InsertParagraphAfter()
Loop While Pos >= oRng.Information(wdVerticalPositionRelativeToPage)
'wdVerticalPositionRelativeToPage
oRng.Collapse(wdCollapseEnd)
oRng.InsertBreak(wdpagebreak)
  

Как исправить ошибки в приведенных выше строках?

Комментарии:

1. Используете ли вы внутренний VBA-редактор Word? Затем — как упоминалось в связанной статье — вам нужна ссылка на Microsoft Word x.x Object Library для использования wd... перечислений. Текущая версия 16.0. Кстати, вы не «присваиваете» значения перечислениям, но вы можете использовать либо перечисление, либо соответствующее ему числовое значение ( wdCollapseEnd или 0 одинаковы, wdCollapseStart или 1 одинаковы).

2. так, например, вместо wdVerticalPositionRelativeToPage я поставил 6, правильно? ссылка: learn.microsoft.com/en-us/office/vba/api/word.wdinformation в таком случае почему он не прочитал wd..ENUMs и считывает только значение (например, 0,1,6 .. и т.д.), Когда в примере кода они использовали значение wdCollapseEnd, а не 0.

Ответ №1:

Как упоминалось в комментарии, примеры кода для VBA не обязательно будут работать 1: 1 для кода в VB.NET . В случае перечислений необходимо их квалифицировать — код должен указывать VB.NET где их найти или использовать их числовые ( Integer ) эквиваленты.

Например, в имеющихся у вас объявлениях As Word.Table , которые сообщают VB.NET Table является членом Word библиотеки. Для перечислений необходимо указать второй уровень, идентификатор перечисления. Таким образом, полная квалификация wdCollapseEnd значения перечисления равна:

 oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
  

Или, используя числовой эквивалент:

 oRng.Collapse(0)
  

Если идентификатор или числовое значение перечисления неизвестно, его можно посмотреть в справочнике языка или в обозревателе объектов редактора VBA (запустите Word, F11, чтобы открыть редактор, F2, чтобы открыть обозреватель объектов, введите перечисление в поле поиска).

Как правило, код более удобочитаем, используя полное описательное имя перечисления. Однако, если используется поздняя привязка (без ссылки на библиотеку Word), числовое значение обязательно.

Ответ №2:

Ниже приведена рабочая версия примера кода для visual Basic, в котором вместо имен используются значения enum:

     Dim oWord As Word.Application
    Dim oDoc As Word.Document
    Dim oTable As Word.Table
    Dim oPara1 As Word.Paragraph, oPara2 As Word.Paragraph
    Dim oPara3 As Word.Paragraph, oPara4 As Word.Paragraph
    Dim oRng As Word.Range
    Dim oShape As Word.InlineShape
    Dim oChart As Object
    Dim Pos As Double


    'Start Word and open the document template.

    oWord = CreateObject("Word.Application")
    oWord.Visible = True
    oDoc = oWord.Documents.Add

    'Insert a paragraph at the beginning of the document.
    oPara1 = oDoc.Content.Paragraphs.Add
    oPara1.Range.Text = "Heading 1"
    oPara1.Range.Font.Bold = True
    oPara1.Format.SpaceAfter = 24    '24 pt spacing after paragraph.
    oPara1.Range.InsertParagraphAfter()

    'Insert a paragraph at the end of the document.
    '** endofdoc is a predefined bookmark.
    oPara2 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks("endofdoc").Range)
    oPara2.Range.Text = "Heading 2"
    oPara2.Format.SpaceAfter = 6
    oPara2.Range.InsertParagraphAfter()

    'Insert another paragraph.
    oPara3 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks("endofdoc").Range)
    oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:"
    oPara3.Range.Font.Bold = False
    oPara3.Format.SpaceAfter = 24
    oPara3.Range.InsertParagraphAfter()

    'Insert a 3 x 5 table, fill it with data and make the first row
    'bold,italic.
    Dim r As Integer, c As Integer
    oTable = oDoc.Tables.Add(oDoc.Bookmarks("endofdoc").Range, 3, 5)
    oTable.Range.ParagraphFormat.SpaceAfter = 6
    For r = 1 To 3
        For c = 1 To 5
            oTable.Cell(r, c).Range.Text = "r" amp; r amp; "c" amp; c
        Next
    Next
    oTable.Rows(1).Range.Font.Bold = True
    oTable.Rows(1).Range.Font.Italic = True

    'Add some text after the table.
    'oTable.Range.InsertParagraphAfter
    oPara4 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks("endofdoc").Range)
    oPara4.Range.InsertParagraphBefore()
    oPara4.Range.Text = "And here's another table:"
    oPara4.Format.SpaceAfter = 24
    oPara4.Range.InsertParagraphAfter()

    'Insert a 5 x 2 table, fill it with data and change the column widths.
    oTable = oDoc.Tables.Add(oDoc.Bookmarks("endofdoc").Range, 5, 2)
    oTable.Range.ParagraphFormat.SpaceAfter = 6
    For r = 1 To 5
        For c = 1 To 2
            oTable.Cell(r, c).Range.Text = "r" amp; r amp; "c" amp; c
        Next
    Next
    oTable.Columns(1).Width = oWord.InchesToPoints(2)   'Change width of columns 1 amp; 2.
    oTable.Columns(2).Width = oWord.InchesToPoints(3)

    'Keep inserting text. When you get to 7 inches from top of the
    'document, insert a hard page break.
    Pos = oWord.InchesToPoints(7)
    oDoc.Bookmarks("endofdoc").Range.InsertParagraphAfter()

    Do
        oRng = oDoc.Bookmarks("endofdoc").Range
        oRng.ParagraphFormat.SpaceAfter = 6
        oRng.InsertAfter("A line of text")
        oRng.InsertParagraphAfter()
    Loop While Pos >= oRng.Information(6)
    'wdVerticalPositionRelativeToPage
    oRng.Collapse(0)
    oRng.InsertBreak(7)

    oRng.Collapse(0)

    oRng.InsertAfter("We're now on page 2. Here's my chart:")
    oRng.InsertParagraphAfter()

    'Insert a chart and change the chart.
    oShape = oDoc.Bookmarks("endofdoc").Range.InlineShapes.AddOLEObject(
    ClassType:="MSGraph.Chart.8", FileName _
    :="", LinkToFile:=False, DisplayAsIcon:=False)
    oChart = oShape.OLEFormat.Object
    oChart.charttype = 4 'xlLine = 4
    oChart.Application.Update
    oChart.Application.Quit
    '... If desired, you can proceed from here using the Microsoft Graph 
    'Object model on the oChart object to make additional changes to the
    'chart.
    oShape.Width = oWord.InchesToPoints(6.25)
    oShape.Height = oWord.InchesToPoints(3.57)

    'Add text after the chart.
    oRng = oDoc.Bookmarks("endofdoc").Range
    oRng.InsertParagraphAfter()
    oRng.InsertAfter("THE END.")