Come per scorrere tutte le interruzioni di pagina in un foglio di lavoro Excel 2003 via COM

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

Domanda

Ho cercato di recuperare le posizioni di tutte le interruzioni di pagina in un determinato foglio di lavoro Excel 2003 su COM.Ecco un esempio di cosa sto cercando di fare:

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

Mi aspetto che questo per stampare i numeri di riga di ciascuna delle interruzioni di pagina orizzontale in pSheet.Il problema che sto avendo è che, sebbene count correttamente indica il numero di interruzioni di pagina del foglio di lavoro, posso solo mai, sembrano recuperare il primo.Nella seconda manche, attraverso il ciclo, chiamando pHPageBreaks->GetItem(i) genera un'eccezione, con il numero di errore 0x8002000b, "indice non valido".

Il tentativo di utilizzare pHPageBreaks->Get_NewEnum() per ottenere un enumeratore per scorrere la collezione, inoltre, non con lo stesso errore, subito dopo la chiamata a Get_NewEnum().

Ho guardato in giro per una soluzione, e la cosa più vicina che ho trovato finora è http://support.microsoft.com/kb/210663/en-us.Ho cercato di attivare diverse celle oltre le interruzioni di pagina, comprese le cellule appena al di là del intervallo di stampa, così come la cella inferiore destra (IV65536), ma niente da fare.

Se qualcuno può dirmi come ottenere Excel per restituire la località di tutte le interruzioni di pagina in un foglio, sarebbe fantastico!

Grazie.

@Gioele:Sì, ho provato a visualizzare l'interfaccia utente, e quindi l'impostazione di ScreenUpdating per vero - non ha prodotto gli stessi risultati.Inoltre, ho provato combinazioni di impostazione pSheet->PrintArea per l'intero foglio di lavoro e/o chiamata pSheet->ResetAllPageBreaks() prima della mia chiamata per ottenere il HPageBreaks la collezione, che non aiutano.

@Gioele:Ho usato pSheet->UsedRange per determinare la riga di scorrimento passato, e non Excel scorrimento passato tutti orizzontale break, ma ancora ho lo stesso problema quando provo ad accedere al secondo.Purtroppo, il passaggio a Excel 2007 non aiutano.

È stato utile?

Soluzione

Sperimentare con Excel 2007 da Visual Basic, ho scoperto che l'interruzione di pagina non è noto se questa non è stata visualizzata sullo schermo almeno una volta.

La soluzione migliore che ho trovato è stato a pagina verso il basso, dalla parte superiore del foglio e l'ultima riga contenente i dati.Quindi è possibile enumerare tutte le interruzioni di pagina.

Ecco il codice VBA...fatemi sapere se avete qualche problema di conversione di questo 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

Questo codice fatto una ipotesi semplificative:

  • Ho usato la .End(xlDown) il metodo per capire fino a che punto i dati va...questo presuppone che si dispone di dati continuo, dal livello A1 fino al fondo del foglio.Se non, è necessario utilizzare un altro metodo per capire come far mantenere lo scorrimento.

Altri suggerimenti

Hai impostato ScreenUpdating al Vero, come accennato nell'articolo KB?

È possibile che si desidera effettivamente passare a True per forzare un aggiornamento dello schermo.Sembra che il calcolo delle interruzioni di pagina è un effetto collaterale di rendering della pagina, piuttosto che qualcosa non Excel su richiesta, quindi devi attivare un rendering della pagina sullo schermo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top