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#?
Odpowiedz
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];
Doskonała odpowiedź Pomógł mi bardzo. +1 – Barun
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
"Workbook.ActiveSheet;" może być 'oExcel.ThisWorkbook.ActiveSheet;', w którym 'oExcel' jest instancją Excel, tak? –
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.
można odzyskać wartość jak ten
string str = (string)(range.Cells[row, col] as Excel.Range).Value2 ;
wybrać cały używane zakresie
Excel.Range range = xlWorkSheet.UsedRange;
źródło:
http://csharp.net-informations.com/excel/csharp-read-excel.htm
płonące
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;
Używam wersji 15.0 i również nie mam get_range, dzięki tic, ten kod działa świetnie dla mnie –
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:
- uniknąć usuwania zawartości komórki, preferując usunięcie całego wiersza (kliknij prawym przyciskiem myszy numer wiersza, a następnie „Usuń wiersz”
- Zastosowanie CurrentRegion zamiast. mienia UsedRange jak postępować:
Long SheetRows;
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;
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;
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
Zacznę klikać znacznik wyboru na odpowiedziach, które pomogły. Ludzie są mniej skłonni do pomocy, jeśli twój procent jest niski. –
Wybierz odpowiedź + Dan Crowther. Ludzie zasługują na punkty. – Kristopher
@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 :-( –