Измените встроил рабочую книгу Excel в документ Word через VBA

var qtd = dataRow[3]; ничего не значит, потому что в возвращенных данных нет индекса [3], что приводит к ошибке.

Более простой путь для доступа к выбранным в этой строке:

$(document).on('click','.add_btn',function (){
  var id = $(this).attr("id");
  var dataRow = $('#example').DataTable().row( id ).data();
  var price = dataRow[2];
  var qtd_num = $(this).closest('tr').find('select').val()
  ...
})
8
задан shruti1810 28 May 2015 в 05:30
поделиться

2 ответа

Yikes, не делай того, что ты предлагаешь в своем комментарии. Скорее всего, у вас будет несколько экземпляров Excel (проверьте «Диспетчер задач» и посмотрите, сколько их осталось после выполнения кода).

Во-первых, добавьте ссылку на библиотеку объектов Excel («Проект» -> «Ссылки» и выберите объект Microsoft Excel). Библиотека). Теперь вы можете объявить ваши объекты как настоящие типы Excel и использовать раннее связывание, а не объявлять их как «Объект» и использовать позднее связывание. Это не является строго необходимым, но помимо всего прочего это означает, что вы получаете Intellisense при редактировании кода.

Вы делаете правильные вещи вплоть до .OleFormat.Edit. (Я бы лично использовал .OleFormat.Activate, но так как я никогда не пытался использовать .Edit, я не мог сказать, что это имеет значение).

Сделав. Активируйте (или, предположительно, .Edit), затем вы сможете получить доступ к члену OleFormat.Object. Поскольку внедренный объект представляет собой диаграмму Excel, «Объект» будет рабочей книгой Excel, поэтому вы можете сделать это:

Dim oOleFormat as OleFormat
Set oOleFormat = ...

oOleFormat.Activate

Dim oWorkbook As Excel.Workbook
Set oWorkbook = oOleFormat.Object

' Do stuff with the workbook
oWorkbook.Charts(1).ChartArea.Font.Bold = True

Обратите внимание, что вам НЕ нужно закрывать Excel, и вы действительно не можете - Word «владеет» используемым экземпляром. для редактирования на месте, и будет решать, когда его закрыть. На самом деле это является проблемой, поскольку нет очевидного способа принудительно деактивировать встроенный объект, поэтому диаграмма останется открытой после выполнения кода, приведенного выше.

Существует хакерский способ получить График, чтобы закрыть, хотя. Если вы добавите команду Word, чтобы активировать ее как-то еще, она сначала будет деактивирована. Так что, если вы скажете ему активировать его как нечто бессмысленное, вы достигнете правильного результата, потому что Я деактивирую его, а затем не смогу снова его активировать. Итак, добавьте следующую строку:

oOleFormat.ActivateAs "This.Class.Does.Not.Exist"

Обратите внимание, что это вызовет ошибку, поэтому вам необходимо временно отключить обработку ошибок, используя On Error Resume Next. По этой причине я обычно создаю метод Deactivate, чтобы избежать нарушения обработки ошибок в моем основном методе. Как в:

Private Sub DeactivateOleObject(ByRef oOleFormat as OleFormat)
    On Error Resume Next
    oOleFormat.ActivateAs "This.Class.Does.Not.Exist"
End Sub

Надеюсь, это поможет. Гэри

7
ответ дан 5 December 2019 в 15:26
поделиться

У меня есть решение моей собственной проблемы. Дальнейшие комментарии будут цениться -

Sub TestMacro()

    Dim lNumShapes As Long
    Dim lShapeCnt As Long
    Dim xlApp As Object
    Dim wrdActDoc As Document

    Set wrdActDoc = ActiveDocument

    For lShapeCnt = 1 To 1 'wrdActDoc.InlineShapes.Count
        If wrdActDoc.InlineShapes(lShapeCnt).Type = wdInlineShapeEmbeddedOLEObject Then
            If wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.ProgID = "Excel.Sheet.8" Then
                wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.Edit
                Set xlApp = GetObject(, "Excel.Application")
                xlApp.Workbooks(1).Worksheets(1).Range("A1") = "This is A modified"
                xlApp.Workbooks(1).Save
                xlApp.Workbooks(1).Close
                xlApp.Quit
            End If
        End If
    Next lShapeCnt

End Sub
2
ответ дан 5 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: