** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Word
  Mensajes nuevos Mensajes nuevos RSS - Código de selección de tabla no funciona
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCódigo de selección de tabla no funciona

 Responder Responder
Autor
Mensaje
Medardo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2005
Localización: Cuba
Estado: Sin conexión
Puntos: 1987
Enlace directo a este mensaje Tema: Código de selección de tabla no funciona
    Enviado: 17/Abril/2015 a las 19:21

Hola

Estoy haciendo algunas acciones a un documento de Word desde Visual Basic.

 

Tengo lo siguiente:

 

Dim CanTab As Integer

Dim iTab As Integer

 

CanTab = AppInfWord.ActiveDocument.Tables.Count

For iTab = 1 To CanTab

      With AppInfWord.Selection

              'más código

             .Tables(iTab).Select     'aquí sale del procedimiento por segunda vez

             'más código

      Next lngL

Next iTab

 

Cuando por segunda ocasión, dentro del bucle, llega a esta fila:

.Tables(iTab).Select    

sale del procedimiento. Es decir, son 5 tablas que tengo que realizarle las mismas acciones, por lo que conformo un bucle desde la primera hasta la última. La primera vez pasa dentro del bucle, todo funciona de maravillas, pero cuando la variable 'iTab' toma el segundo valor (el 2) y llega a esa línea, sale no solo del bucle, sino, del procedimiento.

 

¿Alguien tiene alguna idea del por qué de este proceder?

Gracias

Saludos
Desde La Habana, Cuba
Medardo
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 17/Abril/2015 a las 19:59
Tuve que modificar tu código para probarlo, porque no tengo tus variables ni el resto de tus acciones.

Mi código es:

Sub ProbarMacro()
    Dim CanTab As Integer
    Dim iTab As Integer
     
    CanTab = Application.ActiveDocument.Tables.Count
    For iTab = 1 To CanTab
        Application.ActiveDocument.Tables(iTab).Select     'aquí sale del procedimiento por segunda vez
    Next iTab
    
End Sub


... y me funcionó sin problemas.  ¿Estará el conflicto en los comandos adicionales?  ¿Hay algo que modifique la variable iTab?  ¿Usas algún On-Error que pueda estar ocultando un error que se dispare mientras tu código se ejecuta?


Cordialmente, David
Arriba
Medardo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2005
Localización: Cuba
Estado: Sin conexión
Puntos: 1987
Enlace directo a este mensaje Enviado: 17/Abril/2015 a las 20:37

Hola David. Gracias por contestar.

 

Antes de ver tu mensaje, ya había encontrado la solución y estaba preparando este mensaje.

Te diré que tu solución ya lo había probado, y continuaba con el problema.

De todas formas, expongo el mensaje que ya tenía preparado y, después, si tienes alguna idea con respecto a la explicación, te lo agradecería. Gracias de todas formas.

 

Problema resuelto. Este debe ser el código:

 

Dim myTable As Table
For Each myTable In ActiveDocument.Tables

      With AppInfWord.Selection

              'más código

               myTable.Select

              'más código

      Next lngL

Next myTable

 

De esta forma, puede sustituirse:

AppInfWord.ActiveDocument.Tables(1).Cell(1, 1).Select

Por:

myTable.Cell(1, 1).Select

 

Aunque aún no sé el por qué de lo que sucedía con mi anterior código, recuerdo que hace unos años me encontré con un error que estuve más de un mes tratando de encontrar la solución y no encontraba nada al respecto en la red, hasta un día, leyendo código de páginas en inglés, me percato del detalle, todo consiste en el uso del objeto de aplicación:

Public AppInfWord As Object

Por ejemplo, esto da error si vuelve a pasar por segunda vez sobre este mismo código para establecer margen superior:

AppInfWord.ActiveDocument.PageSetup.TopMargin = CentimetersToPoints(2)   

 

Lo correcto sería:

AppInfWord.ActiveDocument.PageSetup.TopMargin = AppInfWord.CentimetersToPoints(2)   

 

Y en cuanto al código que expuse y soluciona el problema que dio origen a este post, si se fijan, no se utiliza el objeto de aplicación: myTable.Select

 

Bueno, si alguien tiene alguna otra explicación más convincente, se lo agradecería, sino, doy por terminado este post.

 

Saludos
Desde La Habana, Cuba
Medardo
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 17/Abril/2015 a las 20:49
El detalle es, desde mi punto de vista, que tienes definidos dos objetos tipo Application.

Cuando pones por primera vez:

AppInfWord.ActiveDocument.PageSetup.TopMargin = CentimetersToPoints(2) 

la expresión se evalúa de derecha a izquierda.  De modo que CentimetersToPoints(2) lo toma del objeto Application activo.  Al asignarlo a AppInfWord, éste queda activo y crea el conflicto: 

el CentimetersToPoints(2) a quién pertenece a Application o a AppInfWord???

Este problema me ocurre frecuentemente en Excel, pero allí es más fácil de ver (y entender).  La lección que he aprendido es que si defino objetos del mismo tipo, debo utilizar toda la jerarquía padre.hijo para referirme a sus propiedades y métodos...

¿Claro?  Yo mismo no lo siento mucho, pero... así es Microsoft...

Saludos!
Cordialmente, David
Arriba
Medardo Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 03/Marzo/2005
Localización: Cuba
Estado: Sin conexión
Puntos: 1987
Enlace directo a este mensaje Enviado: 17/Abril/2015 a las 21:48

Muchísimas gracias por la explicación David.

Saludos
Desde La Habana, Cuba
Medardo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable