2016-02-15 1 views
0

У меня есть определенный Range, например:Получение номер максимальной строки/столбца из Excel Range

Range rng = activeWorksheet.Range["A1", "B50"]; 

Я извлечения максимальной строки и столбца, используемый в этом Range проходом по нему и назначая номер строки в мою переменную, но должен быть лучший способ? Я делал это:

int maxRow = 0; 
foreach (Range row in rng.Rows) 
    maxRow = row.Row; 

ответ

2

Я думаю, что я нашел самое элегантное решение для этого, что-то вроде этого:

int maxRow = rng.Row + rng.Rows.Count - 1; 
int maxColumn = rng.Column + rng.Columns.Count - 1; 

rng.Row будет извлекать первый используемый номер строки в диапазоне, rng.Rows.Count - 1 будет извлекать общее количество строк, используемых в этой области, и мы также вычесть 1, чтобы получить правильное максимальное число строк.

1

Как насчет поиска последней использованной строки?

public int FindLastFilledRowInRange(Range range) 
{ 
    var cell = range.Find("*", SearchOrder: Excel.XlSearchOrder.xlByRows, SearchDirection: Excel.XlSearchDirection.xlPrevious); 
    return cell.Row; 
} 

Если начать позже, чем грести 1 вы можете просто сделать некоторые дополнительные математику на возвращаемой строки ...

-1

Я это на предыдущем проекте:

wb = excel.Workbooks.Open(fileName); 
worksheet = wb.ActiveSheet;    
Range usedRange = worksheet.UsedRange; 

this.lastRow = usedRange.Rows.Count; 
this.lastCell = usedRange.Columns.Count; 

Использование lastRow даст вам emptylines в моем случае мы не полезные.

1

Если вы не возражаете оценки строки адреса ... с помощью ".EntireRow.Address (False, False)" мы получаем строку, которая легко разобраны ...

C# ...

int maxRow = range.EntireRow.Address(false, false).Split(",:".ToCharArray()).Select(n => int.Parse(n)).Max(); 
string maxCol = range.EntireColumn.Address(false, false).Split(",:".ToCharArray()).Select(s => s.PadLeft(3)).Max().Trim(); 

VB ...;

Dim maxRow As Integer = -1 
Dim maxCol As String = "" 
range = ws.Range("$BB9:$C11") 
maxRow = range.EntireRow.Address(False, False).Split(",:".ToCharArray()).Select(Function(n) Integer.Parse(n)).Max() ' 9:11 
maxCol = range.EntireColumn.Address(False, False).Split(",:".ToCharArray()).Select(Function(s) s.PadLeft(3)).Max().Trim() ' C:BB 

заданный диапазон BB9: C11

MAXROW является 11 от 9:11 ... если не разбирается в целое, то Max() будет 9 из-за строки сортировки

MAXCOL является "BB" от C: BB ... если не проложенный слева, то Max() будет "C" из-за строки сортировки

range = ws.Range("A1:A3,AE15:AE9,C4:C7") 
maxRow = range.EntireRow.Address(False, False).Split(",:".ToCharArray()).Select(Function(n) Integer.Parse(n)).Max() ' 1:3,9:15,4:7 
maxCol = range.EntireColumn.Address(False, False).Split(",:".ToCharArray()).Select(Function(s) s.PadLeft(3)).Max().Trim() ' 1:3,9:15,4:7 

и учитывая диапазон несмежных диапазон: A1: A3, Æ15: AE9, C4: C7

MAXROW 15 от 1: 3,9: 15,4: 7 ... даже с несмежных диапазона, а также ссылки из заказа = Æ15: AE9

MAXCOL является "АЕ" от C: А.Е. ... даже с Непоследовательным диапазоном

это работа с цельным выбором COLUMN «A:»

это не работает с цельным выбором строки «3: 3»