Pergunta

Estou desenvolvendo um suplemento do Excel 2007 usando o Visual Studio Tools for Office (2008).Eu tenho uma planilha com vários ListObjects, que estão sendo vinculados a tabelas de dados na inicialização.Quando eles são vinculados, eles são dimensionados automaticamente corretamente.

O problema surge quando eles são religados.Eu tenho um botão personalizado na barra de fita que volta ao banco de dados e recupera informações diferentes com base em alguns critérios inseridos pelo usuário.Esses novos dados voltam e são vinculados novamente aos ListObjects - no entanto, desta vez eles não são redimensionados e recebo uma exceção:

ListObject não pode ser vinculado porque não pode ser redimensionado para ajustar os dados.O ListObject falhou ao adicionar novas linhas.Isso pode ser causado devido à incapacidade de mover os objetos abaixo do objeto da lista.

Exceção interna:"Falha ao inserir método da classe Range"
Razão:Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject

Não consegui encontrar nada muito significativo sobre esse erro no Google ou no MSDN.Eu tenho tentado descobrir isso por um tempo, mas sem sucesso.

Estrutura básica do código:

//at startup
DataTable tbl = //get from database
listObj1.SetDataBinding(tbl);
DataTable tbl2 = //get from database
listObj2.SetDataBinding(tbl2);  

//in buttonClick event handler
DataTable tbl = //get different info from database
//have tried with and without unbinding old source
listObj1.SetDataBinding(tbl);              <-- exception here
DataTable tbl2 = //get different info from database
listObj2.SetDataBinding(tbl2);

Observe que essa exceção ocorre mesmo quando ListObject está diminuindo e não apenas quando aumenta.

Foi útil?

Solução

Se alguém estiver tendo esse problema, encontrei a causa dessa exceção.ListObjects serão redimensionados automaticamente na encadernação, desde que não afetem nenhum outro objeto na planilha.Tenha em mente que ListObjects só podem afetar os intervalos que eles envolvem.

No meu caso, o objeto de lista que estava acima do outro tinha menos colunas que o objeto abaixo dele.Digamos que o ListObject superior tenha 2 colunas e o ListObject inferior tenha 3 colunas.Quando o ListObject superior alterou seu número de linhas, ele não teve a capacidade de fazer alterações na terceira coluna, pois não estava em seu intervalo subjacente.Isso significa que não foi possível deslocar nenhuma célula na terceira coluna e, portanto, o segundo ListObject não pôde ser movido corretamente, resultando na exceção acima.

Alterar as posições dos ListObjects para colocar o mais largo acima do menor funciona bem.Seguindo a lógica acima, isso agora significa que o ListObject mais amplo pode deslocar todas as colunas do segundo ListObject e, como não há nada abaixo do menor, ele também pode deslocar quaisquer células necessárias.A razão pela qual não tive problemas na ligação inicial é que ambos os ListObjects eram uma única célula.

Como isso não é o ideal no meu caso, provavelmente usarei colunas vazias ou tentarei brincar com colunas invisíveis, se possível, mas pelo menos a causa agora está clara.

Outras dicas

Eu tenho um problema semelhante ao atualizar vários objetos de lista.Estamos definindo cada listObject.DataSource = null e, em seguida, religando começando no listobject inferior e subindo em vez de de cima para baixo.

Apenas uma ideia de algo para tentar ver se lhe dá mais informações:Tente redimensionar o objeto da lista antes da linha de exceção e veja se isso também gera uma exceção.Caso contrário, tente redimensionar o objeto de intervalo para o novo tamanho do DataTable.

Você diz que isso acontece quando o ListObject diminui e aumenta.Isso também acontece se o ListObject permanecer do mesmo tamanho?

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