从Excel范围获取最大行数/列数
我有一定的Range
,例如:
Range rng = activeWorksheet.Range["A1", "B50"];
我一直在检索这个Range
使用的最大行数和列数,循环遍历它并为我的variables赋一个行号,但是一定有更好的办法吗? 我一直在这样做:
int maxRow = 0; foreach (Range row in rng.Rows) maxRow = row.Row;
我想我find了最优雅的解决scheme,就像这样:
int maxRow = rng.Row + rng.Rows.Count - 1; int maxColumn = rng.Column + rng.Columns.Count - 1;
rng.Row
将检索范围内第一个使用的行号, rng.Rows.Count - 1
将检索在此范围内使用的总行数,我们也扣除1
以获得正确的最大行数。
你如何search最后使用的行?
public int FindLastFilledRowInRange(Range range) { var cell = range.Find("*", SearchOrder: Excel.XlSearchOrder.xlByRows, SearchDirection: Excel.XlSearchDirection.xlPrevious); return cell.Row; }
如果你晚于第一行开始,你可以在返回的行上做一些额外的计算。
如果您不介意使用“.EntireRow.Address(False,False)”来计算stringAddress …,那么我们会得到一个易于parsing的string…
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
从9:11开始,maxRow是11 …如果不parsing为int,那么由于stringsorting,Max()将是9
maxCol从C:BB的“BB”…如果没有填充左边,那么由于stringsortingMax()将是“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是C:AE中的“AE”,即使是非连续的范围
这是否适用于整个COLUMNselect“A:A”
这不适用于整行select“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会给你在我的情况下我们没有用的emptylines。