Je rencontre des problèmes avec le ci-dessous. Le premier bit de code fonctionne en tirant toutes les valeurs distinctes dans une zone de liste pour l'utilisateur à examiner. Cependant, quand les données sont filtrées, il tire toujours dans toutes les valeurs cachées ce qui n'est pas ce que je veux. Quand j'ai essayé de tirer seulement des cellules visibles dans la gamme, il a cassé la conversion de ma gamme en une liste distincte. Des pensées sur pourquoi briser la gamme brise cela? Le code casse sur la ligne System.Array myvalues avec l'erreur "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Impossible de convertir le type 'string' en 'System.Array'". Cela me semble étrange.Liste distincte de non linéaire Excel Range C#
Code du travail:
Range values = sht.Range[cell1, cell2];
System.Array myvalues = (System.Array)values.Cells.Value;
string[] listValues = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
string[] listValues2 = listValues.Distinct().ToArray();
Briser le code:
Range values = sht.Range[cell1, cell2].SpecialCells(XlCellType.xlCellTypeVisible);
System.Array myvalues = (System.Array)values.Cells.Value;
string[] listValues = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
string[] listValues2 = listValues.Distinct().ToArray();
EDIT:
code de travail pour gérer lorsque la plage est cachée et quand il est pas:
var extractedFromSheet = new List<object>();
foreach (Range area in values.Areas)
{
var areaValue = area.Value;
if (areaValue is Array) // The area contains multiple cells
{
var arr = (Array)areaValue;
extractedFromSheet.AddRange(arr.OfType<object>().Select(o => o .ToString()));
}
else // The area contains one cell
{
extractedFromSheet.Add(areaValue);
}
}
var distinct = extractedFromSheet.Distinct();
Impossible de reproduire l'erreur. Ce que je vois, c'est que la gamme est divisée en 'Areas' quand certaines parties de la gamme sont cachées par le filtre. Mais cela ne conduit pas à une erreur, mais 'Value' renvoie juste le premier' Area'. – dee