webentwicklung-frage-antwort-db.com.de

Wie erhalte ich einen Excel-Bereich mit Zeilen- und Spaltennummern in VSTO/C #?

Ich denke, die Frage fasst es zusammen. Angenommen, zwei Ganzzahlen für Zeile und Spalte oder vier Ganzzahlen für Zeile und Spalte für die beiden Ecken eines Bereichs. Wie erhalte ich ein Bereichsobjekt für diesen Bereich?.

28
Dan Crowther

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 Reichweite eine Zelle ist:

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

Die angegebene Antwort löst einen Fehler aus, wenn sie in der Microsoft Excel 14.0-Objektbibliothek verwendet wird. Das Objekt enthält keine Definition für "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;
15
tic

sie können den Wert so abrufen

string str = (string)(range.Cells[row, col] as Excel.Range).Value2 ;

wählen Sie den gesamten verwendeten Bereich aus

Excel.Range range = xlWorkSheet.UsedRange;

quelle :

http://csharp.net-informations.com/Excel/csharp-read-Excel.htm

flammend

2
flaming

Angesichts des gleichen Problems stellte ich fest, dass die schnellste Lösung darin bestand, die Zeilen der zu sortierenden Zellen zu scannen, die letzte Zeile mit einem nicht leeren Element zu bestimmen und dann diese Gruppierung auszuwählen und zu sortieren.

    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
1
A Burns

Wenn Sie Cells(Rows.Count, 1).End(xlUp).Row möchten, können Sie es tun.

verwenden 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
FaceTowel

Ich habe eine gute kurze Methode gefunden, die gut zu funktionieren scheint ...

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

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

0
Askjerry

Wenn Sie eine Fehlermeldung erhalten, die besagt, dass "Objekt keine Definition für" get_range "enthält. 

Versuchen Sie folgendes.

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

UsedRange funktioniert gut mit "Jungfrauen" -Zellen, aber wenn Ihre Zellen in der Vergangenheit gefüllt sind, liefert UsedRange Ihnen den alten Wert.

Zum Beispiel:

Msgstr "Denken Sie in einem Excel - Arbeitsblatt, das die Zellen A1 bis A5 mit Text gefüllt hat". In diesem Szenario muss UsedRange implementiert sein als:

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

Eine Watch to SheetRows-Variable muss nach Ausführung dieser Zeilenpaare den Wert 5 anzeigen.

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

A1: Der Wert von SheetRows wäre 5

Q2: Warum das?

A2: Weil MSDN die UsedRange-Eigenschaft wie folgt definiert:

Ruft ein Microsoft.Office.Interop.Excel.Range-Objekt ab, das alle darstelltdie Zellen, die jederzeit einen Wert enthielten.


Die Frage ist also: Gibt es eine/irgendeine Problemumgehung für dieses Verhalten?

Ich denke in 2 Alternativen:

  1. Vermeiden Sie es, den Inhalt der Zelle zu löschen, sondern die gesamte Zeile zu löschen (klicken Sie mit der rechten Maustaste auf die Zeilennummer und dann auf "Zeile löschen").
  2. Verwenden Sie CurrentRegion anstelle der UsedRange-Eigenschaft wie folgt: 

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