Question

Je développe un complément Excel 2007 à l'aide de Visual Studio Tools pour Office (2008).J'ai une feuille avec plusieurs ListObjects, qui sont liés aux tables de données au démarrage.Lorsqu'ils sont liés, ils s'autodimensionnent correctement.

Le problème vient quand ils sont rebondis.J'ai un bouton personnalisé sur la barre de ruban qui renvoie à la base de données et récupère différentes informations en fonction de certains critères saisis par l'utilisateur.Ces nouvelles données reviennent et sont liées aux ListObjects - cependant, cette fois, elles ne sont pas redimensionnées et j'obtiens une exception :

ListObject ne peut pas être lié car il ne peut pas être redimensionné pour s'adapter aux données.Le listObject n'a pas ajouté de nouvelles lignes.Cela peut être causé en raison de l'incapacité de déplacer des objets ci-dessous de l'objet de liste.

Exception interne :"La méthode d'insertion de la classe Range a échoué"
Raison:Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject

Je n'ai rien trouvé de très significatif sur cette erreur sur Google ou MSDN.J'essaie de comprendre cela depuis un moment, mais en vain.

Structure du code de base :

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

Notez que cette exception se produit même lorsque le ListObject diminue, et pas seulement lorsqu'il grandit.

Était-ce utile?

La solution

Si quelqu'un d'autre rencontre ce problème, j'ai trouvé la cause de cette exception.Les ListObjects seront automatiquement redimensionnés lors de la reliure, à condition qu'ils n'affectent aucun autre objet sur la feuille.Gardez à l’esprit que les ListObjects ne peuvent affecter que les plages autour desquelles ils s’enroulent.

Dans mon cas, l'objet de liste qui se trouvait au-dessus de l'autre avait moins de colonnes que celui en dessous.Disons que le ListObject supérieur avait 2 colonnes et que le ListObject inférieur avait 3 colonnes.Lorsque le ListObject supérieur modifiait son nombre de lignes, il n'avait pas la possibilité d'apporter des modifications à la troisième colonne car elle ne se trouvait pas dans sa plage sous-jacente.Cela signifie qu'il n'a pu déplacer aucune cellule dans la troisième colonne et que le deuxième ListObject n'a donc pas pu être déplacé correctement, ce qui a entraîné mon exception ci-dessus.

Changer les positions des ListObjects pour placer le plus large au-dessus du plus petit fonctionne bien.En suivant la logique ci-dessus, cela signifie désormais que le ListObject le plus large peut décaler toutes les colonnes du deuxième ListObject, et comme il n'y a rien en dessous du plus petit, il peut également décaler toutes les cellules nécessaires.La raison pour laquelle je n'ai eu aucun problème avec la liaison initiale est que les deux ListObjects constituaient une seule cellule.

Comme ce n'est pas optimal dans mon cas, j'utiliserai probablement des colonnes vides ou j'essaierai de jouer avec des colonnes invisibles si cela est possible, mais au moins la cause est maintenant claire.

Autres conseils

J'ai un problème similaire avec l'actualisation de plusieurs objets de liste.Nous définissons chaque listObject.DataSource = null, puis rerelions en commençant par l'objet de liste inférieur et en remontant au lieu de haut en bas.

Juste une idée de quelque chose à essayer pour voir si cela vous donne plus d'informations :Essayez de redimensionner l'objet de liste avant la ligne d'exception et voyez si cela génère également une exception.Sinon, essayez de redimensionner l'objet plage à la nouvelle taille du DataTable.

Vous dites que cela se produit lorsque le ListObject rétrécit et grandit.Cela se produit-il également si le ListObject reste de la même taille ?

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