2010-02-25 34 views
25

Tôi nghĩ câu hỏi sẽ kết thúc. Cho hai số nguyên cho hàng và cột hoặc bốn số nguyên cho hàng và cột cho hai góc của một phạm vi, làm thế nào để có được một đối tượng phạm vi cho phạm vi đó.Làm cách nào để có được một phạm vi Excel sử dụng số hàng và cột trong VSTO/C#?

+17

Tôi sẽ bắt đầu nhấp vào dấu kiểm trên các câu trả lời đã giúp bạn. Mọi người ít có khả năng giúp đỡ hơn nếu tỷ lệ phần trăm của bạn thấp. –

+1

Chọn câu trả lời + Dan Crowther. Con người xứng đáng với các điểm. – Kristopher

+0

@Wartickler Nếu bạn nhìn vào trang hồ sơ của mình, bạn sẽ thấy rằng anh ấy được nhìn thấy lần cuối trên SO vào năm 2010. Tôi cho rằng có thể anh ấy sẽ không chấp nhận bất kỳ câu trả lời nào trong tương lai gần :-( –

Trả lời

68

đâu phạm vi là nhiều ô:

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

đâu Phạm vi đó là một tế bào:

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

Câu trả lời xuất sắc Giúp tôi rất nhiều +1 – Barun

+0

Tôi cũng vậy, mặc dù tôi cần phải làm điều tương tự (trường hợp một ô) trong VBA: 'Dim rng As Range' và 'Set rng = ActiveSheet.Cells (1, 1)' – Hephaestus

+0

'workbook.ActiveSheet;' có thể là 'oExcel.ThisWorkbook.ActiveSheet;' trong đó 'oExcel' là một cá thể Excel, phải không? –

0

Tôi tìm thấy một phương pháp ngắn tốt điều đó dường như làm việc tốt ...

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

Trong ví dụ này, chúng tôi đang chọn 3 cột trên và 5 hàng xuống, sau đó đặt "Tada" vào ô.

15

Câu trả lời cho trước sẽ ném một lỗi nếu được sử dụng trong Thư viện đối tượng Microsoft Excel 14.0. Đối tượng không chứa định nghĩa cho get_range. Thay vì sử dụng

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

Tôi đang sử dụng phiên bản 15.0 và nó cũng không có get_range, cảm ơn tic, mã này hoạt động tuyệt vời cho tôi –

0

làm việc tốt UsedRange với "trinh nữ" tế bào, nhưng nếu các tế bào của bạn được lấp đầy trong quá khứ, sau đó UsedRange sẽ cung cấp cho bạn những giá trị cũ.

Ví dụ:

"Nghĩ trong một bảng tính Excel có có các tế bào A1 để A5 điền với văn bản". Trong kịch bản này, UsedRange phải được thực hiện như:

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

Một chiếc đồng hồ để biến SheetRows phải hiển thị một giá trị 5 sau khi thực hiện cặp vợ chồng này của dòng.

Q1: Nhưng, điều gì xảy ra nếu giá trị của A5 bị xóa?

A1: Giá trị của SheetRows sẽ là 5

Q2: Tại sao lại như vậy?

A2: Bởi vì MSDN xác định tài sản UsedRange như:

Gets một đối tượng Microsoft.Office.Interop.Excel.Range đại diện cho tất cả các tế bào đã chứa một giá trị bất cứ lúc nào.


Vì vậy, câu hỏi là: Tồn tại một số/bất kỳ cách giải quyết cho hành vi này?

Tôi nghĩ trong 2 lựa chọn:

  1. Tránh xóa nội dung của các tế bào, thích xóa toàn bộ hàng (click chuột phải trong số hàng, sau đó "xóa hàng"
  2. Sử dụng CurrentRegion để thay thế. tài sản UsedRange như sau:

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

Nếu bạn muốn như Cells(Rows.Count, 1).End(xlUp).Row, bạn có thể làm được.

chỉ cần sử dụng đoạn mã sau:

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

Cảm ơn sinsedrix! – FaceTowel

+0

Và cột giống như thế này, phải không? Sau đó, nếu bạn sử dụng UseRange foreach ngoài ra, hàng theo hàng, cột theo cột kiểm tra, bạn có thể nhận được như 'new UsedRange' không biết hàng/cột là hàng/cột cuối cùng. – FaceTowel

1

Đối mặt với cùng một vấn đề tôi thấy giải pháp nhanh nhất là để thực sự quét các hàng của các tế bào tôi muốn sắp xếp, xác định hàng cuối cùng với một yếu tố phi trống và sau đó chọn và sắp xếp theo nhóm đó.

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 
Các vấn đề liên quan