Pergunta

Tenho tentado recuperar os locais de todas as quebras de página em uma determinada planilha do Excel 2003 por meio de COM.Aqui está um exemplo do tipo de coisa que estou tentando fazer:

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 isso imprima os números das linhas de cada uma das quebras de página horizontais em pSheet.O problema que estou tendo é que embora count indica corretamente o número de quebras de página na planilha, só consigo recuperar a primeira.Na segunda execução do loop, chamando pHPageBreaks->GetItem(i) lança uma exceção, com número de erro 0x8002000b, "índice inválido".

Tentando usar pHPageBreaks->Get_NewEnum() fazer com que um enumerador itere sobre a coleção também falha com o mesmo erro, imediatamente na chamada para Get_NewEnum().

Procurei uma solução e a coisa mais próxima que encontrei até agora é http://support.microsoft.com/kb/210663/en-us.Tentei ativar várias células além das quebras de página, incluindo as células logo além do intervalo a ser impresso, bem como a célula inferior direita (IV65536), mas não adiantou.

Se alguém puder me dizer como fazer com que o Excel retorne a localização de todas as quebras de página em uma planilha, seria incrível!

Obrigado.

@Joel:Sim, tentei exibir a interface do usuário e depois configurar ScreenUpdating para true - produziu os mesmos resultados.Além disso, desde então tentei combinações de configurações pSheet->PrintArea para toda a planilha e/ou chamando pSheet->ResetAllPageBreaks() antes da minha ligação para pegar o HPageBreaks coleção, o que também não ajudou.

@Joel:eu usei pSheet->UsedRange para determinar a linha a ser rolada, e o Excel passa por todas as quebras horizontais, mas ainda estou tendo o mesmo problema quando tento acessar a segunda.Infelizmente, mudar para o Excel 2007 também não ajudou.

Foi útil?

Solução

Experimentando o Excel 2007 do Visual Basic, descobri que a quebra de página não é conhecida, a menos que tenha sido exibida na tela pelo menos uma vez.

A melhor solução que encontrei foi descer a página, do topo da planilha até a última linha que contém os dados.Então você pode enumerar todas as quebras de página.

Aqui está o código VBA ...deixe-me saber se você tiver algum problema ao converter isso para 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 fez uma suposição simplificadora:

  • Usei o método .End(xlDown) para descobrir até onde vão os dados...isso pressupõe que você tenha dados contínuos de A1 até a parte inferior da planilha.Caso contrário, você precisará usar algum outro método para descobrir até que ponto continuar rolando.

Outras dicas

Você configurou ScreenUpdating como True, conforme mencionado no artigo da base de conhecimento?

Você pode querer alterná-lo para True para forçar uma repintura da tela.Parece que o cálculo das quebras de página é um efeito colateral da renderização da página, em vez de algo que o Excel faz sob demanda, então você precisa acionar uma renderização de página na tela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top