2010-02-25 12 views
25

Myślę, że to pytanie podsumowuje. Biorąc pod uwagę dwie liczby całkowite dla wiersza i kolumny lub cztery liczby całkowite dla wiersza i kolumny dla dwóch wierzchołków zakresu, jak uzyskać obiekt zakresu dla tego zakresu.Jak uzyskać zakres programu Excel za pomocą numerów wierszy i kolumn w VSTO/C#?

+17

Zacznę klikać znacznik wyboru na odpowiedziach, które pomogły. Ludzie są mniej skłonni do pomocy, jeśli twój procent jest niski. –

+1

Wybierz odpowiedź + Dan Crowther. Ludzie zasługują na punkty. – Kristopher

+0

@Wartickler Jeśli spojrzysz na jego stronę profilu, zobaczysz, że był ostatnio widziany na SO w 2010 roku. Uważam za mało prawdopodobne, że przyjmie on jakiekolwiek odpowiedzi w przewidywalnej przyszłości :-( –

Odpowiedz

68

Jeżeli zasięg jest wiele komórek:

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

Jeżeli zakres jest jedna komórka:

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

Doskonała odpowiedź Pomógł mi bardzo. +1 – Barun

+0

Ja też, chociaż musiałem zrobić to samo (jedno-komórkowe etui) w VBA: 'Dim rng As Range' i 'Set rng = ActiveSheet.Cells (1, 1)' – Hephaestus

+0

"Workbook.ActiveSheet;" może być 'oExcel.ThisWorkbook.ActiveSheet;', w którym 'oExcel' jest instancją Excel, tak? –

0

znalazłem dobrą krótki sposób, który wydaje się działać dobrze ...

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

W tym przykładzie wybieramy 3 kolumny powyżej i 5 wierszy w dół, a następnie umieszczając "Tada" w komórce.

15

Podana odpowiedź spowoduje zgłoszenie błędu, jeśli jest używana w bibliotece obiektów programu Microsoft Excel 14.0. Obiekt nie zawiera definicji dla get_range. Zamiast używać

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

Używam wersji 15.0 i również nie mam get_range, dzięki tic, ten kod działa świetnie dla mnie –

0

pracy UsedRange grzywny z „panien” komórek, ale jeśli komórki są wypełnione w przeszłości, wtedy UsedRange dostarczać Ci starą wartość.

Na przykład:

"Myśl w arkuszu Excel, które mają komórki A1 do A5 wypełnione tekstem". W tym scenariuszu UsedRange muszą być realizowane jako:

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

Zegarek do zmiennej SheetRows muszą posiadać wartość 5 po wykonaniu tej pary linii.

Pytanie 1: Co się stanie, jeśli wartość A5 zostanie usunięta?

A1: Wartość SheetRows byłoby 5

Q2: Dlaczego?

A2: Ponieważ właściwości UsedRange MSDN zdefiniować jako:

Pobiera obiekt Microsoft.Office.Interop.Excel.Range reprezentujący wszystkie komórki, które zawierały wartość w dowolnym momencie.


Więc pytanie jest: Istnieją/dowolny obejście tego problemu?

myślę w 2 Alternatywy:

  1. uniknąć usuwania zawartości komórki, preferując usunięcie całego wiersza (kliknij prawym przyciskiem myszy numer wiersza, a następnie „Usuń wiersz”
  2. Zastosowanie CurrentRegion zamiast. mienia UsedRange jak postępować:

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

Jeśli chcesz jak Cells(Rows.Count, 1).End(xlUp).Row, możesz to zrobić.

wystarczy użyć następującego kodu:

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

Dzięki sinsedrix! – FaceTowel

+0

A kolumna jest właśnie taka, prawda? Następnie, jeśli użyjesz forera UsedRange, wiersz po wierszu, kolumna po kolumnie, możesz uzyskać "nowy UsedRange" nie wiedząc, co wiersz/kolumna jest ostatnim wierszem/kolumną. – FaceTowel

1

obliczu tego samego problemu znalazłem najszybszym rozwiązaniem było rzeczywiście skanować rzędy komórek chciałem uporządkować określić ostatni wiersz z nie pustego elementu a następnie wybierz i sortuj na tym grupowaniu.

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 
Powiązane problemy