2009-04-01 33 views
9

Espero que un experto de VB/VBA pueda ayudarme. Tenga en cuenta lo siguiente: El usuario abre un documento en Word 2003, y dentro de la macro Normal.dot AutoOpen, miramos el documento actual, y si se ha abierto haciendo clic en un enlace en una página web, y cumple con cierta otra aplicación específica criterios, cierran el streaming 'copia' y abrir el documento de origen (que se encuentra en una unidad compartida, podemos suponer que el usuario tiene acceso a):Abrir/activar documentos de Word en una macro de VBA

Documents.Open origDoc 
Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges 
Documents(origDoc).Activate 

With ActiveDocument 
    ''# Do work 
End With 

Mi pensamiento era que tenía que llamar Activate para asegurar que el original documento fue el ActiveDocument, pero recibo un error de 4160 'Nombre de archivo incorrecto' en la llamada .Activate. Si hago un comentario de la llamada al .Activate, parece que ActiveDocument se establece en el documento origDoc, incluso si ya había otros documentos abiertos (no estoy muy seguro de cómo se gestiona la Colección de documentos, y cómo Word determina qué sería lo siguiente ActiveDocument ser si programáticamente cierra el ActiveDocument actual)

Entonces, ¿llamando al .Open en un documento establece explícitamente que el documento sea el ActiveDocument? Además, ¿llamar al .Activate en el documento ya activo causa un error?

Realmente no he podido encontrar mucha documentación sobre esto, así que ¡gracias de antemano por cualquier sugerencia y visión!

+0

Presumiblemente, ha estado manejando la copia del documento como el ActiveDocument en su código. Sería mucho mejor asignar ese objeto de documento a una variable al comienzo de su código y usar su variable a través del resto del código. Como han señalado otros, probablemente cierre la versión incorrecta del documento en la segunda línea de código. También sería conveniente asignar el objeto del documento "original" a una variable cuando lo abra. – robartsd

Respuesta

1

Usted tiene un error aquí:

Document(origDoc).Activate 

Debe ser Documento s.

Sí, puede activar el documento activo. Nada sucede entonces.

Sí, el documento abierto se activa. Si no está seguro, use Documents.Open(origDoc).Activate.

+0

Gracias por detectar el error tipográfico, desafortunadamente solo estaba en mi publicación, no en el código real. Si puede activar el documento abierto, ¿cómo puedo obtener un error 4160 en la llamada .Activate? – echoesofspring

+0

¿Qué contiene exactamente origDoc? – GSerg

1

No debe utilizar el objeto ActiveDocument en primer lugar a menos que sea absolutamente necesario porque es muy poco confiable. El enfoque preferido sería la siguiente:

Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges 

Dim doc as Document 
Set doc = Documents.Open(origDoc)   
With doc 
    'Do work 
End With 
+2

Obviamente me falta algo aquí. ¿Dice que no use 'ActiveDocument', pero continúa y lo usa en su muestra de código? – Sabuncu

-1

Mira que hay una gran variedad de problemas que se pueden encontrar:

  1. si desea volver a abrir el documento después de haberlo cerrado vez .. ..Word/Windows DO NOT 'libera' el nombre del archivo y aparece el mensaje 'file busy', o mensaje sobre 'creando una copia temporal'. para hacer frente a este problema, he tenido que desarrollar un sistema elaborado de crear/guardar y poner en orden múltiples versiones de cualquier otro documento que OPEN/manipular en mis aplicaciones Word a causa de este defecto de diseño en Office Open/Close/Save métodos.

  2. utilizar la propiedad ReadOnlyRecommended establecido en False con el .Open método

  3. refiriéndose al objeto de documento (doc llamado, anteriormente) pueden causar errores graves si no aseguran que todavía existe el objeto doc antes de intentar y manipularlo. Recuerde siempre, que Word es una plataforma de aplicación 'abierta' .... y el usuario puede estar haciendo cosas que no contó en ... en el último milisegundo más o menos. Este consejo es válido para cualquier otro objeto o propiedad que desee manipular en Word.

  4. si manipular la colección de documentos (o cualquier otro) sin asegurando que el documento u otro objeto está todavía allí y válida antes de eliminar o mover dentro de la colección que puede
    get 'desbordamiento pila' errores Particularmente si intenta y cerrar/eliminar objetos en una colección que comienza en .item(1). Usted debe eliminar elementos en una colección de la última, y ​​recuerde que los idicies y punteros de la colección cambian siempre que .add /. Elimine /. Cierre los elementos de ellos.

4

La respuesta simple es sí. Al abrir el documento con su código, lo convierte en el documento activo, que luego se cierra en la línea siguiente y se intenta activar en el siguiente, y esto falla porque el documento ya no está abierto. VBA en general parece funcionar de esta manera.

Es importante tener cuidado con ActiveDocument, porque no siempre es evidente qué acciones, en código o en otro lugar, harán que un documento 'activo' (no tengo ninguna prueba pero incluso un autoguardado podría hacerlo). Si hay alguna duda, es mejor que te refieras a un documento a través de la colección Documentos, aunque esto también puede causar errores si el documento ya no está abierto, y es posible que tengas que recurrir a iterar a través de la colección para asegurarte de que el documento está, de hecho, abierto. Me encuentro con esto mucho con Excel VBA, y Word VBA parece funcionar de manera idéntica en ese sentido.

Además, VBA es escamosa sobre la liberación de objetos de aplicación. Si no tiene cuidado, terminará con múltiples procesos WINWORD, visibles en el administrador de tareas, independientemente de si los cierra o los deja en su código. El código que he encontrado para solucionar esto equivale a simular el proceso de seleccionar END PROCESS en el administrador de tareas. Funciona, pero debería haber una mejor solución.

+0

VBA? ¿Escamoso? ¡Por qué nunca escuché tales acusaciones! – franklin

Cuestiones relacionadas