从 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”
我有一定的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”