wake-up-neo.com

So erhalten Sie den Bereich der belegten Zellen in einer Excel-Tabelle

Ich verwende C #, um eine Excel-Datei zu automatisieren. Ich konnte die Arbeitsmappe und die darin enthaltenen Blätter abrufen. Wenn ich zum Beispiel in Blatt1 zwei Spalten und 5 Zeilen habe. Ich wollte den Bereich für die besetzten Zellen als A1: B5 bekommen. Ich habe den folgenden Code ausprobiert, aber er hat nicht das richtige Ergebnis ergeben. Die Spalten # und Zeile # waren viel größer und die Zellen waren ebenfalls leer. 

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

Gibt es eine andere Möglichkeit, diese Reichweite zu erreichen?

33
Sarah

Ich hatte ein sehr ähnliches Problem wie Sie. Was tatsächlich funktioniert hat, ist folgendes:

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 was passiert ist, dass, wenn Sie Daten aus Excel löschen, immer daran gedacht wird, dass sich in diesen Zellen Daten befinden, obwohl diese leer sind. Wenn ich die Formate gelöscht habe, werden die leeren Zellen entfernt und die tatsächlichen Zählungen zurückgegeben.

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

"Reichweite" ist jetzt der belegte Zellbereich

19
Zurb

Siehe die Range.SpecialCells-Methode. Um beispielsweise Zellen mit konstanten Werten oder Formeln zu erhalten, verwenden Sie:

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

Die einzige Möglichkeit, wie ich es in ALLEN Szenarien (außer geschützten Tabellen) zum Laufen bringen könnte (basierend auf Farhams Antwort)

Es unterstützt:

  • Ausgeblendete Zeilen/Spalten scannen

  • Ignoriert formatierte Zellen ohne Daten/Formel

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

Dies ist auf das Finden von Formeln zugeschnitten, Sie sollten es jedoch in der Lage sein, sie auf allgemeinen Inhalt auszudehnen, indem Sie ändern, wie Sie die Startzellen testen. Sie müssen einzelne Zellbereiche außerhalb dieses Bereichs behandeln.

    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

Sie sollten die Daten in der Box nicht löschen, indem Sie auf "Löschen" klicken. Ich denke, das ist das Problem, da Excel die Box immer noch als "<" erkennt.

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

Sie sollten die Eigenschaft currentRegion ausprobieren, wenn Sie wissen, wo Sie den Bereich finden sollen. Dies gibt Ihnen die Grenzen Ihres verwendeten Bereichs.

0
Utsav Jha

Diese beiden Zeilen alleine funktionierten nicht für mich:

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

Sie können einen Test durchführen, indem Sie Strg + Ende im Arbeitsblatt drücken und sehen, welche Zelle ausgewählt ist. 

Ich habe festgestellt, dass das Hinzufügen dieser Zeile nach den ersten beiden das Problem in allen Fällen behoben hat, die ich angetroffen habe:

Excel.Range xlActiveRange = WorkSheet.UsedRange;
0
Simon

Etwas alte Frage jetzt, aber wenn jemand nach einer Lösung sucht, funktioniert das für mich.

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