web-dev-qa-db-ja.com

VSTO / C#の行番号と列番号を使用してExcel範囲を取得するにはどうすればよいですか?

質問はそれを要約すると思います。行と列に2つの整数、または範囲の2つの角に行と列に4つの整数がある場合、その範囲の範囲オブジェクトを取得するにはどうすればよいですか。

29
Dan Crowther

範囲が複数のセルの場合:

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[3,3]);

範囲が1つのセルの場合:

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Cells[1, 1];
79
burnside

Microsoft Excel 14.0 Object Libraryで使用すると、指定された回答がエラーをスローします。オブジェクトにget_rangeの定義が含まれていません。代わりに使用

int countRows = xlWorkSheetData.UsedRange.Rows.Count;
int countColumns = xlWorkSheetData.UsedRange.Columns.Count;
object[,] data = xlWorkSheetData.Range[xlWorkSheetData.Cells[1, 1], xlWorkSheetData.Cells[countRows, countColumns]].Cells.Value2;
17
tic

このような値を取得できます

string str = (string)(range.Cells[row, col] as Excel.Range).Value2 ;

使用範囲全体を選択

Excel.Range range = xlWorkSheet.UsedRange;

ソース:

http://csharp.net-informations.com/Excel/csharp-read-Excel.htm

燃える

2
flaming

「オブジェクトにget_rangeの定義が含まれていない」というエラーが表示される場合。

フォローしてみてください。

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Range[sheet.Cells[1, 1], sheet.Cells[3,3]].Cells;
1
user1141820

同じ問題に直面して、私が見つけた最も速い解決策は、ソートしたいセルの行を実際にスキャンし、非空白要素を持つ最後の行を決定し、そのグループで選択してソートすることでした。

    Dim lastrow As Integer
lastrow = 0
For r = 3 To 120
   If Cells(r, 2) = "" Then
        Dim rng As Range
        Set rng = Range(Cells(3, 2), Cells(r - 1, 2 + 6))
        rng.Select
        rng.Sort Key1:=Range("h3"), order1:=xlDescending, Header:=xlGuess, DataOption1:=xlSortNormal
        r = 205
    End If
Next r
1
A Burns

Cells(Rows.Count, 1).End(xlUp).Rowのようにしたい場合は、それを行うことができます。

次のコードを使用するだけです:

using Excel = Microsoft.Office.Interop.Excel;

string xlBk = @"D:\Test.xlsx";
Excel.Application xlApp;
Excel.Workbook xlWb;
Excel.Worksheet xlWs;

Excel.Range rng;
int iLast;

xlApp = new Excel.Application();
xlWb = xlApp.Workbooks.Open(xlBk, 0, true, 5, "", "", true, 
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1);

iLast = xlWs.Rows.Count;
rng = (Excel.Range)xlWs.Cells[iLast, 1];
iLast = rng.get_End(Excel.XlDirection.xlUp).Row;
0
FaceTowel

私はうまくいくように見える良い短い方法を見つけました...

Dim x, y As Integer
x = 3: y = 5  
ActiveSheet.Cells(y, x).Select
ActiveCell.Value = "Tada"

この例では、3列上および5行下を選択し、セルに「Tada」を配置しています。

0
Askjerry

UsedRangeは「バージン」セルで正常に機能しますが、セルが過去に入力されている場合、UsedRangeは古い値を提供します。

例えば:

「セルA1からA5が入力されたExcelシートを考えてくださいテキスト"。このシナリオでは、 sedRange は次のように実装する必要があります。

Long SheetRows;
SheetRows = ActiveSheet.UsedRange.Rows.Count;

SheetRows変数の監視では、この2行の実行後に値5を表示する必要があります。

Q1:しかし、A5の値が削除されるとどうなりますか?

A1:SheetRowsの値は5

Q2:なぜですか?

A2:MSDNはUsedRangeプロパティを次のように定義しているためです。

すべてを表すMicrosoft.Office.Interop.Excel.Rangeオブジェクトを取得します値を含むセルいつでも


したがって、質問は次のとおりです。この動作の回避策が存在しますか?

私は2つの選択肢があると思います:

  1. セルのコンテンツを削除することは避け、行全体を削除することをお勧めします(行番号を右クリックして、「行を削除」します)。
  2. 次のように、UsedRangeプロパティの代わりに CurrentRegion を使用します。

Long SheetRows;
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;
0
Asrhael