从Excel范围获取最大行/列号

本文关键字:列号 Excel 范围 获取 | 更新日期: 2023-09-27 18:34:41

我有一定的Range,例如:

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

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

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

从Excel范围获取最大行/列号

我想

我为此找到了最优雅的解决方案,如下所示:

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

rng.Row将检索该范围内第一个使用的行号,rng.Rows.Count - 1将检索此范围内使用的总行数,我们还扣除1以获得正确的最大行号。

你搜索上次使用的行怎么样?

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

如果您晚于 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 ...如果未解析为 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 是 15 从 1:3,9:15,4:7 ...即使具有不连续的范围,并且无序引用= AE15:AE9

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

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

这不适用于整行选择"3:3">

我在以前的项目中有过这个:

wb = excel.Workbooks.Open(fileName);
worksheet = wb.ActiveSheet;            
Range usedRange = worksheet.UsedRange;
this.lastRow = usedRange.Rows.Count;
this.lastCell = usedRange.Columns.Count;

使用 lastRow 会给你空行,在我的情况下我们没有用。