2010-02-25 34 views
25

我认为这个问题总结了一下。给定行和列的两个整数或范围两个角的行和列的四个整数,如何获得该范围的范围对象。如何使用VSTO/C#中的行和列号获取Excel范围?

+17

我会开始点击帮助你的答案上的复选标记。如果你的百分比很低,人们不太可能提供帮助。 – 2011-12-20 02:59:37

+1

选择一个答案+ Dan Crowther。人们应该得到这些观点。 – Kristopher 2013-10-29 19:57:04

+0

@Wartickler如果你看他的个人资料页面,你会发现他在2010年最后一次出现在SO上。我认为他不太可能在可预见的将来接受任何答案:-( – 2014-06-06 07:50:15

回答

68

凡范围是多个单元格:

Excel.Worksheet sheet = workbook.ActiveSheet; 
Excel.Range rng = (Excel.Range) sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[3,3]); 

凡范围是一个单元:

Excel.Worksheet sheet = workbook.ActiveSheet; 
Excel.Range rng = (Excel.Range) sheet.Cells[1, 1]; 
+1

优秀的答案。帮助我很多+1 – Barun 2012-03-22 22:45:50

+0

我也是,虽然我需要在VBA中做同样的事情(单细胞的情况):'Dim rng As Range'和'Set rng = ActiveSheet.Cells(1,1)' – Hephaestus 2012-09-22 03:38:40

+0

'workbook.ActiveSheet;'可能是'oExcel.ThisWorkbook.ActiveSheet;''其中'oExcel'是一个Excel实例,对吧? – 2016-04-20 12:31:45

0

我发现,似乎工作以及良好的短方法...

Dim x, y As Integer 
x = 3: y = 5 
ActiveSheet.Cells(y, x).Select 
ActiveCell.Value = "Tada" 

在这个例子中,我们选择3列和5列向下,然后把“Tada”放在单元格中。

15

给定的答案将在Microsoft Excel 14.0对象库中使用时引发错误。 对象不包含get_range的定义。 而是使用

int countRows = xlWorkSheetData.UsedRange.Rows.Count; 
int countColumns = xlWorkSheetData.UsedRange.Columns.Count; 
object[,] data = xlWorkSheetData.Range[xlWorkSheetData.Cells[1, 1], xlWorkSheetData.Cells[countRows, countColumns]].Cells.Value2; 
+0

我使用的版本15.0,它也没有get_range,谢谢你,这段代码很适合我 – 2016-02-26 14:27:54

0

UsedRange做工精细用“处女”的细胞,但如果你的细胞都充满了过去,然后UsedRange将提供给你的旧值。

例如:

“认为在具有细胞A1A5填充有文本Excel工作表”。在这种情况下,必须UsedRange被实现为:

Long SheetRows; 
SheetRows = ActiveSheet.UsedRange.Rows.Count; 

甲手表SheetRows变量必须这几行的执行之后显示的值为5。

问题1:但是,如果A5的值被删除会发生什么?

A1:SheetRows的值为5

Q2:为什么这样?

A2:由于MSDN限定UsedRange属性为:

获取表示所有 在任何时间都包含一个值的细胞Microsoft.Office.Interop.Excel.Range对象。


所以,问题是:存在着一些/任何的办法解决这个问题?

我认为在2个备选方案:

  1. 避免删除单元格的内容,更喜欢全行删除(右键单击行号,然后选择“删除行”
  2. 使用CurrentRegion代替。 UsedRange属性的如下:

Long SheetRows; 
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count; 
0

如果你想要一个像Cells(Rows.Count, 1).End(xlUp).Row,你可以做到。

只需使用下面的代码:

using Excel = Microsoft.Office.Interop.Excel; 

string xlBk = @"D:\Test.xlsx"; 
Excel.Application xlApp; 
Excel.Workbook xlWb; 
Excel.Worksheet xlWs; 

Excel.Range rng; 
int iLast; 

xlApp = new Excel.Application(); 
xlWb = xlApp.Workbooks.Open(xlBk, 0, true, 5, "", "", true, 
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1); 

iLast = xlWs.Rows.Count; 
rng = (Excel.Range)xlWs.Cells[iLast, 1]; 
iLast = rng.get_End(Excel.XlDirection.xlUp).Row; 
+0

谢谢sinsedrix! – FaceTowel 2017-05-14 09:17:56

+0

而Column就是这样,对吧?然后,如果您另外使用UsedRange foreach,逐行,逐列检查,您可以得到像'new UsedRange'不知道行/列是最后一行/列的内容。 – FaceTowel 2017-05-14 09:27:42

1

面对我发现最快的解决办法是实际扫描我希望排序单元的行同样的问题,确定与非空白元素的最后一行然后选择并对该分组排序。

Dim lastrow As Integer 
lastrow = 0 
For r = 3 To 120 
    If Cells(r, 2) = "" Then 
     Dim rng As Range 
     Set rng = Range(Cells(3, 2), Cells(r - 1, 2 + 6)) 
     rng.Select 
     rng.Sort Key1:=Range("h3"), order1:=xlDescending, Header:=xlGuess, DataOption1:=xlSortNormal 
     r = 205 
    End If 
Next r 
相关问题