Vba не распознает объект OLE

Привет всем крутым программистам!

Может ли кто-нибудь объяснить мне, как я могу решить эту проблему? Он отлично работает в Excel 2003, но в 2010 я получаю эту ошибку:

Ошибка выполнения '-2147024809 (80070057)'

Может ли кто-нибудь направить меня в правильном направлении? Что ScaleHeight должен делать, так это следить за тем, чтобы ВЕСЬ текст, скопированный в объект слова, был виден - что не так, если я устанавливаю scaleheight равным 1, а msoFalse.

Вы должны иметь возможность скопировать и вставить код в новую подпрограмму.

Sub Embed_WordDocument_To_sheet()

Dim oWD As Document ' Word Document Object (Use Microsoft Word Reference)

Set ws = Worksheets.Add
Set wsFactark = Worksheets("Sheet1")

ws.Range("C3").Select

Set oOLEWd = ws.OLEObjects.Add( _
    ClassType:="Word.Document", _
    Width:=375)

oOLEWd.Name = "EmbeddedWordDoc"
oOLEWd.ShapeRange.LockAspectRatio = msoFalse
oOLEWd.Width = 375
oOLEWd.Height = 10 ' bliver ligegyldig når du har gjort det som står i nederste kommentar.
oOLEWd.Top = ws.Range("C3").Top + 2 ' +2 for ikke at overstrege border-linjen
oOLEWd.Left = ws.Range("C3").Left + 5 ' samme

' PROBLEM - "The relativetooriginalsize argument applies only to a picture or an OLE object." !!!
oOLEWd.ShapeRange.ScaleHeight 1, msoTrue ' msoFalse works, msoCTrue doesn't

oOLEWd.Placement = xlFreeFloating

' Assign the OLE Object to Word Object
Set oWD = oOLEWd.Object
wsFactark.Cells(I + 4, 13).Copy

oWD.Paragraphs(oWD.Paragraphs.Count).Range.PasteAndFormat (wdFormatOriginalFormatting)

With oWD.PageSetup
.TopMargin = 0
.BottomMargin = 0
.LeftMargin = 0
.RightMargin = 0
    .PageHeight = 1584 'max
    .PageWidth = 1584
End With

oOLEWd.Activate

oOLEWd.Height = selection.Application.UsableHeight

oOLEWd.ShapeRange.Line.Visible = msoFalse

If oOLEWd.Height > 400 And oOLEWd.Height < 800 Then
    ws.Range("B3").RowHeight = 400
    ws.Range("B4").RowHeight = oOLEWd.Height - 400 + 20
ElseIf oOLEWd.Height > 800 And oOLEWd.Height < 1000 Then
    ws.Range("B3").RowHeight = 400
    ws.Range("B4").RowHeight = 200
    ws.Range("B5").RowHeight = 200
    ws.Range("B7").RowHeight = oOLEWd.Height - 800 + 20
ElseIf oOLEWd.Height > 1000 And oOLEWd.Height < 1200 Then
    ws.Range("B3").RowHeight = 400
    ws.Range("B4").RowHeight = 200
    ws.Range("B5").RowHeight = 200
    ws.Range("B6").RowHeight = 200
    ws.Range("B7").RowHeight = 200
    ws.Range("B9").RowHeight = oOLEWd.Height - 1000 + 20
Else
    ws.Range("B3").RowHeight = oOLEWd.Height
    ws.Range("B4:B11").RowHeight = 0
End If
    ws.Range("B12").RowHeight = 10

Range("A1").Select

End Sub

