Для данной команды необходимо не менее двух строк исходных данных 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;6),
где 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 /с несколькими различными способами:
Читайте также: