2013-07-29 4 views
0

Как подсчитать количество строк в указанном столбце в листе Excel?Подсчитайте количество строк в каждом столбце

Например, у меня есть 2 колонки в таблице:

A  B 
--- ----- 
abc hi 
fff hello 
ccc hi 
     hello 

Результат должен выглядеть следующим образом:

count of A column is 3 
count of B column is 4 

Как я могу это сделать с помощью Microsoft Interop?

+1

Используйте 'WorksheetFunction.COUNTA'. –

ответ

0

Подход, предложенный Дугом Глэнси, является точной и простой в реализации. Вы можете написать функцию и получить значение из ячейки, которую не видит пользователь (например, 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; 
} 
+0

Привет Варо. Это не работает, если у меня есть пустые строки между ними. Я все еще хочу получить последнюю строку. Как игнорировать пустые строки между ними? – CoolDiva

+0

@CoolDiva, COUNTA отлично работает с пустыми строками.Проблема в том, что вы хотите что-то другое, чем то, что выполняет эта функция (ваш пример был не слишком ясен). Я сейчас обновлю свой ответ. – varocarbas

0

Это следует сделать это:

private static int GetRowsInColumnOnWorkSheetInWorkbook(string workbookName, int worksheetNumber, int workSheetColumn) 
{ 
    return new Excel.Application().Workbooks.Open(workbookName) 
     .Sheets[worksheetNumber] 
     .UsedRange 
     .Columns[workSheetColumn] 
     .Rows 
     .Count; 
} 

Вы могли бы иметь следующее переопределение также:

private static int GetRowsInColumnOnWorkSheetInWorkbook(string workbookName, string worksheetName, int workSheetColumn) 
{ 
    return new Excel.Application().Workbooks.Open(workbookName) 
     .Sheets[worksheetName] 
     .UsedRange 
     .Columns[workSheetColumn] 
     .Rows 
     .Count; 
} 

Это немного длиннее другого ответа, но я думаю, что это более читаемо и проще.

+0

Будет ли это работать, если у меня есть пустые строки между ними? Я хочу игнорировать пустые строки. – CoolDiva

Смежные вопросы