我正在尝试使用VS 2005 vb.net动态获取Excel中的单元格范围。这适用于oRange = oSheet.Range(oSheet.Cells(“A1”),(“U281”))。选择,但“U281”并不总是该范围内的最后一个单元格。那么我将如何使用与U281相同的格式动态获取包含数据的最后一个单元格。
答案 0 :(得分:2)
要获取最后一个单元格,请使用以下公式:
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];
这可以为您节省大量的处理时间。
答案 1 :(得分:0)
这是来自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)