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

Здравейте на всички страхотни програмисти!

Може ли някой да ми обясни как да оправя този проблем? Работи чудесно в excel 2003, но през 2010 получавам тази грешка:

Грешка по време на изпълнение '-2147024809 (80070057)'

Може ли някой да ме насочи в правилната посока? Това, което трябва да направи scaleheight, е да се увери, че ЦЕЛИЯТ текст, копиран в обекта Word, е видим - което не е така, ако задам 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 обект. Но защо е така и какво мога да направя, за да накарам височината на скалата да достигне 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, показва същото съобщение.. Можете да разберете по-добре проблема, ако спрете кода при грешката и след това отидете в настройките за формат на Word object, в размер и задайте височината на 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 Reference за 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
Хм... това няма ли да означава, че обектът документ вече съществува? В момента той не е създаден до преди sub и от sub копирам текста в него.. - person FransRasmussen; 16.03.2015
comment
Доколкото виждам, искате да копирате само 1 клетка в документа на Word. Можете да постигнете абсолютно същото, като отворите празен документ на Word с кода, който показах, и поставите тази клетка в новосъздадения oleobject. Или: отворете документа на Word, поставете клетката, запишете документа на Word, отворете го в excelfile като 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
Разбирам защо си объркан. Искам word-обект в електронната таблица на excel, който да бъде записан като pdf. Имам таблица, от която всеки ред ще бъде изведен като pdf. Всеки ред се състои от как, кога, къде и т.н. за строителен проект. Имам нужда от това, за да мога да го актуализирам на едно място вместо на 8 различни места. - person FransRasmussen; 17.03.2015
comment
Мисля, че последното ми предложение за код прави точно това. Въвеждането на олеобект на Word в Excel е ненужен сложен метод. - person snb; 17.03.2015
comment
Чудесен! Ще го изпробвам следващия път, когато съм на работа, и ще видя докъде ще ме отведе.. Непременно ще направя актуализация тук.. - person FransRasmussen; 18.03.2015