person FransRasmussen    schedule 11.03.2015    source источник
comment
В чем смысл этой строки кода? Я не работал с этим, но если удалить строку, код работает, и он, похоже, пытается изменить размер объекта с коэффициентом 1 до его исходного размера. Если это на самом деле ничего не делает, я бы просто удалил строку кода.   -  person OpiesDad    schedule 11.03.2015
comment
Под строкой кода в приведенном выше комментарии я имею в виду oOLEWd.ShapeRange.ScaleHeight 1, msoCTrue Документация на веб-сайте Microsoft предполагает, что вы не можете использовать msoCTrue в VBA, но я могу ошибаться.   -  person OpiesDad    schedule 11.03.2015
comment
@OpiesDad Нет, на самом деле ты прав. Я также пробовал с msoTrue, но безрезультатно. msoFalse работает, что подчеркивает тот факт, что, по-видимому, мой oOLEWd не является объектом OLE. Но почему так, и что я могу сделать, чтобы scaleheight достиг 1?   -  person FransRasmussen    schedule 11.03.2015
comment
Этот метод не устанавливает высоту шкалы на 1, он фактически масштабирует ее с коэффициентом 1, что означает, что он ничего не делает. Состояние True/False относится к масштабированию изображения на основе ИСХОДНОГО размера объекта, а не текущего размера объекта. Ошибка может неправильно указывать, что это не объект OLE, тогда как на самом деле это означает, что объект не может сохранить свое ИСХОДНОЕ состояние. Однако я не уверен, как настроить объект для хранения этого состояния. Я объявил oOLEwd как OLEObject и получил такое же сообщение об ошибке. Вам нужно изменить его размер до исходного размера?   -  person OpiesDad    schedule 11.03.2015
comment
Да - это именно то, что мне нужно. Я попытался установить «1», например. 1.1 или 2, он показывает одно и то же сообщение. Вы можете лучше понять проблему, если остановите код на ошибке, а затем зайдете в настройки формата слова объекта, в размер и установите высоту на 100% . ЭТО то, что мне нужно, чтобы мой код делал.! Глупость в том, что это работает в excel 2003?   -  person FransRasmussen    schedule 11.03.2015
comment
Когда вы делаете это, настройка отличается от 100%? Когда я пытаюсь это сделать, настройка уже на 100%.   -  person OpiesDad    schedule 12.03.2015
comment
Он работает и в Excel 2007, но не в 2010.   -  person OpiesDad    schedule 12.03.2015
comment
Не могли бы вы просто сохранить исходную высоту, а затем вернуть ее к исходной? Я не могу понять, почему это не будет работать, как написано, но вы могли бы, по крайней мере, сделать это. Какова цель изменения высоты и ширины, а затем обратного изменения через 3 строки?   -  person OpiesDad    schedule 12.03.2015
comment
Эй, чувак, спасибо, что нашел время помочь мне! :-) высота объекта переменная. это зависит от «я».. Это только 100%, если скопированный текст достаточно мал. В противном случае он ниже 100% - это означает, что отображается не весь текст. Это проблема, потому что в другом месте программы я сохраняю лист как PDF. wsFactark.Cells(I + 4, 13).Copy Странно, если в 2007 работает, а в 2010 нет. :/   -  person FransRasmussen    schedule 12.03.2015
comment
Я попытался добавить справочную библиотеку Word 2007 года, и это все еще не работает в 2010 году. Не совсем уверен, что еще делать.   -  person OpiesDad    schedule 12.03.2015
comment
Супер странно!! Вы знаете, где я могу найти помощь в решении этой проблемы?   -  person FransRasmussen    schedule 12.03.2015
comment
К сожалению, нет. Если у меня будет еще немного времени, я, возможно, попытаюсь еще немного повозиться с ним, но желаю удачи.   -  person OpiesDad    schedule 12.03.2015


Ответы (1)


это может помочь (по крайней мере, в моей системе - Excel 2010):

Sub M_snb()
  ActiveSheet.OLEObjects.Add , "G:\example.docx", True, False, , , , Columns(3).Left, Rows(3).Top
End Sub

чтобы сохранить документ Word в формате PDF:

Sub M_snb()
 Sheet1.Range("A1:G7").Copy

 With CreateObject("Word.document")
  .Windows(1).Visible = True
  .Content.Paste
  .ExportAsFixedFormat "G:\OF\new.pdf", 17
  .Close -1
 End With
End Sub
person snb    schedule 16.03.2015
comment
Хм... Разве это не означает, что объект документа уже существует? Сейчас он не создается до саба, а из саба я копирую в него текст.. - person FransRasmussen; 16.03.2015
comment
Насколько я вижу, вы хотите скопировать только 1 ячейку в документ Word. Вы можете сделать то же самое, открыв пустой документ Word с кодом, который я показал, и вставив эту ячейку во вновь созданный oleobject. Или: откройте документ Word, вставьте ячейку, сохраните документ Word, откройте его в файле excel как oleobject. - person snb; 16.03.2015
comment
Этот саб является лишь частью моей программы. У меня есть таблица с кучей информации о том, как работать со строительным проектом. Появляется все больше «рецептов», которые объясняют конкретные аспекты проекта. В таблице каждая строка — это рецепт, а столбцы — это как, почему, когда, заметки и т. д. Моя программа берет информацию из каждой строки и помещает ее на новый лист. Затем он печатает его в формате PDF и занимает следующую строку. Это столбец «как» вызывает у меня некоторые проблемы. Длина текста является переменной, поэтому высота объекта также должна быть переменной. - person FransRasmussen; 16.03.2015
comment
Я путаюсь: вы хотите документ Word?, PDF-файл? или Worddocument как OleObject на листе? Я добавил код, как сохранить скопированный диапазон в документе Word в виде PDF-файла. - person snb; 17.03.2015
comment
Я понимаю, почему ты в замешательстве. Мне нужен объект слова в электронной таблице excel, который должен быть сохранен в формате pdf. У меня есть таблица, из которой каждая строка будет выведена в формате pdf. Каждая строка состоит из того, как, когда, где и т. д. для строительного проекта. Мне это нужно, чтобы я мог обновить его в одном месте вместо 8 разных мест. - person FransRasmussen; 17.03.2015
comment
Я думаю, что мое последнее предложение кода делает именно это. Внедрение олеобъекта Word в Excel — ненужный сложный метод. - person snb; 17.03.2015
comment
Чудесно! Я попробую это в следующий раз, когда буду на работе, и посмотрю, к чему это приведет. Я обязательно сделаю обновление здесь. - person FransRasmussen; 18.03.2015