2010-02-25 6 views
25

Ich denke, die Frage fasst es zusammen. Geben Sie zwei Ganzzahlen für Zeile und Spalte oder vier Ganzzahlen für Zeile und Spalte für die beiden Ecken eines Bereichs an. Wie erhalte ich ein Bereichsobjekt für diesen Bereich.Wie erhalte ich einen Excel-Bereich mit Zeilen- und Spaltennummern in VSTO/C#?

+17

Ich würde beginnen, das Häkchen auf die Antworten, die Ihnen geholfen haben. Menschen sind weniger wahrscheinlich, wenn Ihr Prozentsatz niedrig ist. –

+1

Wählen Sie eine Antwort + Dan Crowther. Die Leute verdienen die Punkte. – Kristopher

+0

@Wartickler Wenn Sie auf seine Profilseite schauen, werden Sie sehen, dass er 2010 zum letzten Mal auf SO gesehen wurde. Ich halte es für unwahrscheinlich, dass er in absehbarer Zeit irgendwelche Antworten akzeptiert :-( –

Antwort

68

Wo der Bereich mehrere Zellen ist:

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

Wo Bereich ist eine Zelle:

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

Ausgezeichnete Antwort.Hat mir sehr geholfen +1 – Barun

+0

Ich auch, obwohl ich das gleiche tun musste (Ein-Zellen-Fall) in VBA: 'Dim rng As Range' und 'Set rng = ActiveSheet.Cells (1, 1)' – Hephaestus

+0

Die 'workbook.ActiveSheet;' könnte 'oExcel.ThisWorkbook.ActiveSheet;' in denen "oExcel" ist eine Excel-Instanz, richtig? –

0

ich eine gute kurze Methode gefunden, die gut ...

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

In diesem Beispiel wählen wir 3 Spalten über und 5 Zeilen nach unten und setzen dann "Tada" in die Zelle.

15

Die angegebene Antwort löst einen Fehler aus, wenn sie in der Objektbibliothek von Microsoft Excel 14.0 verwendet wird. Das Objekt enthält keine Definition für get_range. Statt

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

Ich benutze Version 15.0 und es hat auch nicht get_range, danke tic, dieser Code funktioniert gut für mich –

0

Usedrange funktionieren mit „Jungfrauen“ Zellen verwenden, aber wenn Ihre Zellen in der Vergangenheit gefüllt sind, dann wird Usedrange Sie den alten Wert liefern.

Zum Beispiel:

"in einem Excel-Sheet denken, dass Zellen A1 bis A5 gefüllt mit Text hat". In diesem Szenario werden UsedRange müssen umgesetzt als:

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

Eine Uhr auf SheetRows Variable einen Wert von 5 nach der Ausführung dieser paar Zeilen angezeigt werden müssen.

Q1: Aber was passiert, wenn der Wert von A5 gelöscht wird?

A1: Der Wert von SheetRows wäre 5

Q2: Warum das?

A2: Da MSDN Usedrange Eigenschaft definieren als:

ein Objekt Microsoft.Office.Interop.Excel.Range Ruft die alle die Zellen darstellt, die einen Wert jederzeit enthalten haben.


Also, die Frage ist: some/jede Abhilfe für dieses Verhalten gibt es?

denke ich, in zwei Alternativen:

  1. Vermeiden Sie den Inhalt der Zelle zu löschen, Löschen der gesamten Zeile vorzieht (rechts in der Zeilennummer klicken, dann „Zeile löschen“
  2. Verwenden CurrentRegion statt. wie folgt von Usedrange Eigenschaft:

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

Wenn Sie wiewollen, Sie können es tun.

benutzen Sie einfach den folgenden Code:

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

Danke sinsedrix! – FaceTowel

+0

Und Spalte ist genau so, oder? Wenn Sie UsedRange foreach dann zeilenweise und spaltenweise verwenden, können Sie wie 'new UsedRange' erhalten, ohne zu wissen, was die Zeile/Spalte die letzte Zeile/Spalte ist. – FaceTowel

1

vor dem gleichen Problem ich die schnellste Lösung gefunden war, um tatsächlich die Reihen der Zellen scanne ich sortieren wollte, bestimmen die letzte Zeile mit einem nicht leeren Element und dann wählen und sortieren Sie nach dieser Gruppierung.

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 
Verwandte Themen