Как получить диапазон Excel, используя номера строк и столбцов в VSTO / C #? - PullRequest
29 голосов
/ 25 февраля 2010

Я думаю, что вопрос подводит итог. Учитывая два целых числа для строки и столбца или четыре целых числа для строки и столбца для двух углов диапазона, как мне получить объект диапазона для этого диапазона.

Ответы [ 9 ]

78 голосов
/ 25 февраля 2010

Где диапазон состоит из нескольких ячеек:

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

Где диапазон - одна ячейка:

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Cells[1, 1];
16 голосов
/ 05 августа 2014

Данный ответ вызовет ошибку, если используется в 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;
2 голосов
/ 19 апреля 2013

вы можете получить значение, как это

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

выбрать весь используемый диапазон

Excel.Range range = xlWorkSheet.UsedRange;

источник:

http://csharp.net -informations.com / Excel / CSharp-чтения excel.htm

пламенный

1 голос
/ 15 ноября 2018

Если вы получаете сообщение о том, что «Объект не содержит определения для get_range».

Попробуйте следующее.

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Range[sheet.Cells[1, 1], sheet.Cells[3,3]].Cells;
1 голос
/ 20 февраля 2017

Столкнувшись с той же проблемой, я обнаружил, что самым быстрым решением было на самом деле отсканировать строки ячеек, которые я хотел отсортировать, определить последнюю строку с непустым элементом, а затем выбрать и отсортировать эту группу.

    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
0 голосов
/ 20 ноября 2018

Попробуй, работает!

Excel.Worksheet sheet = xlWorkSheet;
Excel.Series series1 = seriesCollection.NewSeries();
Excel.Range rng = (Excel.Range)xlWorkSheet.Range[xlWorkSheet.Cells[3, 13], xlWorkSheet.Cells[pp, 13]].Cells;
series1.Values = rng;
0 голосов
/ 01 июля 2016

Если вы хотите, как 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 голосов
/ 02 июля 2015

UsedRange отлично работает с ячейками "virgins", но если ваши ячейки заполнены в прошлом, то UsedRange доставит вам старое значение.

Например:

«Думайте в листе Excel, в котором есть ячейки A1 до A5 , заполненные текстом». В этом сценарии UsedRange должен быть реализован как:

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

Переменная watch to SheetRows должна отображать значение 5 после выполнения этой пары строк.

Q1: Но что произойдет, если значение A5 будет удалено?

A1: значение SheetRows будет 5

Q2: Почему это?

A2: поскольку MSDN определяет свойство UsedRange как:

Получает объект Microsoft.Office.Interop.Excel.Range, который представляет все ячейки, которые в любое время содержали значение .


Итак, вопрос в том, существует ли какой-либо / какой-нибудь обходной путь для этого поведения?

Я думаю, в 2 альтернативах:

  1. Избегайте удаления содержимого ячейки, предпочитая удаление всей строки (щелкните правой кнопкой мыши номер строки, затем «удалить строку».
  2. Используйте CurrentRegion вместо свойства UsedRange следующим образом:

Long SheetRows;
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;
0 голосов
/ 06 марта 2013

Я нашел хороший короткий метод, который, кажется, хорошо работает ...

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

В этом примере мы выбираем 3 столбца и 5 строк вниз, а затем помещаем "Tada" в ячейку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...