Cómo iterar sobre todos los saltos de página en una hoja de cálculo de Excel 2003 a través de COM

StackOverflow https://stackoverflow.com/questions/78053

Pregunta

He estado intentando recuperar las ubicaciones de todos los saltos de página en una hoja de cálculo de Excel 2003 determinada a través de COM.Aquí hay un ejemplo del tipo de cosas que estoy tratando de hacer:

Excel::HPageBreaksPtr pHPageBreaks = pSheet->GetHPageBreaks();
long count = pHPageBreaks->Count;
for (long i=0; i < count; ++i)
{
  Excel::HPageBreakPtr pHPageBreak = pHPageBreaks->GetItem(i+1); 
  Excel::RangePtr pLocation = pHPageBreak->GetLocation();

  printf("Page break at row %d\n", pLocation->Row);

  pLocation.Release();
  pHPageBreak.Release();
}
pHPageBreaks.Release();

Espero que esto imprima los números de fila de cada uno de los saltos de página horizontales en pSheet.El problema que tengo es que aunque count indica correctamente el número de saltos de página en la hoja de trabajo, parece que solo puedo recuperar el primero.En la segunda ejecución del bucle, llamando pHPageBreaks->GetItem(i) arroja una excepción, con el número de error 0x8002000b, "índice no válido".

Intentando usar pHPageBreaks->Get_NewEnum() obtener un enumerador para iterar sobre la colección también falla con el mismo error, inmediatamente en la llamada a Get_NewEnum().

He buscado una solución y lo más parecido que he encontrado hasta ahora es http://support.microsoft.com/kb/210663/en-us.Intenté activar varias celdas más allá de los saltos de página, incluidas las celdas que se encuentran más allá del rango a imprimir, así como la celda inferior derecha (IV65536), pero no ayudó.

Si alguien puede decirme cómo hacer que Excel devuelva las ubicaciones de todos los saltos de página en una hoja, ¡sería fantástico!

Gracias.

@Joel:Sí, he intentado mostrar la interfaz de usuario y luego configurar ScreenUpdating a verdadero: produjo los mismos resultados.Además, desde entonces he probado combinaciones de configuración. pSheet->PrintArea a toda la hoja de trabajo y/o llamando pSheet->ResetAllPageBreaks() antes de mi llamada para conseguir el HPageBreaks colección, que tampoco ayudó.

@Joel:he usado pSheet->UsedRange para determinar la fila por la que pasar, y Excel pasa por todos los saltos horizontales, pero sigo teniendo el mismo problema cuando intento acceder a la segunda.Desafortunadamente, cambiar a Excel 2007 tampoco ayudó.

¿Fue útil?

Solución

Al experimentar con Excel 2007 desde Visual Basic, descubrí que el salto de página no se conoce a menos que se haya mostrado en la pantalla al menos una vez.

La mejor solución que pude encontrar fue bajar la página, desde la parte superior de la hoja hasta la última fila que contiene datos.Luego puedes enumerar todos los saltos de página.

Aquí está el código VBA...déjame saber si tienes algún problema al convertir esto a COM:

Range("A1").Select
numRows = Range("A1").End(xlDown).Row

While ActiveWindow.ScrollRow < numRows
    ActiveWindow.LargeScroll Down:=1
Wend

For Each x In ActiveSheet.HPageBreaks
    Debug.Print x.Location.Row
Next

Este código hizo una suposición simplificadora:

  • Utilicé el método .End(xlDown) para calcular hasta dónde llegan los datos...esto supone que tiene datos continuos desde A1 hasta el final de la hoja.Si no lo hace, deberá utilizar algún otro método para determinar hasta dónde debe seguir desplazándose.

Otros consejos

¿Configuraste ScreenUpdating en True, como se menciona en el artículo de KB?

Es posible que desees cambiarlo a Verdadero para forzar un repintado de la pantalla.Parece que el cálculo de los saltos de página es un efecto secundario de la representación de la página, en lugar de algo que Excel hace a pedido, por lo que debe activar la representación de la página en la pantalla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top