2010-02-25 35 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 
相關問題