web-dev-qa-db-fra.com

Comment obtenir une plage Excel en utilisant les numéros de ligne et de colonne dans VSTO/C #?

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.

28
Dan Crowther

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];
76
burnside

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;
15
tic

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

2
flaming

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

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;
0
FaceTowel

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.

0
Askjerry

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;
0
user1141820

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:

  1. Évitez de supprimer le contenu de la cellule, préférant la suppression de la ligne entière (clic droit sur le numéro de la ligne, puis "supprimer la ligne".
  2. Utilisez CurrentRegion au lieu de la propriété UsedRange comme suit: 

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