J'utilise C # pour automatiser un fichier Excel. J'ai pu obtenir le classeur et les feuilles qu'il contient ..__ Si, par exemple, j'ai dans sheet1 deux colonnes et 5 lignes. Je voulais obtenir la plage des cellules occupées sous le format A1: B5. J'ai essayé le code suivant, mais il n'a pas donné le résultat correct ... Les colonnes # et la ligne # étaient beaucoup plus grandes et les cellules étaient également vides.
Excel.Range xlRange = excelWorksheet.UsedRange;
int col = xlRange.Columns.Count;
int row = xlRange.Rows.Count;
Y at-il un autre moyen que je peux utiliser pour obtenir cette plage?
J'ai eu un problème très similaire à celui que vous aviez. Voici ce qui a réellement fonctionné:
iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;
//These two lines do the magic.
xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();
iTotalColumns = xlWorkSheet.UsedRange.Columns.Count;
iTotalRows = xlWorkSheet.UsedRange.Rows.Count;
IMHO ce qui se passe est que lorsque vous supprimez des données d'Excel, il continue à penser qu'il y a des données dans ces cellules, bien qu'elles soient vides. Lorsque j'ai effacé les formats, les cellules vides sont supprimées et le résultat est renvoyé.
Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
Excel.Range range = sheet.get_Range("A1", last);
"gamme" sera maintenant la plage de cellules occupée
Voir la méthode Range.SpecialCells. Par exemple, pour obtenir des cellules avec des valeurs constantes ou des formules, utilisez:
_xlWorksheet.UsedRange.SpecialCells(
Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants |
Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas)
La seule façon de le faire fonctionner dans TOUS les scénarios (sauf les feuilles protégées) (basé sur la réponse de Farham):
Elle supporte:
Analyse des lignes/colonnes masquées
Ignore les cellules formatées sans données/formule
Code:
// Unhide All Cells and clear formats
sheet.Columns.ClearFormats();
sheet.Rows.ClearFormats();
// Detect Last used Row - Ignore cells that contains formulas that result in blank values
int lastRowIgnoreFormulas = sheet.Cells.Find(
"*",
System.Reflection.Missing.Value,
InteropExcel.XlFindLookIn.xlValues,
InteropExcel.XlLookAt.xlWhole,
InteropExcel.XlSearchOrder.xlByRows,
InteropExcel.XlSearchDirection.xlPrevious,
false,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value).Row;
// Detect Last Used Column - Ignore cells that contains formulas that result in blank values
int lastColIgnoreFormulas = sheet.Cells.Find(
"*",
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
InteropExcel.XlSearchOrder.xlByColumns,
InteropExcel.XlSearchDirection.xlPrevious,
false,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value).Column;
// Detect Last used Row / Column - Including cells that contains formulas that result in blank values
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count;
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count;
Cette fonctionnalité est adaptée à la recherche de formules, mais vous devriez pouvoir l'étendre au contenu général en modifiant la façon dont vous testez les cellules de départ. Vous devrez gérer des plages de cellules uniques en dehors de cela.
public static Range GetUsedPartOfRange(this Range range)
{
Excel.Range beginCell = range.Cells[1, 1];
Excel.Range endCell = range.Cells[range.Rows.Count, range.Columns.Count];
if (!beginCell.HasFormula)
{
var beginCellRow = range.Find(
"*",
beginCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByRows,
XlSearchDirection.xlNext,
false);
var beginCellCol = range.Find(
"*",
beginCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByColumns,
XlSearchDirection.xlNext,
false);
if (null == beginCellRow || null == beginCellCol)
return null;
beginCell = range.Worksheet.Cells[beginCellRow.Row, beginCellCol.Column];
}
if (!endCell.HasFormula)
{
var endCellRow = range.Find(
"*",
endCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByRows,
XlSearchDirection.xlPrevious,
false);
var endCellCol = range.Find(
"*",
endCell,
XlFindLookIn.xlFormulas,
XlLookAt.xlPart,
XlSearchOrder.xlByColumns,
XlSearchDirection.xlPrevious,
false);
if (null == endCellRow || null == endCellCol)
return null;
endCell = range.Worksheet.Cells[endCellRow.Row, endCellCol.Column];
}
if (null == endCell || null == beginCell)
return null;
Excel.Range finalRng = range.Worksheet.Range[beginCell, endCell];
return finalRng;
}
}
Vous ne devez pas supprimer les données contenues dans la boîte en appuyant sur "supprimer". Je pense que c’est le problème, car Excel détectera toujours la boîte comme "" <- a toujours une valeur, vous devez supprimer en cliquant avec le bouton droit de la souris et cliquez sur Supprimer.
dim lastRow as long 'in VBA it's a long
lastrow = wks.range("A65000").end(xlup).row
Vous devriez essayer la propriété currentRegion si vous savez d'où vous allez trouver la plage. Cela vous donnera les limites de votre plage utilisée.
Ces deux lignes seules ne fonctionnaient pas pour moi:
xlWorkSheet.Columns.ClearFormats();
xlWorkSheet.Rows.ClearFormats();
Vous pouvez tester en appuyant sur ctrl + fin dans la feuille et en sélectionnant la cellule sélectionnée.
J'ai trouvé que l'ajout de cette ligne après les deux premières a résolu le problème dans tous les cas que j'ai rencontrés:
Excel.Range xlActiveRange = WorkSheet.UsedRange;
Petite question maintenant, mais si quelqu'un cherche une solution, cela fonctionne pour moi.
using Excel = Microsoft.Office.Interop.Excel;
Excel.ApplicationClass Excel = new Excel.ApplicationClass();
Excel.Application app = Excel.Application;
Excel.Range all = app.get_Range("A1:H10", Type.Missing);