Подход, предложенный Дугом Глэнси, является точной и простой в реализации. Вы можете написать функцию и получить значение из ячейки, которую не видит пользователь (например, ZZ1000). Код прост:
Range notUsed = curSheet.get_Range("ZZ1000", "ZZ1000");
string targetCol = "A";
notUsed.Value2 = "=COUNTA(" + targetCol + ":" + targetCol + ")";
int totRows = Convert.ToInt32(notUsed.Value2);
notUsed.Value2 = "";
UPDATE ---
Из вашего примера я понял, что вы искали общее количество непустых ячеек, какой COUNTA
доставляет. Но, по-видимому, это не так: вам нужен номер строки последней непустой ячейки; то есть, используя более описательный пример:
C
---
abc
fff
ccc
hello
Вы не хотите, чтобы подсчитать количество непустых ячеек (4 в этом случае, то, что COUNTA
доставляет), но положение «привет», то есть, 5.
Мне не нравится полагаться на формулы Excel слишком много, если только для четко определенных проблем (например, ваших, как я понял это изначально). Формулы Excel доставляют еще лучшее решение для того, что вы действительно хотите (хотя его сложность правильная «в пределе»). Для учета ситуации, описанной выше, вы можете положиться на MATCH
. Если ваши клетки содержат текст (по крайней мере, одна буква на одну ячейку), код может быть изменен на:
notUsed.Value2 = "=MATCH(REPT(\"z\",255)," + targetCol + ":" + targetCol + ")";
В случае наличия числовых значений (ни одна буква в клетке):
notUsed.Value2 = "=MATCH(LOOKUP(" + Int32.MaxValue.ToString() + "," + targetCol + ":" + targetCol + ")," + targetCol + ":" + targetCol + ")";
Если вы хотите учесть оба варианта, вам нужно будет объединить эти уравнения: вы можете создать новую формулу, включающую и то, и другое; или вы можете положиться на код C# (например, получить значения из обоих уравнений и рассмотреть только более крупные).
Помните, что вам необходимо учитывать случаи, когда совпадений не найдено. Здесь у вас есть код учета для обеих ситуаций (буквы и цифры через C# код) и без каких-либо совпадений:
notUsed.Value2 = "=MATCH(REPT(\"z\",255)," + targetCol + ":" + targetCol + ")";
int lastLetter = Convert.ToInt32(notUsed.Value2);
if (lastLetter == -2146826246)
{
lastLetter = 0;
}
totRows = lastLetter;
notUsed.Value2 = "=MATCH(LOOKUP(" + Int32.MaxValue.ToString() + "," + targetCol + ":" + targetCol + ")," + targetCol + ":" + targetCol + ")";
int lastNumber = Convert.ToInt32(notUsed.Value2);
if (lastNumber == -2146826246)
{
lastNumber = 0;
}
if (lastNumber > totRows)
{
totRows = lastNumber;
}
Используйте 'WorksheetFunction.COUNTA'. –