Question

J'ai essayé de récupérer les emplacements de tous les sauts de page sur une feuille de calcul Excel 2003 donnée via COM. Voici un exemple de ce que j'essaie de faire:

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();

J'espère que cela imprimera les numéros de ligne de chaque saut de page horizontal dans pSheet . Le problème que je rencontre est que, bien que count indique correctement le nombre de sauts de page dans la feuille de calcul, je ne peux apparemment que récupérer le premier. Lors de la deuxième boucle, l'appel de pHPageBreaks- > GetItem (i) lève une exception, avec le numéro d'erreur 0x8002000b, "index non valide".

La tentative d'utilisation de pHPageBreaks- > Get_NewEnum () pour obliger un énumérateur à parcourir la collection échoue également avec la même erreur, immédiatement à l'appel de Get_NewEnum () .

J'ai cherché une solution et la chose la plus proche que j'ai trouvée jusqu'à présent est http://support.microsoft.com/kb/210663/en-us . J'ai essayé d'activer diverses cellules au-delà des sauts de page, y compris les cellules situées juste au-delà de la plage à imprimer, ainsi que la cellule inférieure droite (IV65536), mais cela n'a pas aidé.

Si quelqu'un pouvait me dire comment faire en sorte qu'Excel retourne l'emplacement de tous les sauts de page d'une feuille, ce serait génial!

Merci.

@Joel: Oui, j'ai essayé d'afficher l'interface utilisateur, puis de définir ScreenUpdating sur true - les mêmes résultats ont été obtenus. En outre, j'ai depuis essayé des combinaisons de définition de pSheet- > PrintArea sur la feuille de calcul complète et / ou en appelant pSheet- > ResetAllPageBreaks () avant mon appel pour obtenir le < code> HPageBreaks , qui n'a pas non plus aidé.

@Joel: J'ai utilisé pSheet- > UsedRange pour déterminer la ligne à parcourir, et Excel fait défiler toutes les coupures horizontales, mais le problème persiste quand je J'essaie d'accéder au second. Malheureusement, le passage à Excel 2007 n’a pas aidé non plus.

Était-ce utile?

La solution

En expérimentant avec Excel 2007 à partir de Visual Basic, j'ai découvert que le saut de page n'était connu que s'il avait été affiché à l'écran au moins une fois.

La meilleure solution que j'ai trouvée consistait à passer d'une page à une autre, du haut de la feuille à la dernière ligne contenant des données. Ensuite, vous pouvez énumérer tous les sauts de page.

Voici le code VBA ... faites-moi savoir si vous rencontrez un problème pour le convertir en 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

Ce code contient une hypothèse simplificatrice:

  • J'ai utilisé la méthode .End (xlDown) pour déterminer jusqu'où vont les données ... cela suppose que vous ayez des données continues de A1 au bas de la feuille. Si vous ne le faites pas, vous devez utiliser une autre méthode pour déterminer jusqu'où il faut continuer à faire défiler.

Autres conseils

Avez-vous défini ScreenUpdating sur True, comme indiqué dans l'article de la Base de connaissances?

Vous pouvez vouloir le basculer sur True pour forcer le repeint à l’écran. Il semble que le calcul des sauts de page soit un effet secondaire du rendu de la page, plutôt que quelque chose qu'Excel fait à la demande. Vous devez donc déclencher un rendu de la page à l'écran.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top