web-dev-qa-db-fra.com

Comment obtenir la plage de cellules occupées dans une feuille Excel

J'utilise C # pour automatiser un fichier Excel. J'ai pu obtenir le classeur et les feuilles qu'il contient ..__ Si, par exemple, j'ai dans sheet1 deux colonnes et 5 lignes. Je voulais obtenir la plage des cellules occupées sous le format A1: B5. J'ai essayé le code suivant, mais il n'a pas donné le résultat correct ... Les colonnes # et la ligne # étaient beaucoup plus grandes et les cellules étaient également vides. 

     Excel.Range xlRange = excelWorksheet.UsedRange;
     int col = xlRange.Columns.Count;
     int row = xlRange.Rows.Count;

Y at-il un autre moyen que je peux utiliser pour obtenir cette plage?

33
Sarah

J'ai eu un problème très similaire à celui que vous aviez. Voici ce qui a réellement fonctionné:

iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;

//These two lines do the magic.
xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();

iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;

IMHO ce qui se passe est que lorsque vous supprimez des données d'Excel, il continue à penser qu'il y a des données dans ces cellules, bien qu'elles soient vides. Lorsque j'ai effacé les formats, les cellules vides sont supprimées et le résultat est renvoyé.

54
Farhan
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);

"gamme" sera maintenant la plage de cellules occupée

19
Zurb

Voir la méthode Range.SpecialCells. Par exemple, pour obtenir des cellules avec des valeurs constantes ou des formules, utilisez:

_xlWorksheet.UsedRange.SpecialCells(
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants |
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas)
4
Joe Erickson

La seule façon de le faire fonctionner dans TOUS les scénarios (sauf les feuilles protégées) (basé sur la réponse de Farham):

Elle supporte:

  • Analyse des lignes/colonnes masquées

  • Ignore les cellules formatées sans données/formule

Code:

// Unhide All Cells and clear formats
sheet.Columns.ClearFormats();
sheet.Rows.ClearFormats();

// Detect Last used Row - Ignore cells that contains formulas that result in blank values
int lastRowIgnoreFormulas = sheet.Cells.Find(
                "*",
                System.Reflection.Missing.Value,
                InteropExcel.XlFindLookIn.xlValues,
                InteropExcel.XlLookAt.xlWhole,
                InteropExcel.XlSearchOrder.xlByRows,
                InteropExcel.XlSearchDirection.xlPrevious,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value).Row;
// Detect Last Used Column  - Ignore cells that contains formulas that result in blank values
int lastColIgnoreFormulas = sheet.Cells.Find(
                "*",
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                InteropExcel.XlSearchOrder.xlByColumns,
                InteropExcel.XlSearchDirection.xlPrevious,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value).Column;

// Detect Last used Row / Column - Including cells that contains formulas that result in blank values
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count;
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;
3
Gerhard Powell

Cette fonctionnalité est adaptée à la recherche de formules, mais vous devriez pouvoir l'étendre au contenu général en modifiant la façon dont vous testez les cellules de départ. Vous devrez gérer des plages de cellules uniques en dehors de cela.

    public static Range GetUsedPartOfRange(this Range range)
    {
        Excel.Range beginCell = range.Cells[1, 1];
        Excel.Range endCell = range.Cells[range.Rows.Count, range.Columns.Count];

        if (!beginCell.HasFormula)
        {
            var beginCellRow = range.Find(
                "*",
                beginCell,
                XlFindLookIn.xlFormulas,
                XlLookAt.xlPart,
                XlSearchOrder.xlByRows,
                XlSearchDirection.xlNext,
                false);

            var beginCellCol = range.Find(
                "*",
                beginCell,
                XlFindLookIn.xlFormulas,
                XlLookAt.xlPart,
                XlSearchOrder.xlByColumns,
                XlSearchDirection.xlNext,
                false);

            if (null == beginCellRow || null == beginCellCol)
                return null;

            beginCell = range.Worksheet.Cells[beginCellRow.Row, beginCellCol.Column];
        }

        if (!endCell.HasFormula)
        {
            var endCellRow = range.Find(
            "*",
            endCell,
            XlFindLookIn.xlFormulas,
            XlLookAt.xlPart,
            XlSearchOrder.xlByRows,         
            XlSearchDirection.xlPrevious,
            false);

            var endCellCol = range.Find(
                "*",
                endCell,
                XlFindLookIn.xlFormulas,
                XlLookAt.xlPart,
                XlSearchOrder.xlByColumns,
                XlSearchDirection.xlPrevious,
                false);

            if (null == endCellRow || null == endCellCol)
                return null;

            endCell = range.Worksheet.Cells[endCellRow.Row, endCellCol.Column];
        }

        if (null == endCell || null == beginCell)
            return null;

        Excel.Range finalRng = range.Worksheet.Range[beginCell, endCell];

        return finalRng;
    }
}
0
MikeJ

Vous ne devez pas supprimer les données contenues dans la boîte en appuyant sur "supprimer". Je pense que c’est le problème, car Excel détectera toujours la boîte comme "" <- a toujours une valeur, vous devez supprimer en cliquant avec le bouton droit de la souris et cliquez sur Supprimer.

0
codeislife
dim lastRow as long   'in VBA it's a long 
lastrow = wks.range("A65000").end(xlup).row
0
Patrick Honorez

Vous devriez essayer la propriété currentRegion si vous savez d'où vous allez trouver la plage. Cela vous donnera les limites de votre plage utilisée.

0
Utsav Jha

Ces deux lignes seules ne fonctionnaient pas pour moi:

xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();

Vous pouvez tester en appuyant sur ctrl + fin dans la feuille et en sélectionnant la cellule sélectionnée. 

J'ai trouvé que l'ajout de cette ligne après les deux premières a résolu le problème dans tous les cas que j'ai rencontrés:

Excel.Range xlActiveRange = WorkSheet.UsedRange;
0
Simon

Petite question maintenant, mais si quelqu'un cherche une solution, cela fonctionne pour moi.

using Excel = Microsoft.Office.Interop.Excel;

Excel.ApplicationClass Excel = new Excel.ApplicationClass();
Excel.Application app = Excel.Application;
Excel.Range all = app.get_Range("A1:H10", Type.Missing);
0
sidon