tipos porque microsoft los importante guardar formatos formato extensión documentos definicion como archivo excel vba ms-word word-vba

porque - Modificar el libro de Excel incorporado en un documento de Word a través de VBA



porque es importante el formato de los documentos en excel (3)

Tengo una solución para mi propio problema. Cualquier otro comentario será apreciado -

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

Tengo un documento de Word con dos archivos incrustados de Excel (agregado usando Insertar -> Objeto -> Crear desde archivo) que deseo modificar usando Word VBA. Llegué al punto en el que puedo abrir los archivos incrustados para su edición (ver el código a continuación), pero no puedo manejar el libro de Excel con el cual puedo hacer las modificaciones y guardar el archivo incrustado. ¿Alguien tiene una solución para esto? Gracias por adelantado.

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 ''This opens the embedded Excel workbook using Excel wrdActDoc.InlineShapes(lShapeCnt).OLEFormat.Edit End If End If Next lShapeCnt End Sub


Sí, no hagas lo que sugieres en tu comentario. Probablemente termines con varias instancias de Excel (ver Administrador de tareas y ver cuántas hay después de ejecutar el código).

En primer lugar, agregue una referencia a la biblioteca de objetos de Excel (Proyecto-> Referencias y elija la Biblioteca de objetos de Microsoft Excel). Ahora puede declarar sus objetos como tipos de Excel de buena fe y usar el enlace anticipado en lugar de declararlos como "Objeto" y usar el enlace tardío. Esto no es estrictamente necesario, pero aparte de cualquier otra cosa, significa que obtienes Intellisense cuando editas tu código.

Estás haciendo lo correcto hasta que lo hagas .OleFormat.Edit. (Usaría personalmente .OleFormat.Activate pero como nunca he intentado usar .Edit no podría decir que hace la diferencia).

Una vez hecho .Activate (o, presumiblemente, .Edit), puede acceder al miembro OleFormat.Object. Dado que el Objeto incrustado es un gráfico de Excel, el "Objeto" será el Libro de Excel, por lo que puede hacer esto:

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

Tenga en cuenta que NO necesita cerrar Excel, y de hecho no puede: Word "posee" la instancia utilizada para una edición en el lugar y decidirá cuándo cerrarla. Esto es realmente un problema, ya que no hay una forma obvia de forzar al objeto incrustado para que se desactive, por lo que el gráfico se mantendrá abierto después de ejecutar el código anterior.

Sin embargo, hay una manera de hackear y hacer que la tabla se cierre. Si agrega tell Word para activarlo como algo más, primero lo desactivará. Entonces, si le dices que lo active como algo no sensorial, lograrás el resultado correcto porque lo desactivará y luego no lo reactivará. Por lo tanto, agregue la siguiente línea:

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

Tenga en cuenta que esto generará un error, por lo que deberá deshabilitar temporalmente el manejo de errores utilizando On Error Resume Next. Por esa razón, normalmente creo un método Deactivate para evitar perturbar el manejo de errores en mi método principal. Como en:

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

Espero que esto ayude. Gary


Tenga otra manera de hacer que la tabla se cierre: simplemente use la función de búsqueda para encontrar algo en el documento que no está allí.

P.EJ

With Selection.Find .ClearFormatting .Text = "wiffleball" .Execute Forward:=True End With

Esto lo sacará del archivo incrustado, cerrará la instancia y volverá al documento principal, puede simplemente codificar desde allí.

Espero que esto ayude, este problema me estaba volviendo loco.