7
votes

Dans VSTO Excel, comment détecter les données dans les cellules?

Un processus permettant de détecter rapidement s'il existe des données dans une feuille de calcul donnée ou non, sans boucler à travers toutes les lignes / colonnes de la feuille de calcul.

Pour mon processus actuel, je suis actuellement en boucle via la feuille entière et il y a un délai de gamme notable dans mon importation.


1 commentaires

Je sais que c'est vieux, mais en plus des réponses, désactivez ces événements, remplissez-les, puis retournez-les sur: CurrentInstance.Enablevents = FAUX / TRUE; courantInstance.screenupdature = faux / vrai;


5 Réponses :


-1
votes

Ceci devrait être assez rapide: xxx


1 commentaires

Sélectionner et copier ne sont jamais rapides;)



16
votes

Pour éviter de boucler et profiter d'une vitesse d'exécution presque instantanée, vous pouvez utiliser la méthode Excel.worksheetfunction.Counta ​​CODE>, qui renvoie le même résultat que la fonction de la feuille de calcul = Counta ().

En supposant que votre référence Excel.Application soit nommée 'ExcelApp' et votre référence Excel.worksheet est nommée «feuille de calcul», vous pouvez utiliser le code comme indiqué sur C # 4.0: P>

// C# 3.0 and below
int dataCount = (int)excelApp.WorksheetFunction.CountA(
    worksheet.Cells, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

if (dataCount == 0)
{
    // All cells on the worksheet are empty.
}
else
{
    // There is at least one cell on the worksheet that has non-empty contents.
}


1 commentaires

Le casting in int ne fonctionne pas, car Counta renvoie un double.



0
votes

J'ai trouvé la solution suivante, qui est également instantanée, mais je ne suis pas sûr à quel point c'est précisément ... il a passé tous mes tests jusqu'à présent.

C'est ici pour quiconque veut savoir: P>

Worksheet sheet = (Worksheet)this.Application.ActiveSheet;
Range usedRange = sheet.UsedRange;
bool isUsed = (usedRange.Count > 1);
if (usedRange.Count == 1)
{
  isUsed = (usedRange.Value2 != null) &&
           (!string.IsNullOrEmpty(usedRange.Value2.ToString()));
}

if(isUsed)
{
  // worksheet cells not empty
}


4 commentaires

Momad, votre approche n'est pas mauvaise, mais c'est (a) plus de travail, et (b) signalera de manière incorrecte certaines feuilles de calcul contenant des données lorsqu'elle ne le fait pas, car l'intimé peut être affecté par des éléments tels que la mise en forme dans les cellules, non juste des valeurs. Si vous utilisez la méthode Application.worksheetfunction.Counta , vous ramasseriez toutes les données et uniquement des données sur une ligne, au lieu de cinq.


Les deux sont bien meilleurs que d'utiliser le presse-papiers à coup sûr. La manière du presse-papiers prendra également en compte les cellules avec "espace blanc", que les autres manières ne le feront pas, mais c'est un cas spécial :)


Mike, je ne savais pas le formatage. Si tel est le cas, je suis donc d'accord pour dire que la fonction de la feuille de calcul est une meilleure approche. Cependant, dans mon scénario spécifique, je ne veux pas vouloir remplacer une cellule, même si le changement n'est qu'un changement de formatage. Merci pour la clarification!


Ne devrait pas isnullorempty être isnullorwhiteespace ? Si vous prenez une cellule vide et appelez string.length (cell.tostring ()) Je pense qu'il retourne 18 même si la cellule réelle est et a toujours été vide



4
votes

Je travaille avec VSTO et Excel depuis un certain temps, à un niveau très intense, j'espère donc que je peux partager des choses que j'ai apprises au fil du temps avec vous.

basé sur les informations que vous avez fournies, Je vous recommanderais de lancer à un tableau d'objet et de travailler avec cette information à la place. Fondamentalement, vous accéderez aux valeurs telles que: P>

object[,] arrayValues = (object[,])ExcelRange.Value2;


4 commentaires

Merci James, je travaille sur un complément VSTo pour Excel et rencontre souvent des problèmes pouvant être rapidement répondu par une personne dans la connaissance, mais qui prend du temps à trouver sur Internet. Je serai sûr de faire plus d'usage de Stackoverflow, car il y a tellement d'experts VSTO ici!


@ coder4life, savez-vous s'il y a un moyen de faire la même "vrac" aller chercher des propriétés comme la couleur de la cellule? J'ai utilisé une méthode comme si vous avez été décrite pour des valeurs pendant des mois maintenant, mais je dois encore trouver un moyen de pouvoir récupérer toutes les couleurs (gamme.Interior.color) sans aller à la ligne, col -by-col. Et c'est douloureusement lent! Merci!


En fait, j'ai ouvert un nouveau fil pour cette question de la couleur-récupération, il est donc plus facile de trouver pour d'autres personnes, plutôt que de rechercher des commentaires. L'URL est http://stackoverflow.com/questions/8451511/vsto-geting -Exce L-Cell-Properties-in -bulk


Cela ne signifie-t-il pas que l'on connaît la gamme pour obtenir? Cela n'implique pas non plus trop d'obtenir ce qu'il faut parfois. J'utilise ce que vous dites pour la lecture et l'écriture, mais ce commentaire bien que valide ne aide pas à la question à la main. Ou je manque quelque chose?



0
votes

Du?

bool isFirstEmpty = IsSheetEmpty(1);


0 commentaires