Hvordan iterere over alle sideskift i en Excel 2003-regneark via COM

stemmer
1

Jeg har prøvd å hente plasseringen av alle sideskift på et gitt Excel 2003-regneark i løpet COM. Her er et eksempel på den type ting jeg prøver å gjøre:

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

Jeg forventer at dette vil skrive ut radnumrene til hver av de horisontale sideskift i pSheet. Problemet jeg har er at selv om countriktig angir antall sideskift i regnearket, kan jeg bare noensinne synes å hente den første. På den andre løp gjennom løkken, kall pHPageBreaks->GetItem(i)kaster et unntak, med feilnummer 0x8002000b, ugyldig indeks.

Forsøk på å bruke pHPageBreaks->Get_NewEnum()for å få en enumeratoren å iterere over samlingen svikter også med samme feil, umiddelbart på kallet til Get_NewEnum().

Jeg har kikket rundt etter en løsning, og det nærmeste jeg har funnet så langt er http://support.microsoft.com/kb/210663/en-us . Jeg har prøvd å aktivere forskjellige celler utover sideskift, inkludert cellene like utenfor området som skal skrives ut, i tillegg til det nederste høyre celle (IV65536), men det hjalp ikke.

Hvis noen kan fortelle meg hvordan jeg skal få Excel til å returnere plasseringen av alle sideskift i et ark, som ville være kjempeflott!

Takk skal du ha.

@Joel: Ja, jeg har prøvd å vise brukergrensesnittet, og deretter sette ScreenUpdatingtil sann - det produserte de samme resultatene. Også, jeg har siden prøvd kombinasjoner av innstillingen pSheet->PrintAreatil hele regnearket og / eller ringer pSheet->ResetAllPageBreaks()før mitt kall å få HPageBreakssamlingen, som hjalp heller ikke.

@Joel: Jeg har brukt pSheet->UsedRangeå bestemme rad for å bla forbi, og Excel rullerer forbi alle de horisontale pauser, men jeg har fortsatt det samme problemet når jeg prøver å få tilgang til andre. Dessverre, bytte til Excel 2007 hjalp ikke heller.

Publisert på 16/09/2008 klokken 20:41
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Har du satt ScreenUpdating til True, som nevnt i KB-artikkelen?

Det kan være lurt å faktisk slå den til True for å tvinge en skjerm repaint. Det høres ut som beregning av sideskift er en bivirkning av å faktisk gjengi siden, snarere enn noe Excel gjør på bestilling, så du har til å utløse en sidegjengivelse på skjermen.

Svarte 16/09/2008 kl. 22:04
kilden bruker

stemmer
2

Eksperimentering med Excel 2007 fra Visual Basic, oppdaget jeg at sideskift ikke er kjent med mindre det har blitt vist på skjermen minst en gang.

Den beste løsningen jeg fant var å side ned, fra toppen av arket til den siste raden som inneholder data. Deretter kan du nummerere alle sideskift.

Her er VBA-kode ... Gi meg beskjed hvis du har noen problemer med å konvertere dette til 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

Denne koden gjort en forenklende antagelse:

  • Jeg brukte END (xlDown) metode for å finne ut hvor langt data går ... dette forutsetter at du har kontinuerlige data fra A1 ned til bunnen av arket. Hvis du ikke gjør det, må du bruke en annen metode for å finne ut hvor langt for å holde rulling.
Svarte 16/09/2008 kl. 23:14
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more