2015-12-05 5 views
1

У меня странная проблема с двумя моими таблицами Excel, которые находятся на двух разных листах в моем проекте. Я использую VSTO, но VBA показывает тот же результат: количество строк в пустой таблице содержит 0 строк в одном случае и 1 строку (я предполагаю, что строка вставки) в другом случае.ListRows.Count возвращает несогласованные результаты

установки параметров

Два рабочих листов: Лист1, Лист2
Два соответствующих названные Excel Таблицы: Sheet1Table, Sheet2Table

Обе таблицы пусты, то есть у них есть одна пустая строка, которая является вставка строка, не может быть удалена.

Я бегу следующий код, чтобы определить количество строк данных (т.е. за исключением строки заголовка):

Microsoft.Office.Tools.Excel.ListObject sheet1Table = Globals.Sheet1.Sheet1Table; 
int numberOfListRows1 = sheet1Table.ListRows.Count; 

и

Microsoft.Office.Tools.Excel.ListObject sheet2Table = Globals.Sheet2.Sheet2Table; 
int numberOfListRows2 = sheet2Table.ListRows.Count; 

Результатом является то, что numberOfListRows1 равно 1 и numberOfListRows2 0 хотя результат (в зависимости от того, что правильно) должен быть одинаковым. Я сравнил свойства таблицы и рабочего листа, а также исходные файлы в Visual Studio, и я не заметил никаких различий. Любая идея, что я должен искать (и какой результат является правильным)?

+2

Использовал .add и .delete для добавления строк, а с другой - использовать строки вставки, удалять строки, поскольку список только учитывает .add .delete, поэтому вы можете перекосить счетчик с ручным редактированием таблицы? –

+1

Действительно, это похоже на то, что вызывает его. Если все строки удаляются вручную, счетчик равен «0».Итак, будет ли «1» правильным результатом, и мне нужно как-то сбросить таблицу до подсчета, если она пуста? – jerry

+0

Оказывает, что удаление (вручную или программно) исправляет его. Проблема заключалась в том, как была создана таблица. Я выбрал строку заголовка и одну пустую строку, а затем щелкнул «Формат как таблица». Результат выглядит как пустой стол со строкой вставки. Даже «COUNTA» в этой строке равно 0. Но на самом деле это строка данных, которая учитывается при создании «ListRows.Count». Кажется очевидным и почти глупым сейчас. – jerry

ответ

1

В VBA Я использовал эти подлодки, чтобы проверить ваш случай:

Sub Sheet1TableRowsCount() 
    Dim numberOfListRows1 As Integer 
    Dim sheet1Table As ListObject 
    Set sheet1Table = Sheet1.ListObjects("Sheet1Table") 
    numberOfListRows1 = sheet1Table.ListRows.Count 
    Set sheet1Table = Nothing 
End Sub 

Sub Sheet2TableRowsCount() 
    Dim numberOfListRows2 As Integer 
    Dim sheet2Table As ListObject 
    Set sheet2Table = Sheet2.ListObjects("Sheet2Table") 
    numberOfListRows2 = sheet2Table.ListRows.Count 
    Set sheet2Table = Nothing 
End Sub 

Эти таблицы:
table1table2

Когда эти таблицы создаются (неправильно), выбрав заголовки и один пустой строка, а затем форматирование выделения в виде таблицы, у них есть одна пустая строка. Эта строка не имеет содержимого, COUNTA по всей строке - 0, и она выглядит как строка вставки, которая не может быть удалена. Это, однако, допустимая строка данных, поэтому ListRows.Count получит значение 1.

Точно так же, если вы заполнить некоторые данные и вручную удалить эти введенные значения (с помощью Удалить), так что ваши таблицы будет выглядеть в самом начале, результаты будут по-прежнему 1.

Если вы удаляете строки вручную или программно (используя что-то вроде Sheet1.Range("Sheet1Table").Rows("1").Delete), то ListRows.Count выдаст значение 0.

Решение для определения фактического количества строк данных состоит в том, чтобы проверить ListRows.Count, и если результат равен 1 - удалите строку после проверки, не содержит ли она фактических значений. Вся эта ситуация может быть устранена, если пустая таблица создается путем выбора строки заголовка только до нажатия Формат в виде таблицы. Строка вставки затем создается автоматически и не считается как строка данных (результат ListRows.Count в этом случае равен 0).

+0

Если вы используете vba .add и .delete метод для таблиц, этого не произойдет –

+0

нет, я имею в виду, когда вы добавляете и удаляете строки, если вы используете vba .add и .delete вместо Excels Insert/Delete "The ListRows Возвращаемый объект не включает заголовок, итоговые значения или Вставки строк. " –

+0

@StevenMartin - Спасибо. Я понял, что вы имели в виду, и обновил ответ. – ZygD