Je pense que la question le résume. Étant donné deux nombres entiers pour la ligne et la colonne ou quatre nombres entiers pour la ligne et la colonne pour les deux coins d'une plage, comment obtenir un objet plage pour cette plage.
Où la plage est plusieurs cellules:
Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[3,3]);
Où la plage est une cellule:
Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Cells[1, 1];
La réponse donnée provoquera une erreur si elle est utilisée dans la bibliothèque d'objets de Microsoft Excel 14.0 . L'objet ne contient pas de définition pour 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;
vous pouvez récupérer une valeur comme celle-ci
string str = (string)(range.Cells[row, col] as Excel.Range).Value2 ;
sélectionner toute la gamme utilisée
Excel.Range range = xlWorkSheet.UsedRange;
la source :
http://csharp.net-informations.com/Excel/csharp-read-Excel.htm
flamboyant
Face au même problème, j'ai trouvé que la solution la plus rapide était de scanner les lignes des cellules que je souhaitais trier, déterminer la dernière ligne avec un élément non vide, puis sélectionner et trier sur ce groupe.
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
Si vous voulez comme Cells(Rows.Count, 1).End(xlUp).Row
, vous pouvez le faire.
utilisez simplement le code suivant:
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;
J'ai trouvé une bonne méthode courte qui semble bien fonctionner ...
Dim x, y As Integer
x = 3: y = 5
ActiveSheet.Cells(y, x).Select
ActiveCell.Value = "Tada"
Dans cet exemple, nous sélectionnons 3 colonnes au-dessus et 5 lignes vers le bas, puis nous plaçons "Tada" dans la cellule.
Si vous obtenez une erreur indiquant que «l'objet ne contient pas de définition pour get_range».
Essayez de suivre.
Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Range[sheet.Cells[1, 1], sheet.Cells[3,3]].Cells;
UsedRange fonctionne parfaitement avec les cellules "vierges", mais si vos cellules sont remplies dans le passé, UsedRange vous fournira l'ancienne valeur.
Par exemple:
"Pensez dans une feuille Excel contenant des cellules A1 à A5 remplies de texte". Dans ce scénario, UsedRange doit être implémenté en tant que:
Long SheetRows;
SheetRows = ActiveSheet.UsedRange.Rows.Count;
Une variable watch to SheetRows doit afficher une valeur de 5 après l'exécution de ce couple de lignes.
Q1: Mais que se passe-t-il si la valeur de A5 est supprimée?
A1: la valeur de SheetRows serait 5
Q2: Pourquoi ça?
A2: Parce que MSDN définit la propriété UsedRange en tant que:
Obtient un objet Microsoft.Office.Interop.Excel.Range qui représente tout} _ les cellules qui ont contenu une valeur à tout moment.
La question est donc: Existe-t-il une solution de contournement pour ce comportement?
Je pense en 2 alternatives:
Long SheetRows;
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;