【发布时间】:2012-07-25 17:21:20
【问题描述】:
我正在尝试使用 VS 2005 vb.net 动态获取 Excel 中的单元格范围。这有效 oRange = oSheet.Range(oSheet.Cells("A1"), ("U281")).Select,但“U281”并不总是该范围内的最后一个单元格。那么如何动态获取最后一个单元格中的数据,格式与 U281 相同。
【问题讨论】:
我正在尝试使用 VS 2005 vb.net 动态获取 Excel 中的单元格范围。这有效 oRange = oSheet.Range(oSheet.Cells("A1"), ("U281")).Select,但“U281”并不总是该范围内的最后一个单元格。那么如何动态获取最后一个单元格中的数据,格式与 U281 相同。
【问题讨论】:
要获取最后一个单元格,请使用以下公式:
lastCell = oSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell)
这很好用,除非您有一些用户去过电子表格的某些奇怪区域并做了他们后来删除的事情。上面的公式将返回最后一个单元格作为他们进行奇怪旅程的任何地方,即使它现在都是空白的。
在我的例子中,我必须处理许多电子表格中的每个单元格,即使只有几百行实际数据,用户也可以向下到第 60,741 行和第 50 列。为了避免这个巨大的空白区域,您要搜索具有数据的最大行和最大列,并将该单元格用作具有数据的单元格正方形的右下角,如下所示(它是 C#,但不应该是很难翻译):
Microsoft.Office.Interop.Excel.Range maxCell =
(Microsoft.Office.Interop.Excel.Range)worksheet.Cells[worksheet.Cells.Find("*",
(Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, 1],
Microsoft.Office.Interop.Excel.XlFindLookIn.xlValues,
Microsoft.Office.Interop.Excel.XlLookAt.xlWhole,
Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows,
Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious,
false, false, missing).Row,
worksheet.Cells.Find("*",
(Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, 1],
Microsoft.Office.Interop.Excel.XlFindLookIn.xlValues,
Microsoft.Office.Interop.Excel.XlLookAt.xlWhole,
Microsoft.Office.Interop.Excel.XlSearchOrder.xlByColumns,
Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious,
false, false, missing).Column];
这可以为您节省大量的处理时间。
【讨论】:
这是来自 Chris Latta 的答案的 VB2008 版本转换。谢谢!
Dim maxCell As Microsoft.Office.Interop.Excel.Range
maxCell = DirectCast(xlWorkSheet.Cells(xlWorkSheet.Cells.Find("*", _
DirectCast(xlWorkSheet.Cells(1, 1), Excel.Range), _
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, _
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlPrevious, False, False).Row, _
xlWorkSheet.Cells.Find("*", DirectCast(xlWorkSheet.Cells(1, 1), Excel.Range), _
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns, _
Excel.XlSearchDirection.xlPrevious, False, False).Column), Excel.Range)
MsgBox(maxCell.Address)
【讨论】: