Для данной команды необходимо не менее двух строк исходных данных excel

Для данной комманды необходимо не менее 2 строк исх. данных

Doolosbekov

Дата: Среда, 23.03.2016, 21:31 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 56


Репутация:

0

±

Замечаний:
60% ±


Excel 2013

Возникла проблема при обновлении таблиц пишет что «Для данной комманды необходимо не менее 2 строк исходных данных» Cтрок очень много и найти ошибку почти что искать иголку в стоге сена.

Я пробывал удалять дупликаты но дуплакатов нету.

 

Ответить

_Boroda_

Дата: Среда, 23.03.2016, 21:42 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Топните на сводную — Параметры — Источник данных — измените диапазон

Предположу, что Вы сначала сделали сводную, затем удалили строки (или ячейки) с данными (кроме первой строки с шапкой), затем занесли туда данные заново. Так нельзя делать. Вернее, можно, но потом нужно изменить диапазон сводной. Или делать динамический именованный диапазон.


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Doolosbekov

Дата: Среда, 23.03.2016, 21:55 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 56


Репутация:

0

±

Замечаний:
60% ±


Excel 2013

_Boroda_, Нет не помогло

Я тоже думал что это из за диапазона, так как каждый день данные добовляються
[moder]В файле покажите

Сообщение отредактировал _Boroda_Среда, 23.03.2016, 22:11

 

Ответить

Doolosbekov

Дата: Среда, 23.03.2016, 22:22 |
Сообщение № 4

Группа: Пользователи

Ранг: Участник

Сообщений: 56


Репутация:

0

±

Замечаний:
60% ±


Excel 2013

Doolosbekov, файл слишком елик
[moder]Обрежьте.

Сообщение отредактировал _Boroda_Среда, 23.03.2016, 22:33

 

Ответить

Добрый день, уважаемые!  
На форуме есть ответ по уникальным значениям столбца и уникальным строкам по столбцу-идентификатору. А может ли кто-нибудь помочь в извлечении уникальных записей по нескольким критериям?  
Пример: из таблицы ниже необходимо выбрать только уникальные записи  

  Название фрукта      Покупка на сумму, руб.  
яблоко               14,00  
яблоко               23,00  
яблоко               23,00  
мандарин             23,00  
мандарин             15,00    
апельсин             15,00  

  В результате работы алгоритма должно остаться следующее:  
Название фрукта      Покупка на сумму, руб.  
яблоко               14,00  
яблоко               23,00  
мандарин             23,00  
мандарин             15,00    
апельсин             15,00  

  В примере два столбца, в реальной задаче — 31. Прошу помощи, если возможно составить такой алгоритм!

Единственный способ, с помощью которого я мог реплицировать эту ошибку с помощью сводной таблицы, заключался в попытке создать один из диапазона, в котором не было заголовков столбцов, как на скриншоте из ответа Stephan1010.

В функции GetPivotData Excel поля поворота называются их именами (=GETPIVOTDATA("EmailAddress",$A$3)); таким образом, имеет смысл запретить источник данных, который не имел бы их.

Решение заключалось бы в том, чтобы вместо Range — в Excel выбрать a ListObject, когда вы выбираете, скажем, диапазон $A$1:$C$1 и форматируете как таблицу (из ленты), таблица, результаты которой будут охватывать $A$1:$C$2; содержимое первой строки становится заголовками столбцов, а вторая строка является допустимой пустой записью. Интересно отметить, что это происходит (диапазон 2 строки) независимо от того, установлен ли флажок «Моя таблица с заголовками» (данные будут перенесены в первую строку, а таблица будет содержать по умолчанию «Столбец1» — «Столбец2» «-» Column3 «, если флажок снят).

Другими словами, ListObject всегда является допустимым источником данных для сводной таблицы, а Range может не содержать достаточно строк. Также, если у вас нет заголовков столбцов, и вы создаете сводную таблицу с диапазоном $A$1:$C$2, запись в $A$1:$C$1 будет использоваться в качестве заголовков столбцов, что означает, что первая запись будет потеряна.

Из кода, который вы предоставили, я предполагаю, что сводная таблица уже присутствует и связана с некоторым диапазоном [named?] в рабочей книге шаблона, содержащей макрос. Превращение диапазона в таблицу может быть столь же тривиальным, как выбор формата в виде таблицы из ленты. И тогда у вас может быть такой код, чтобы удалить все ненужные строки, сохраняя при этом достоверный источник данных для сводной таблицы:

    public void DeleteExtraTableRows(string emailAddress, Excel.ListObject table)
{
try
{
var rowIndex = 0;
var wasDeleted = false;
while (rowIndex <= table.ListRows.Count)
{
if (!wasDeleted) rowIndex++;
var row = table.ListRows[rowIndex];

var range = (Excel.Range)row.Range.Cells[1, 1];
var value = range.Value2;

if (value != null && !string.Equals(emailAddress, value.ToString()))
{
row.Delete();
wasDeleted = true;
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message + "nn" + e.StackTrace);
}
}

Существует также вероятность того, что email никогда не будет найден в условии цикла if (cell.Value2.ToString() == email ), что приведет к удалению всех строк из вашего диапазона — даже если единственное различие — это дополнительное пространство в конце -целевое значение. С приведенным выше кодом, даже если все адреса электронной почты будут удалены, источник данных остается действительным для сводной таблицы, которая будет подключена к нему.

EDIT:
В Excel вы превратите Range в ListObject, выбрав соответствующий диапазон и нажав кнопку «Формат как лента ленты» на вкладке «Главная». В качестве альтернативы вы можете создать такой способ:

            var range = ((Excel.Range)(worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[3, 1]]));
var table = worksheet.ListObjects.Add(SourceType: Excel.XlListObjectSourceType.xlSrcRange, Source: range,
XlListObjectHasHeaders: Excel.XlYesNoGuess.xlYes);
table.TableStyle = "TableStyleMedium3";

В коде вы можете получить доступ ко всем ListObjects на листе с использованием свойства ListObjects:

        var worksheet = (Excel.Worksheet) Globals.ThisAddIn.Application.ActiveSheet;
var tables = worksheet.ListObjects;

Затем вы можете получить доступ к определенной таблице ListObject/с несколькими различными способами:

        var myTable = tables[1];
var myTable = tables.Item["Table1"];
var myTable = tables.OfType<Excel.ListObject>().FirstOrDefault(t => t.Name == "Table1");

Поскольку строки добавляются из таблицы, фактический диапазон, на который он ссылается, будет соответствующим образом расширяться; используйте myTable.Range для доступа к соответствующему диапазону.

Содержание

  1. Для данной команды необходимо не менее двух строк исходных данных excel
  2. 3 ответа
  3. 1. Подготовка диапазона для условий фильтрации
  4. 2. Формирование условий фильтрации
  5. 3. Работа с мастером «Расширенного фильтра»
  6. Недостатки Расширенного фильтра
  7. Бонус. Полезный трюк с Расширенным фильтром

Для данной команды необходимо не менее двух строк исходных данных excel

В дополнение к этому рабочий лист, содержащий сводную таблицу, обновляется не; однако, если я снова открою файл, он также обновит не, если я явно не обновляю его вручную.

Что здесь происходит? Почему я иногда получаю эту ошибку?

Большое вам спасибо за руководство.

если вообще полезно, я включаю весь метод:

3 ответа

6 Решение Mathieu Guindon [2012-10-13 22:59:00]

Единственный способ, с помощью которого я мог реплицировать эту ошибку с помощью сводной таблицы, заключался в попытке создать один из диапазона, в котором не было заголовков столбцов, как на скриншоте из ответа Stephan1010.

В функции GetPivotData Excel поля поворота называются их именами ( =GETPIVOTDATA(«EmailAddress»,$A$3) ); таким образом, имеет смысл запретить источник данных, который не имел бы их.

Решение заключалось бы в том, чтобы вместо Range — в Excel выбрать a ListObject , когда вы выбираете, скажем, диапазон $A$1:$C$1 и форматируете как таблицу (из ленты), таблица, результаты которой будут охватывать $A$1:$C$2 ; содержимое первой строки становится заголовками столбцов, а вторая строка является допустимой пустой записью. Интересно отметить, что это происходит (диапазон 2 строки) независимо от того, установлен ли флажок «Моя таблица с заголовками» (данные будут перенесены в первую строку, а таблица будет содержать по умолчанию «Столбец1» — «Столбец2» «-» Column3 «, если флажок снят).

Другими словами, ListObject всегда является допустимым источником данных для сводной таблицы, а Range может не содержать достаточно строк. Также, если у вас нет заголовков столбцов, и вы создаете сводную таблицу с диапазоном $A$1:$C$2 , запись в $A$1:$C$1 будет использоваться в качестве заголовков столбцов, что означает, что первая запись будет потеряна.

Из кода, который вы предоставили, я предполагаю, что сводная таблица уже присутствует и связана с некоторым диапазоном [named?] в рабочей книге шаблона, содержащей макрос. Превращение диапазона в таблицу может быть столь же тривиальным, как выбор формата в виде таблицы из ленты. И тогда у вас может быть такой код, чтобы удалить все ненужные строки, сохраняя при этом достоверный источник данных для сводной таблицы:

Существует также вероятность того, что email никогда не будет найден в условии цикла if (cell.Value2.ToString() == email ) , что приведет к удалению всех строк из вашего диапазона — даже если единственное различие — это дополнительное пространство в конце -целевое значение. С приведенным выше кодом, даже если все адреса электронной почты будут удалены, источник данных остается действительным для сводной таблицы, которая будет подключена к нему.

EDIT: В Excel вы превратите Range в ListObject , выбрав соответствующий диапазон и нажав кнопку «Формат как лента ленты» на вкладке «Главная». В качестве альтернативы вы можете создать такой способ:

В коде вы можете получить доступ ко всем ListObjects на листе с использованием свойства ListObjects :

Затем вы можете получить доступ к определенной таблице ListObject /с несколькими различными способами:

Поскольку строки добавляются из таблицы, фактический диапазон, на который он ссылается, будет соответствующим образом расширяться; используйте myTable.Range для доступа к соответствующему диапазону.

Я предполагаю, что эта ситуация возникает из-за сводных таблиц, которые вы получили. причина refresh all также вызывает команду обновления сводной таблицы. посмотрите на код ниже. Это может дать вам представление об этом. Это не примерно 1 ряд. я проверил, что все, что работает, просто отлично, наиболее вероятно вызвано сводными таблицами.

Очевидным ответом является то, что иногда у вас есть одна строка данных в качестве источника для вашей сводной таблицы, а иногда и нет — даже если вы думаете, что делаете. Мне не удалось создать сводную таблицу (или изменить источник сводной таблицы) на одну строку данных:

но если вы каким-то образом выясните способ сделать это, вы нашли свой ответ. Нет причин, по которым вы не можете иметь одну строку данных в качестве источника только с практической/теоретической точки зрения, но похоже, что excel пытается предотвратить это (возможно, потому, что код предполагает две строки). Поэтому, если вы найдете способ, то это, вероятно, ошибка. Удачи.

Записываю макрос (таблицу строю мастером), но не могу разобраться с отличиями в Фоксе.

.ActiveWorkbook.PivotCaches.Add(1, «balance!R1C1:R1552C8»).CreatePivotTable(«», «v1», -4148)

Здесь Фокс ругается на мастера
.ActiveSheet.PivotTableWizard(1,.ActiveSheet.Cells(3, 1))

Может можно по-другому задать нужные поля для строк, столбцов, данных, без мастера?

WITH ActiveSheet.PivotTables(«v1»).PivotFields(«область»)
.Orientation = xlRowField
.Position = 1
EndWith
With ActiveSheet.PivotTables(«v1»).PivotFields(«код»)
.Orientation = xlRowField
.Position = 2
EndWith
With ActiveSheet.PivotTables(«v1»).PivotFields(«институт»)
.Orientation = xlRowField
.Position = 3
EndWith
With ActiveSheet.PivotTables(«v1»).PivotFields(«kekv»)
.Orientation = xlColumnField
.Position = 1
EndWith

А здесь во что надо преобразовать?

ActiveSheet.PivotTables(«v1»).PivotFields(«код»).Subtotals = Array(.F., .F., .F., .F., .F., .F., .F., .F., .F., .F., .F., .F.)

Я так понимаю что гдето в начале было написано что то типа

oApp = CreateObject(«Excel.Application»)
потом откр?тие или создание листа и потом.
ну и обращение кругом идет через

With oApp.ActiveWorkbook.Sheets.Add && новый лист для сводной таблицы
Str_SheetName=.name
EndWith

oApp.Sheets(Str_SheetName).PivotTableWizard(1,oApp.Sheets(Str_SheetName).Cells(3, 1))
а не просто .ActiveSheet.PivotTableWizard(1,.ActiveSheet.Cells(3, 1))

Растыкать поля куда надо

.Orientation = 1 &&xlRowField
.Position = 1

Константы xlRowField фох не знает нужно писать прость число

>Здесь Фокс ругается на мастера
>.ActiveSheet.PivotTableWizard(1,.ActiveSheet.Cells(3, 1))

loExcel.ActiveWorkbook.Sheets(str_SheetName).PivotTableWizard (1,loExcel.ActiveWorkbook.Sheets(str_SheetName).Cells(3, 1))

Я так понимаю что сводная таблица формируется на основанни данных на листе Exеl
Например на листе «Sheet1» книги кот сохранена по адресу c:1_.xls

Для фильтрации данных в Excel большинством пользователей используется небезызвестный и крайне удобный инструмент Автофильтр . Если Вы вдруг не слышали о нем, то наверстать можно здесь и здесь .

Но что, если необходимо отфильтровать данные по нескольким критериям одновременно? Или использовать при фильтрации формулу? Или отобрать значения одновременно в двух и более столбцах? На помощь в такой ситуации может прийти Расширенный фильтр (Advanced Filter) .

Процесс работы с этим фильтром существенно отличается от того, к которому все привыкли, и состоит из нескольких этапов:

  • Подготовка диапазона для условий фильтрации
  • Формирование условий фильтрации
  • Работа с мастером «Расширенного фильтра»

Чтобы Вы сразу понимали, о чем идет речь, на гифке ниже представлен небольшой пример работы фильтра:

Разберем каждый из этапов его применения поподробнее.

1. Подготовка диапазона для условий фильтрации

В автофильтре условия для фильтрации данных задаются в меню, выпадающем после клика на кнопке в шапке таблицы. В расширенном же — условия фильтрации должны задаваться в отдельном диапазоне. Этот диапазон может располагаться на том же листе, что и данные, на другом листе или даже в другой книге. Главное, чтобы он был отделен от исходных данных как минимум одним пустым столбцом или строкой (чтобы Excel не принял их за один диапазон).

Также важно помнить, что при указании в 3 шаге (работа в Мастере «Расширенного фильтра») диапазона условий нужно выделять шапку и строки, где есть какие-то критерии. Пустые строки выделять не нужно, иначе фильтра воспримет их как сигнал «Отобразить все строки».

Диапазон для задания условий фильтрации представляет собой копию шапки основной таблицы (или хотя бы тех полей, по которым нужно отбирать данные) и достаточное количество пустых строк под этой шапкой.

Правильная организация данных для работы с расширенным фильтром Правильная организация данных для работы с расширенным фильтром

2. Формирование условий фильтрации

Этот этап является ключевым и раскрывает всю мощь инструмента. Для начала Вы должны научиться правильно задавать критерии для отбора.

Они могут быть 3 видов:

Если в качестве текстового критерия ввести в поле какое-то слово, например, «Москва», то будут отобраны ВСЕ строки, в которых в заданном столбце запись начинается со слова «Москва»

Если слово или часть слова нужно искать не с начала строки, а во всей, то необходимо пользоваться подстановочными знаками. Если Вы про них не знаете, читайте вот здесь и здесь . В примере ниже найдены все строки, в которых в столбце «Город» есть слово «Петербург»

Если нужно найти точное вхождение слова или фразы, то критерий придется задать несколько необычной формулой. Например, чтобы найти строки, в которых записано «Петербург» и не отображать строки «Санкт-Петербург», нужно ввести формулу: =»=Петербург» (именно так, с двумя знаками «=») .

— числовые критерии и даты

В качестве критерия можно вводить число (и тогда будут отобраны строки, в которых значения столбца равны этому числу)

Также можно вводить выражения с использованием логических операторов (>, =, ). Например, найти строки с суммой больше 500 000 можно введя критерий >500000

Особо внимательным нужно быть при вводе критериев в виде даты. Даты обязательно необходимо вводить через косую черту. Например, чтобы отобрать все сделки после 4 января 2017, нужно ввести критерий по полю «Дата» — >04/01/2017 (в некоторых версиях Excel требуется осуществлять ввод в формате ММ/ДД/ГГГГ, то есть сначала указывать месяц. Имейте это в виду при работе).

Самое лучшее, что умеет расширенный фильтр — это использовать в качестве критерия формулы. Чтобы все работало, задаваемая Вами формула должна возвращать значение ИСТИНА (и тогда строка выведется) или ЛОЖЬ (строка будет скрыта). Крайне важно — шапка столбца с формулой должна отличаться от любой записи в шапке таблицы (можете вообще оставить ее пустой). При написании формул, не забывайте правильно расставлять абсолютные и относительные ссылки.

Например, если нужно показать топ 5 строк по полю сумма, то необходимо будет ввести следующую формулу:

где F10 — ячейка первой строки в столбце «Сумма» (она не закреплена, так как формула будет перебирать строки по очереди), $F$10:$F$37 — ссылка на диапазон, который занимает столбец «Сумма» (ссылка закреплена, так как столбец не изменяется).

В результате формула пройдет по всем строкам (от 10-ой до 37-ой) и скроет все, кроме тех, где значение больше шестого по величине (то есть оставит ТОП 5).

Конечно, все описанные критерии и примеры можно реализовать с помощью обычного автофильтра (кроме возможности использовать формулы). Однако, весь потенциал расширенного фильтра раскрывается, когда Вы умеете правильно комбинировать множество критериев между собой.

Итак, основные концепции, которые Вам нужно усвоить для успешного применения Расширенного фильтра:

— заголовок столбца, в котором пишем критерий отбора, должен быть точно таким же, как у того столбца, к которому применяем этот критерий. То есть, если отбираем строки, в которых в столбце «Сумма» значение больше 500, то и условие >500 пишем под шапку «Сумма»;

— условия, записанные в одной строке, воспринимаются фильтром как связанные оператором И. Например, на картинке ниже записано условие И год 2017, И город Москва, И менеджер Петров .

— условия, записанные в разных строках, воспринимаются фильтром как связанные оператором ИЛИ. Условия могут применяться как к одному столбцу, так и к разным. Например, на картинке ниже записано условие ИЛИ город Москва, ИЛИ менеджер Иванов . Таким образом, каждая строка — это единый набор условий.

— если нужно задать условие И, но при этом использовать один и тот же столбец (например, И сумма больше 500 000, И сумма меньше 600 000 ), то заголовок такого столбца нужно продублировать дважды. Пример:

Теперь Вы знаете, какие критерии можно задавать, и как их правильно комбинировать. Этого достаточно, чтобы создавать сложные запросы, которые не под силу обычному автофильтру. Например, если нужно показать все сделки в Москве за 2017 год с суммой больше 500 000, а также одновременно отобразить все сделки Иванова за 2016 год, которые входят в ТОП5, то критерии будут выглядеть вот так:

3. Работа с мастером «Расширенного фильтра»

Самое сложное позади — Вы научились формировать критерии отбора. Остался один шаг. Выделяем диапазон с исходными данными (или любую его ячейку — Excel сам определит и выделит нужный массив) и находим на ленте команду «Дополнительно» во вкладке «Данные» в группе «Сортировка и Фильтр». Перед Вами появится окно «Расширенный фильтр»

1) задать исходный диапазон (он будет выбран автоматически при запуске фильтра),

2) определить диапазон условия (ваша мини-табличка с критериями, автоматически Excel может определить диапазон неточно, лучше каждый раз переназначать его заново), на этом шаге помним, что выделяем только заголовки и строки с критерием, пустые строки включать в диапазон нельзя ,

3) выбрать способ обработки (фильтровать данные в вашей исходной таблице или скопировать отфильтрованные строки в другое место),

4) указать, стоит ли показать все записи, или вывести только уникальные.

После настройки нажимаем «ОК» и получаем желаемый результат.

Чтобы очистить фильтр, переместите курсор в шапку таблицы с отфильтрованными данными и воспользуйтесь командой «Очистить» на ленте, или примените Автофильтр (Ctrl+Shift+L).

Недостатки Расширенного фильтра

Главным недостатком является то, что данный инструмент не является интерактивным и динамическим. Нельзя просто вписать в диапазон условий новый критерий и увидеть результат. Придется каждый раз вызывать Мастер «Расширенного фильтра» и повторять некоторые операции. Конечно, можно обойти и этот недостаток, но это уже тема для другой статьи.

Бонус. Полезный трюк с Расширенным фильтром

Если вам нужно быстро извлечь из диапазона уникальные записи, то проделайте следующее:

В дополнение к этому рабочий лист, содержащий сводную таблицу, обновляется не; однако, если я снова открою файл, он также обновит не, если я явно не обновляю его вручную.

Что здесь происходит? Почему я иногда получаю эту ошибку?

Большое вам спасибо за руководство.

если вообще полезно, я включаю весь метод:

Единственный способ, с помощью которого я мог реплицировать эту ошибку с помощью сводной таблицы, заключался в попытке создать один из диапазона, в котором не было заголовков столбцов, как на скриншоте из ответа Stephan1010.

В функции GetPivotData Excel поля поворота называются их именами ( =GETPIVOTDATA(«EmailAddress»,$A$3) ); таким образом, имеет смысл запретить источник данных, который не имел бы их.

Решение заключалось бы в том, чтобы вместо Range — в Excel выбрать a ListObject , когда вы выбираете, скажем, диапазон $A$1:$C$1 и форматируете как таблицу (из ленты), таблица, результаты которой будут охватывать $A$1:$C$2 ; содержимое первой строки становится заголовками столбцов, а вторая строка является допустимой пустой записью. Интересно отметить, что это происходит (диапазон 2 строки) независимо от того, установлен ли флажок «Моя таблица с заголовками» (данные будут перенесены в первую строку, а таблица будет содержать по умолчанию «Столбец1» — «Столбец2» «-» Column3 «, если флажок снят).

Другими словами, ListObject всегда является допустимым источником данных для сводной таблицы, а Range может не содержать достаточно строк. Также, если у вас нет заголовков столбцов, и вы создаете сводную таблицу с диапазоном $A$1:$C$2 , запись в $A$1:$C$1 будет использоваться в качестве заголовков столбцов, что означает, что первая запись будет потеряна.

Из кода, который вы предоставили, я предполагаю, что сводная таблица уже присутствует и связана с некоторым диапазоном [named?] в рабочей книге шаблона, содержащей макрос. Превращение диапазона в таблицу может быть столь же тривиальным, как выбор формата в виде таблицы из ленты. И тогда у вас может быть такой код, чтобы удалить все ненужные строки, сохраняя при этом достоверный источник данных для сводной таблицы:

Существует также вероятность того, что email никогда не будет найден в условии цикла if (cell.Value2.ToString() == email ) , что приведет к удалению всех строк из вашего диапазона — даже если единственное различие — это дополнительное пространство в конце -целевое значение. С приведенным выше кодом, даже если все адреса электронной почты будут удалены, источник данных остается действительным для сводной таблицы, которая будет подключена к нему.

EDIT: В Excel вы превратите Range в ListObject , выбрав соответствующий диапазон и нажав кнопку «Формат как лента ленты» на вкладке «Главная». В качестве альтернативы вы можете создать такой способ:

В коде вы можете получить доступ ко всем ListObjects на листе с использованием свойства ListObjects :

Затем вы можете получить доступ к определенной таблице ListObject /с несколькими различными способами:

Источник

The only way I could replicate this error with a pivot table was by attempting to create one off a range that didn’t have column headers, just like on the screenshot from Stephan1010’s answer.

In the GetPivotData Excel function, pivot fields are referred to by their names (=GETPIVOTDATA("EmailAddress",$A$3)); thus, it makes sense to disallow a data source that wouldn’t have them.

The solution would be to pivot over a ListObject instead of a Range — in Excel when you select, say, range $A$1:$C$1 and format as table (from the Ribbon), the table that results will span $A$1:$C$2; the contents of the first row becomes the column headers and the second row is a valid, empty record. Interesting to note that this happens (the 2-row span) regardless of whether or not you check the «My table has headers» checkbox (the data will be moved to the first row and the table will contain default «Column1»-«Column2»-«Column3» headers if the checkbox is cleared).

In other words, a ListObject is always a valid data source for a pivot table, while a Range may not contain enough rows. Also if you don’t have column headers and you create a pivot table with range $A$1:$C$2, the record at $A$1:$C$1 will be used as column headers, which means that first record is lost.

From the code you have supplied I would presume the pivot table is already present and connected to some [named?] range in a template workbook that contains the macro. Turning your range into a table might be as trivial as selecting format as table from the Ribbon. And then you could have code like this to remove all unnecessary rows while still keeping a valid data source for the pivot table:

    public void DeleteExtraTableRows(string emailAddress, Excel.ListObject table)
    {
        try
        {
            var rowIndex = 0;
            var wasDeleted = false;
            while (rowIndex <= table.ListRows.Count)
            {
                if (!wasDeleted) rowIndex++;
                var row = table.ListRows[rowIndex];

                var range = (Excel.Range)row.Range.Cells[1, 1];
                var value = range.Value2;

                if (value != null && !string.Equals(emailAddress, value.ToString()))
                {
                    row.Delete();
                    wasDeleted = true;
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message + "nn" + e.StackTrace);
        }
    }

There is also a possibility that the email is never found in the loop’s if (cell.Value2.ToString() == email ) condition, which would end up deleting all rows from your range — even if the only difference is an extra space at the end of the in-cell value. With the above code, even if all email addresses get deleted the data source remains a valid one for a pivot table that would be connected to it.

EDIT:
In Excel you turn a Range into a ListObject by selecting the range in question and clicking the Format as table Ribbon button, from the Home tab. Alternatively you can create one like this:

            var range = ((Excel.Range)(worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[3, 1]]));
            var table = worksheet.ListObjects.Add(SourceType: Excel.XlListObjectSourceType.xlSrcRange, Source: range,
                                      XlListObjectHasHeaders: Excel.XlYesNoGuess.xlYes);
            table.TableStyle = "TableStyleMedium3";

In code, you can access all ListObjects on a worksheet using the ListObjects property:

        var worksheet = (Excel.Worksheet) Globals.ThisAddIn.Application.ActiveSheet;
        var tables = worksheet.ListObjects;

Then, you can access a specific ListObject /table with several different ways:

        var myTable = tables[1];
        var myTable = tables.Item["Table1"];
        var myTable = tables.OfType<Excel.ListObject>().FirstOrDefault(t => t.Name == "Table1");

As rows are added from the table, the actual range it refers to will be expanded accordingly; use myTable.Range to access the range in question.

Понравилась статья? Поделить с друзьями:
  • Для вычисления среднего значения диапазона ячеек от а 112 до а 125 электронной таблицы excel
  • Для вычисления среднего арифметического в программе excel используется формула срзнач
  • Для вычисления производной в excel
  • Для вычисления минимального значения диапазона ячеек от с12 до с 18 электронной таблицы excel
  • Для вычисления значения функции y sin 2 x 3 в ms excel