web-dev-qa-db-ja.com

Excelシートで占有セルの範囲を取得する方法

C#を使用してExcelファイルを自動化します。ワークブックとそれに含まれるシートを取得できました。たとえば、sheet1に2つの列と5つの行がある場合。占有セルの範囲をA1:B5として取得したかったのです。次のコードを試しましたが、正しい結果が得られませんでした。列#と行#ははるかに大きく、セルも空でした。

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

その範囲を取得するために使用できる別の方法はありますか?

34
Sarah

あなたと同じような問題がありました。実際に働いたのはこれです:

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;

何が起こるかというと、Excelからデータを削除すると、それらのセルにデータが存在するものの、それらは空白であると考え続けます。フォーマットをクリアすると、空白のセルが削除されるため、実際のカウントが返されます。

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

「範囲」が占有セル範囲になります

19
Zurb

Range.SpecialCellsメソッドを参照してください。たとえば、定数値または数式を含むセルを取得するには、次を使用します。

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

すべてのシナリオ(保護されたシートを除く)で機能させるための唯一の方法(ファーハムの回答に基づく):

以下をサポートします。

  • 非表示の行/列のスキャン

  • データ/数式のないフォーマットされたセルを無視します

コード:

// 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;
4
Gerhard Powell

これは数式の検索に合わせて調整されていますが、開始セルのテスト方法を変更することにより、一般的なコンテンツに拡張できるはずです。これ以外の単一セル範囲を処理する必要があります。

    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

あなたは「削除」を押してボックス内のデータを削除しないでください、私は問題だと思います、Excelはまだボックスを検出するためです.

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

範囲をどこから見つけるかがわかっている場合は、currentRegionプロパティを試してください。これにより、使用範囲の境界がわかります。

0
Utsav Jha

これらの2行は、私にとっては役に立たなかった。

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

シートでctrl + endを押して、選択されているセルを確認することでテストできます。

最初の2つの後にこの行を追加すると、私が遭遇したすべてのインスタンスで問題が解決したことがわかりました。

Excel.Range xlActiveRange = WorkSheet.UsedRange;
0
Simon

少し古い質問ですが、誰かが解決策を探しているなら、これは私にとってはうまくいきます。

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