从 Excel 范围中获取最大 row/column 数字

Getting maximum row/column number from Excel Range

我有一定的Range,例如:

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

我一直在检索这个 Range 中使用的最大行号和列号,方法是遍历它并为我的变量分配一个行号,但是一定有更好的方法吗?我一直在这样做:

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

你搜索最后使用的行怎么样?

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

如果您晚于第 1 行开始,您可以在返回的行上做一些额外的数学运算...

我想我找到了最优雅的解决方案,像这样:

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

rng.Row 将检索范围内第一个使用的行号,rng.Rows.Count - 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 会给你空行,在我的例子中我们没有用。

如果您不介意评估字符串地址... 通过使用 ".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 是 9:11 的 11 ...如果不解析为 int,则由于字符串排序,Max() 将为 9

maxCol 是 C:BB 的 "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,AE15:AE9,C4:C7

maxRow 是 1:3,9:15,4:7 中的 15 ...即使范围不连续,并且引用乱序= AE15:AE9

maxCol 是 "AE" 来自 C:AE ...即使是非连续范围

这确实适用于整个列选择 "A:A"

这不适用于整行选择“3:3”