Давать уравнения конкретных чисел

Обновить

April 2019

Просмотры

53 раз

1

Я новичок в VBA, и я бы очень признателен за помощь. Во-первых, я должен упомянуть, что я использую OFFICE 2016 года я использовал Macro запись, чтобы создать макрос, который копирует выделенный уравнение затем вставляет таблицу (один ряд, две колонки) и отрегулировать его, чтобы удалить границы. После того, что макро пасты скопированное уравнение в первой ячейке и перемещается в следующую ячейку и вставить пустое уравнение (которые пользователь вставляет нужное количество уравнения в нем). Он отлично работает, за исключением, пока он не достигнет стадии, где он должен вставить скопированный уравнение. Каждый раз, когда я запускаю макрос я получаю

Ошибка времени выполнения: 6335

и макро-брейки и когда я его отладки, это линия, которая ломает процедуру:

Selection.PasteAndFormat (wdFormatOriginalFormatting)

после отладки, когда я нажал на кнопку продолжения / запуск, он завершает работу по мере необходимости. Ниже макрос я использую. Заранее спасибо.

Sub MacroEQNUMBER()
'
' MacroEQNUMBER Macro
'
'
Dim rng As Range
If Selection.Range = "" Then
        Selection.HomeKey Unit:=wdLine
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    End If
Set rng = Selection.Range
rng.Cut
    ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=1, NumColumns:= _
        2, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
        wdAutoFitFixed
    With Selection.Tables(1)
        If .Style <> "Table Grid" Then
            .Style = "Table Grid"
        End If
        .ApplyStyleHeadingRows = True
        .ApplyStyleLastRow = False
        .ApplyStyleFirstColumn = True
        .ApplyStyleLastColumn = False
        .ApplyStyleRowBands = True
        .ApplyStyleColumnBands = False
        .Borders.Enable = False
    End With
    Selection.Tables(1).Cell(1, 1).Range.Select
    Selection.TypeText Text:="["
    Selection.OMaths.Add Range:=Selection.Range
    Selection.MoveRight Unit:=wdCharacter, Count:=2
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.TypeText Text:="]"
    Selection.MoveLeft Unit:=wdCharacter, Count:=2
    Selection.Tables(1).Columns(1).Cells.Width = 80
    Selection.Tables(1).Columns(2).Cells.Width = 350
    Selection.Tables(1).Cell(1, 2).Range.Select
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    Selection.TypeBackspace
    Selection.HomeKey Unit:=wdLine
    Selection.MoveLeft Unit:=wdCharacter, Count:=4

End Sub

1 ответы

0

I get the feeling the problem comes from pasting the equation. Since you're using Selection it's quite possible you're putting the Selection in a table cell structure. Word used to allow this, which would "break" the document. In more recent versions it's simply not allowed, which will result in an error...

Rather than try to put bandaids on your recorded code, I've done my best to interpret what is meant (thank you for the excellent description) and convert it to "object code". The SELECTION object isn't ideal because you can never be sure where it is, nor what is meant. Better is to use the underlying object model, usually RANGE objects.

To begin, the Selection is assigned to a Range - now, no matter where the visible selection is in the document, the Range will never change.

Next, I assign the new table to a Table object. From that, I can get the Range of the first cell and work with it (insert text).

I apparently do need a Selection for inserting the OMath, so I position between the square brackets, select and insert that. Finally, the columns are formatted, the cut equation pasted and the selection positioned at the beginning of the first cell (I think that's what you wanted, but I'm not sure about this last).

Sub MacroEQNUMBER()
'
' MacroEQNUMBER Macro
'
'
Dim rng As Range
Dim tbl As word.Table
Dim cel As word.Cell
Dim rngCell As word.Range

If Selection.Range = "" Then
        Selection.HomeKey Unit:=wdLine
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    End If
Set rng = Selection.Range
rng.Cut
    Set tbl = ActiveDocument.Tables.Add(Range:=Selection.Range, NumRows:=1, NumColumns:= _
        2, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
        wdAutoFitFixed)
    With tbl
        If .Style <> "Table Grid" Then
            .Style = "Table Grid"
        End If
        .ApplyStyleHeadingRows = True
        .ApplyStyleLastRow = False
        .ApplyStyleFirstColumn = True
        .ApplyStyleLastColumn = False
        .ApplyStyleRowBands = True
        .ApplyStyleColumnBands = False
        .Borders.Enable = False
    End With

    Set cel = tbl.Cell(1, 1)
    Set rngCell = cel.Range
    rngCell.Text = "[]"
    rngCell.Collapse wdCollapseStart
    rngCell.MoveStart wdCharacter, 1

    rngCell.Select
    rngCell.OMaths.Add Range:=rngCell

    tbl.Columns(1).Cells.width = 80
    tbl.Columns(2).Cells.width = 350

    Set rngCell = tbl.Cell(1, 2).Range
    rngCell.PasteAndFormat wdFormatOriginalFormatting
    rngCell.Characters(rngCell.Characters.Count - 1).Delete
    tbl.Cell(1, 1).Select
    Selection.Collapse wdCollapseStart
End Sub