Excel vba listobjects querytable

Это продолжение перевода книги Зак Барресс и Кевин Джонс. Таблицы Excel: Полное руководство для создания, использования и автоматизации списков и таблиц (Excel Tables: A Complete Guide for Creating, Using and Automating Lists and Tables by Zack Barresse and Kevin Jones. Published by: Holy Macro! Books. First printing: July 2014. – 161 p.). Visual Basic for Applications (VBA) – это язык программирования, который можно использовать для расширения стандартных возможностей Excel. VBA позволяет автоматизировать сложные или повторяющиеся задачи. Например, VBA можно использовать для форматирования листа, получаемого ежедневно из внешнего источника, извлечения данных с веб-страницы раз в неделю или построения сложной пользовательской функции листа.

Предыдущая глава        Содержание    Следующая глава

Ris. 9.1. Redaktirovanie makrosov

Рис. 9.1. Редактирование макросов

Скачать заметку в формате Word или pdf

Вот некоторые примеры автоматизации Таблиц Excel:

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

Для работы с этой главой лучше всего, если у вас есть начальный уровень программирования, вы знакомы с объектной моделью и хотите расширить функциональность Таблиц Excel (см. Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA). Среда VBA не русифицирована.

Один из самых простых способов начать работать с VBA – это использовать запись макросов. При этом действия, которые вы совершаете в Excel, записываются в среде VBA в виде инструкций. Не забудьте выключить запись макросов, когда автоматизированные действия будут завершены. Вы можете просматривать и редактировать код VBA, пройдя по меню Разработчик –> Макросы, выбрать имя макроса и нажать кнопку Изменить (рис. 9.1). Код, сгенерированный при записи макросов, не самый эффективный, и вы часто можете улучшить его с помощью редактирования.

Если вкладка Разработчик не видна, включите ее, пройдя по меню Файл –> Параметры –> Настроить ленту, и установив флажок на вкладке Разработчик.

VBA, Excel и объекты

Этот раздел можно пропустить, если у вас уже есть опыт работы с объектами в среде Excel VBA.

В среде VBA приложение Excel представляет объекты, к которым можно получить доступ, в виде объектной модели Excel. Основные объекты Excel:

  • Application – Приложение Excel.
  • Workbooks – коллекция всех книг, открытых в данный момент в приложении Excel. В общем случае коллекция – набор объектов. В этом случае коллекция Workbooks представляет собой набор отдельных объектов Workbook.
  • Workbook – одна книга.
  • Worksheets – коллекция всех листов в рабочей книге.
  • Worksheet – отдельный рабочий лист или вкладка в рабочей книге.
  • Cells – совокупность всех ячеек на листе.
  • Range – набор из одной или нескольких ячеек на одном листе. Клетки могут быть прерывистыми. Любая ссылка даже на одну ячейку является объектом Range.

Объекты имеют свойства. Каждый объект принадлежит родительскому объекту. Например, родителем объекта Workbook является объект Application, а родителем объекта Cell – объект Worksheet. Одним из исключений является объект Application, который не имеет родителя; это объект самого высокого уровня, доступный при просмотре объектной модели Excel. При описании контекста объекта или метода часто используются следующие термины:

  • Parent – родительский объект. Например, родительский объект для Cell – это Worksheet.
  • Member – член родительского объекта. Например, член объекта Worksheet – объект Cell. Член также может быть методом, который выполняет действие.

Когда вы ссылаетесь на объект, вы должны начать с самого высокого уровня. Чтобы найти каждый подчиненный объект, введите родительский объект, за которым следует точка, а затем дочерний элемент. Например, чтобы сослаться на значение ячейки A1 на листе Sheet1 в книге My Workbook.xlsx, используйте следующий синтаксис:

Application.Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»).Cells(1,1).Value

Ссылки в VBA как правило используют синтаксис R1C1, а не А1.

Объектная модель Excel предоставляет объекты по умолчанию в зависимости от того, какой элемент приложения в данный момент активен. Например, следующий синтаксис ссылается на ячейку A1 на листе, активном в момент выполнения кода:

Хотя этот синтаксис работает, он не считается хорошей практикой. Мы рекомендуем использовать объект ActiveSheet, если вы действительно намеревались ссылаться на активный лист:

Application.ActiveSheet.Cells(1,1).Value

Единственный объект, который подразумевается во всей среде Excel VBA, – это объект Application, и его можно без проблем опустить. Поэтому следующие ссылки не являются неоднозначными в любом месте среды Excel VBA:

Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»).Cells(1,1).Value

ActiveSheet.Cells(1,1).Value

Вы можете назначить ссылку на любой объект переменной, если эта переменная имеет тот же тип, что и объект, или определена как универсальный тип объекта. Основная причина для этого – удобство. Если вы ссылаетесь на объект повторно, то выделение переменной для ссылки на этот объект может привести к уменьшению объема кода, который будет легче читать и поддерживать. Например, вы можете назначить ссылку на Sheet1 переменной:

Dim TargetWorksheet As Worksheet

Set TargetWorksheet = Workbooks(«My Workbook.xlsm»).Worksheets(«Sheet1»)

Теперь ссылка на А1 может быть записана в виде:

TargetWorksheet.Cells(1,1).Value

Ключевое слово Set присваивает ссылку. VBA требует использования ключевого слова Set при назначении ссылок на объекты. Кроме того, переменная является ссылкой на объект, а не копией объекта. Вы можете иметь любое количество переменных, содержащих ссылку на один и тот же экземпляр объекта.

Следует различать объекты, экземпляры объектов и ссылки на объекты. Объект включает в себя объектную модель (свойства и методы, которые ему принадлежат) и код, который управляет его поведением. Примером объекта является Worksheet. Экземпляр объекта является конкретным экземпляром этого объекта и включает в себя данные и значения свойств, связанные с этим экземпляром объекта. Листы Sheet1 и Sheet2 примеры экземпляров объектов. Переменная, ссылающаяся на объект, содержит ссылку на объект.

При определении переменных, ссылающихся на объекты, необходимо определить переменную того же типа, что и объект, на который ссылаются, или присвоить универсальный тип объекта. В общем случае универсальный тип объекта следует использовать только в том случае, если этой переменной будут присвоены ссылки на другие объекты различных типов; при использовании универсального типа объекта редактор VBA не может помочь вам с интеллектуальной подсказкой IntelliSense (IntelliSense представляет список свойств и методов объекта при вводе ссылки на объект, за которой следует точка.)

В дальнейшем описании мы используем следующие объекты:

  • ThisWorkbook – рабочая книга, в которой выполняется код. Это удобно, когда единственная книга, на которую ссылаются, является той, в которой находится код. С этой рабочей книгой работать легче, чем с рабочими книгами (My Workbook.xlsm), особенно когда имя рабочей книги может меняться.
  • Me – когда код находится в модуле кода листа, Me – это удобный способ ссылаться на объект листа, в котором находится код.

Excel Online открывает файлы с VBA (при просмотре в браузере), но не выполняет код. Код игнорируется при открытии книги в приложении Excel Online, но сам код сохраняется.

Объект ListObject

Excel использует объект ListObject для представления таблицы в объектной модели Excel. Он содержится в коллекции ListObjects, которая принадлежит объекту Worksheet. Используйте этот синтаксис для ссылки на Таблицу на листе:

ThisWorkbook.Worksheets(«Sheet1»).ListObjects(«Table1»)

Назовите Таблицу как-то иначе, чем имя по умолчанию. Это поможет вам как при написании кода, так и позже, когда вы смотрите на свой код, пытаясь понять, что вы сделали. Это также будет полезно для других пользователей, которые будут изучать ваш код.

Поскольку ListObjects – это набор таблиц, вы можете получить доступ к конкретной Таблице с помощью индекса:

ThisWorkbook.Worksheets(«Sheet1»).ListObjects(1)

Индекс (или позиция) объекта ListObject в коллекции ListObjects определяется порядком, в котором объекты ListObject были созданы на листе. Объект ListObject может быть назначен переменной, которая была определена как тип ListObject. Объект ListObject имеет ряд свойств и методов, используемых для доступа к таблицам и управления ими.

Свойства объекта Таблица

Пять свойств представляют собой основные части таблицы. Каждое из этих свойств является объектом диапазона Range. Два дополнительных свойства или коллекции предоставляют доступ к строкам и столбцам Таблицы. Каждая коллекция предоставляет доступ ко всем объектам ListRow и ListColumn в Таблице.

Свойство Range

Свойство Range возвращает всю таблицу, включая заголовок и итоговые строки. Тип объекта – Range. Свойство не может быть установлено.

Свойство HeaderRowRange

Свойство HeaderRowRange возвращает строку заголовка таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон всегда представляет собой одну строку – строку заголовка – и распространяется на все столбцы таблицы. Если строка заголовка отключена, этому свойству присваивается значение Nothing.

Свойство DataBodyRange

Свойство DataBodyRange возвращает тело таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон – это каждая строка между заголовком и общей строкой и распространяется на все столбцы таблицы. Если таблица не содержит строк, свойство DataBodyRange не возвращает Nothing (и ListRows.Count возвращает 0). Это единственный случай, когда свойство InsertRowRange возвращает объект диапазона, который можно использовать для вставки новой строки. В этом состоянии таблица выглядит как одна строка без каких-либо значений. Как только одна ячейка в таблице получает значение, InsertRowRange получает значение Nothing, а DataBodyRange – значение строк данных в таблице.

Свойство TotalRowRange

Свойство TotalRowRange возвращает итоговую строку Таблицы. Тип объекта – Range. Свойство не может быть установлено. Диапазон всегда представляет собой одну строку – строку итогов – и распространяется на все столбцы Таблицы. Если строка итогов отключена, это свойство имеет значение Nothing.

Свойство InsertRowRange

Свойство InsertRowRange возвращает текущую строку вставки Таблицы. Тип объекта – Range. Свойство не может быть установлено. В Excel 2007 и более поздних версиях InsertRowRange возвращает только первую строку данных и только тогда, когда таблица не содержит никаких данных. В противном случае он ничего не возвращает и фактически бесполезен.

Свойство ListRows

Свойство ListRows возвращает коллекцию всех строк в таблице DataBodyRange. Это тип объекта ListRows, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов ListRow. Свойство не может быть установлено. На строки ссылаются по индексу, отсчитываемому от единицы (one-based index).[1] В пустой таблице нет строк. Метод Add объекта ListRows используется для вставки одной новой строки за один раз.

Свойство ListColumns

Свойство ListColumns возвращает коллекцию всех столбцов таблицы. Это тип объекта ListColumns, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов ListColumn. Свойство не может быть установлено. На столбцы ссылается one-based. Таблица всегда содержит хотя бы один столбец.

Свойства структуры Таблиц

Таких свойств несколько. Все они являются членами объекта ListObject.

Свойство ShowAutoFilter возвращает или задает, включен ли Автофильтр. Свойство имеет логический тип. Если значение True, Автофильтр включен, False – отключен. Свойство представлено в пользовательском интерфейсе Excel, меню Данные –> Сортировка и фильтр –> Фильтр.

Свойство ShowAutoFilterDropDown возвращает или задает значение, указывающее отображается ли кнопка ниспадающего списка Автофильтра. Свойство имеет логический тип. Если значение True, кнопка отражается, False – не отражается. Если ShowAutoFilter имеет значение False, то свойство ShowAutoFilterDropDown изменить нельзя. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Кнопка фильтра.

Свойство ShowHeaders возвращает или задает, включена ли строка заголовка таблицы. Свойство имеет логический тип. Если значение True, строка заголовка таблицы включена, False – отключена. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Строка заголовков.

Свойство ShowTotals возвращает или задает включена ли строка итогов. Свойство имеет логический тип. Если значение True, строка итогов включена, False – отключена. Свойство представлено в пользовательском интерфейсе Excel, меню Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Строка итогов.

Свойства стилей Таблиц

Этих свойств также несколько. Все они являются членами объекта ListObject.

Свойство TableStyle возвращает или задает имя стиля таблицы. Свойство имеет тип Variant. Чтобы изменить стиль таблицы, необходимо задать имя нужного стиля. При назначении стиля таблицы к таблице применяются только элементы стиля, определенные в этом стиле (подробнее см. Глава 7. Форматирование Таблиц Excel). Чтобы определить имя стиля, наведите курсор мыши на нужный стиль в галерее стилей таблиц, пока Excel не отобразит имя этого стиля:

Ris. 9.2. Opredelenie imeni stilya tablitsy

Рис. 9.2. Определение имени стиля таблицы

Чтобы присвоить это имя свойству TableStyle, используйте код:

ActiveSheet.ListObjects(«qryCrosstab2»).TableStyle = «TableStyleLight21»

Здесь qryCrosstab2 – имя Таблицы. Внутренние имена всех встроенных стилей не содержат пробелов и английские, хотя имена, отображаемые на ленте, содержат пробелы и русифицированы. Чтобы узнать имя таблицы, которое нужно использовать в коде VBA, запустите запись макроса, присвойте стиль, завершите запись макроса, и посмотрите его код.

Свойство TableStyle представлено в пользовательском интерфейсе Excel в виде массива кнопок в группе Работа с таблицами –> Конструктор –> Стили таблиц.

Свойство ShowTableStyleColumnStripes возвращает или задает, форматируются ли нечетные столбцы таблицы иначе, чем четные столбцы. Свойство имеет логический тип. Если значение True, нечетные столбцы таблицы форматируются иначе, чем четные столбцы, как определено в заданном стиле таблицы. Нечетные столбцы форматируются с использованием параметров полосы первого столбца стиля таблицы, а четные строки форматируются с использованием параметров полосы второго столбца стиля таблицы. Если ShowTableStyleColumnStripes имеет значение False, столбцы таблицы не форматируются с использованием назначенного стиля таблицы. Свойство ShowTableStyleColumnStripes представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Чередующиеся столбцы.

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

Свойство ShowTableStyleRowStripes возвращает или задает, форматируются ли нечетные строки таблицы иначе, чем четные строки. Свойство имеет логический тип. Если значение True, нечетные строки таблицы форматируются иначе, чем четные строки, как определено в заданном стиле таблицы. Нечетные строки форматируются с использованием первой полосы строк стиля таблицы, а четные строки форматируются с использованием второй полосы строк стиля таблицы. Если свойству ShowTableStyleRowStripes присвоено значение False, строки таблицы не форматируются с использованием назначенного стиля таблицы. Это свойство эквивалентно флажку на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Чередующиеся строки.

Свойство ShowTableStyleFirstColumn возвращает или задает, выделяется ли первый столбец. Свойство имеет логический тип. Если значение True, первый столбец таблицы форматируется так, как определено в настройках первого столбца назначенного стиля таблицы. Если установлено значение False, первый столбец таблицы не форматируется в соответствии с заданным стилем таблицы. Это свойство представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Первый столбец.

Свойство ShowTableStyleLastColumn возвращает или задает, выделяется ли последний столбец. Свойство имеет логический тип. Если значение True, последний столбец таблицы форматируется так, как определено в настройках последнего столбца назначенного стиля таблицы. Если установлено значение False, последний столбец таблицы не форматируется в соответствии с заданным стилем таблицы. Это свойство представлено в пользовательском интерфейсе Excel в виде флажка на ленте Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Последний столбец.

Другие свойства объекта Таблицы

В следующих разделах рассматриваются свойства объекта таблицы для использования в VBA. Они отличаются от методов.

Свойство Active возвращает True, если активная ячейка находится в пределах таблицы, включая заголовок и итоговые строки; в противном случае оно возвращает False. Свойство имеет логический тип. Свойство не может быть установлено.

Свойство AlternativeText возвращает или задает замещающий текст таблицы. Свойство имеет строковый тип. Установка этого свойства перезаписывает любое предыдущее значение. Это свойство представлено в пользовательском интерфейсе Excel в диалоговом окне Замещающий текст, доступ к которому можно получить, щелкнув правой кнопкой мыши в любом месте таблицы и пройдя по меню Таблица –> Замещающий текст. Это свойство отображается и редактируется в текстовом поле Заголовок.

Ris. 9.3. Zameshhayushhij tekst

Рис. 9.3. Замещающий текст

Свойство AutoFilter – это объект AutoFilter со своими собственными свойствами и методами. Его можно использовать для проверки настроек Автофильтра и повторного применения или очистки настроек Автофильтра в таблице. Он не используется для установки фильтров; для этого используется метод AutoFilter объекта Range.

Свойство Comment возвращает или задает комментарий таблицы. Свойство имеет строковый тип. Это свойство, добавленное в Excel 2007, представлено в пользовательском интерфейсе Excel в диалоговом окне Диспетчер имен, доступ к которому можно получить, пройдя по меню Формулы –> Определенные имена –> Диспетчер имен. Комментарий (примечание) отображается в правом столбце, и вы можете изменить его, кликнув на кнопку Изменить (рис. 9.4). Напомним, поскольку все Таблицы именуются, их имена отражаются в окне Диспетчер имен.

Ris. 9.4. Dispetcher imen

Рис. 9.4. Диспетчер имен

Свойство DisplayName возвращает или задает имя таблицы. Свойство имеет строковый тип. При назначении имени применяются те же ограничения, что и при изменении имени таблицы в пользовательском интерфейсе Excel; например, оно не может дублировать иное имя и не может содержать пробелов. Это свойство, добавленное в Excel 2007, ведет себя почти так же, как и свойство Name, но при использовании свойства DisplayName присваиваемое имя должно соответствовать ограничениям на имя таблицы, иначе возникает ошибка. Это свойство представлено в пользовательском интерфейсе Excel в виде поля ввода текста Работа с таблицами –> Конструктор –> Свойства –> Имя таблицы.

Свойство Name возвращает или задает имя таблицы. Свойство имеет строковый тип. В отличие от свойства DisplayName, когда вы присваиваете значение свойству Name, Excel изменяет имя так, чтобы оно соответствовало правилам имени таблицы. Например, он меняет пробелы на подчеркивания и, если имя уже существует, добавляет к нему символ подчеркивания, за которым следует число. Это свойство представлено в пользовательском интерфейсе Excel в виде поля ввода текста Работа с таблицами –> Конструктор –> Свойства –> Имя таблицы.

Чтобы избежать проблем, используйте свойство DisplayName вместо свойства Name для присвоения имени таблице. Свойство DisplayName создает ошибку, если имя является незаконным или уже определено в другом месте. С другой стороны, Excel будет искажать значение, присвоенное свойству Name, чтобы сделать его законным, и таким образом имя может оказаться не совсем тем, что вы намеревались.

Свойство Parent возвращает родителя таблицы. Свойство имеет тип объекта и всегда возвращает Worksheet. Свойство не может быть установлено.

Свойство QueryTable возвращает объект QueryTable, который ссылается на сервер списков. Это тип объекта QueryTable. Свойство не может быть установлено. Объект QueryTable предоставляет свойства и методы, позволяющие управлять таблицей. Следующий код публикует Таблицу на сервере SharePoint и называет опубликованный список Register. Затем он восстанавливает объект QueryTable для таблицы и устанавливает свойству MaintainConnection Таблицы значение True:

Dim Table As ListObject

Dim QueryTable As QueryTable

Dim PublishTarget(4) As String

Dim ConnectionString As String

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

PublishTarget(0) = «0»

PublishTarget(1) = «http://myserver/myproject»

PublishTarget(2) = «1»

PublishTarget(3) = «Register»

ConnectionString = Table.Publish(PublishTarget, True)

Set QueryTable = Table.QueryTable QueryTable.MaintainConnection = True

Свойство SharePointURL возвращает URL-адрес списка SharePoint. Свойство имеет строковый тип. Это свойство устанавливается при создании или обслуживании подключения к SharePoint и не может быть изменено. Это свойство представлено в пользовательском интерфейсе Excel в виде кнопки Работа с таблицами –> Конструктор –> Данные из внешней таблицы –> Экспорт –>  Экспорт таблицы в список SharePoint. Следующий код публикует существующую таблицу на сервере SharePoint с помощью SharePointURL и называет опубликованный список Register:

Dim Table As ListObject

Dim QueryTable As QueryTable

Dim PublishTarget(4) As String

Dim ConnectionString As String

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

PublishTarget(0) = «0»

PublishTarget(1) = Table.SharePointURL PublishTarget(2) = «1»

PublishTarget(3) = «Register»

ConnectionString = Table.Publish(PublishTarget, True)

Свойство Slicers возвращает коллекцию срезов, связанных с таблицей. Свойство имеет тип Slicers, который ведет себя очень похоже на объект Collection и содержит коллекцию объектов Slicer. Свойство не может быть установлено. Объект Slicers используется для добавления, управления и удаления срезов, связанных с таблицей. Каждый объект среза предоставляет свойства и методы, которые позволяют управлять срезом. Свойства срезов была добавлена в объект ListObject в Excel 2013.

В следующем примере срез добавляется и помещается на том же листе, что и Таблица. Чтобы добавить срез сначала нужно создать объект SlicerCache для каждого среза:

Dim Table As ListObject

Dim SlicerCache As SlicerCache

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set SlicerCache = ThisWorkbook.SlicerCaches.Add(Table, «Category»)

SlicerCache.RequireManualUpdate = False

Set Slicer = SlicerCache.Slicers.Add(Table.Parent, , _

   «tblRegisterCategory», «Category», 100, 400)

Объект SlicerCache привязан к таблице и фильтруемому столбцу. Сам срез является визуальным представлением кэша среза и имеет родителя, имя, заголовок и позицию; он также имеет размер, но в приведенном выше примере используется размер по умолчанию. Свойство RequireManualUpdate объекта SlicerCache имеет значение False, чтобы избежать появления в срезе сообщения Устарело.

Следующий срез настроен на отображение категории Расходы (Expense) и скрытие категории Доходы (Income):

Dim Table As ListObject

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

With Slicer.SlicerCache

   .SlicerItems(«Expense»).Selected = True

   .SlicerItems(«Income»).Selected = False

End With

Следующий срез настроен для отображения только одной категории:

Dim Table As ListObject

Dim Slicer As Slicer

Dim SlicerItem As SlicerItem

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

With Slicer.SlicerCache

   .ClearManualFilter

   For Each SlicerItem In .SlicerItems

      If SlicerItem.Name <> «Expense» Then

         SlicerItem.Selected = False

      End If

   Next SlicerItem

End Wit

В следующем примере происходит очистка фильтр среза:

Dim Table As ListObject

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

Slicer.SlicerCache.ClearManualFilter

В следующем примере срез удаляется. Обратите внимание, что кэш среза также удаляется:

Dim Table As ListObject

Dim Slicer As Slicer

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set Slicer = Table.Slicers(«tblRegisterCategory»)

Slicer.Delete

Table.ShowAutoFilter = False

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

Свойство Sort возвращает объект сортировки таблицы. Свойство имеет тип Sort object. Свойство не может быть установлено. В следующем примере Таблица сортируется по дате и описанию:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

With Table

   .Sort.SortFields.Add .ListColumns(«Date»).DataBodyRange,_

      xlSortOnValues, xlAscending

   .Sort.SortFields.Add .ListColumns(«Description»)._

      DataBodyRange, xlSortOnValues, xlAscending

   .Sort.Apply

   .Sort.SortFields.Clear

End With

На защищенном листе невозможно выполнить сортировку Таблицы, если не будут разблокированы все ячейки в заголовке таблицы и теле данных. Или снимите защиту со всего листа, выполните сортировку, и затем снова защитите лист.

Свойство SourceType возвращает текущий источник таблицы. Свойство имеет тип XlListObjectSourceType. Свойство не может быть установлено. Свойство может принимать следующие константы:

  • xlSrcExternal или 0 – источник является внешним источником данных, таким как сайт Microsoft SharePoint.
  • xlSrcModel или 4 – источником является модель Power Pivot.
  • xlSrcQuery или 3 – источником является запрос Power Query.
  • xlSrcRange или 1 – источником является объект Range.
  • xlSrcXml или 2 – источником является XML.

Свойство Summary возвращает или задает текст, используемый для замещающего текста при публикации таблицы. Свойство имеет строковый тип, введенный в Excel 2010. Установка этого свойства перезаписывает любое предыдущее значение. Это свойство представлено в пользовательском интерфейсе Excel в диалоговом окне Замещающий текст, доступ к которому можно получить, щелкнув правой кнопкой мыши в любом месте Таблицы и выбрав Таблица –> Замещающий текст (см. рис. 9.3). Это свойство отображается и редактируется в текстовом поле Описание.

Свойство TableObject возвращает объект TableObject Таблицы. Свойство имеет тип объекта TableObject. Свойство не может быть установлено. Объект TableObject предоставляет свойства и методы, позволяющие управлять объектами таблицы. TableObject – это объект, построенный на основе данных, полученных из модели Power Pivot. Он был введен в Excel 2013.

Свойство XmlMap возвращает объект XmlMap Таблицы, который предоставляет карту XML Таблицы. Свойство имеет тип объекта XmlMap. Объект XmlMap предоставляет свойства и методы, позволяющие управлять XML-картой. Свойство не может быть установлено.

Другие свойства Таблиц

Свойство ListColumn – это элемент в свойстве или коллекции ListColumns. ListColumn – это объект с рядом полезных свойств, включая следующие:

  • Range – ссылки на ячейки в столбце, включая заголовок и итоговые строки, если они включены.
  • DataBodyRange – тип объекта Range, который ссылается на столбец, исключая строки заголовка и итогов. Это пересечение диапазонов, представленных свойством Range объекта ListObject и диапазоном DataBodyRange объекта ListObject.
  • Index – относительный номер индекса столбца, представленного объектом ListColumn.
  • Parent – объект ListObject, которому принадлежит столбец.

ListColumn также включает метод Delete – удаляет столбец из Таблицы.

Каждый объект ListRow в коллекции строк имеет три часто используемых свойства: Range, которое ссылается на ячейки в этой строке; Index, которое является относительным номером индекса этой строки, и Parent, которое ссылается на объект ListObject, содержащий строку. Объект ListRow также имеет один метод Delete, который удаляет строку из таблицы.

Методы объекта Таблицы

Метод Delete удаляет Таблицу, включая все ее значения, формулы и форматирование. Не путайте этот метод с методом Unlist, который преобразует таблицу в обычный диапазон ячеек.

Метод ExportToVisio экспортирует и открывает в Visio динамическую сводную диаграмму в новом документе. Этот метод был добавлен в Excel 2007. Ошибка возникает, если Visio не установлен у вас на ПК (см. также Глава 3. Работа с таблицами Excel).

Метод Publish публикует таблицу в службе SharePoint. Он возвращает URL-адрес опубликованного списка в SharePoint в виде строки:

expression.Publish(Target, LinkSource)

где: expression – переменная, представляющая объект ListObject; Target – одномерный массив типа Variant, содержащий два или три элемента: URL-адрес SharePoint server, отображаемое имя списка и, при необходимости, описание списка; LinkSource – логическое значение. Если оно равно True, создает новую ссылку на новый список SharePoint. Если False, хранит ссылку на текущий список SharePoint и заменяет этот список, или, если нет никакого текущего списка, создает новый список на SharePoint без ссылок на него.

Метод Refresh обновляет таблицу из внешнего источника, если Таблица имеет такую связь. Если Таблица не связана с внешним источником данных, возвращает ошибку. Все изменения, внесенные в таблицу после последнего обновления, будут потеряны.

Метод Resize изменяет диапазон Таблицы на указанный диапазон. Метод принимает один параметр Range, который определяет новый диапазон Таблицы. Если строка заголовка включена, новый диапазон должен включать по крайней мере одну ячейку строки заголовка. Если строка заголовка отключена, новый диапазон должен содержать по крайней мере одну ячейку в первой строке диапазона тела данных. Столбцы можно добавлять и удалять с обоих концов, а строки можно добавлять и удалять только снизу. При удалении строк и столбцов все существующие данные в удаленных строках и столбцах остаются, но теперь находятся вне Таблицы. При добавлении строк и столбцов в Таблицу добавляются любые данные из дополнительных ячеек. После изменения размера структурированные ссылки в формулах в ячейках, отсутствующих в Таблице, преобразуются в абсолютные стандартные ссылки на ячейки. Если Таблица связана со списком SharePoint, можно добавлять и удалять только строки. Попытка добавить или удалить столбцы в связанной таблице приводит к ошибке.

Метод Unlink удаляет любую внешнюю ссылку на данные, если она существует.

Метод Unlist преобразует Таблицу в обычный диапазон ячеек. В интерфейсе Excel это эквивалентно команде Работа с таблицами –> Конструктор –> Параметры стилей таблицы –> Инструменты –> Преобразовать в диапазон.

Другие методы

Метод Add объекта ListObject добавляет новую таблицу, используя существующий список данных или другой источник. При использовании существующего заголовка числовые значения преобразуются в текст, а все повторяющиеся заголовки становятся уникальными путем добавления целых значений. Вот синтаксис этого метода:

expression.Add(SourceType, Source, LinkSource, _

   XlListObjectHasHeaders, Destination, TableStyleName)

где:

  • expression – переменная, представляющая объект ListObjects,
  • SourceType – передает константу XlListObjectSourceType, которая определяет тип источника, используемого для создания Таблицы. Необязательный параметр. Если опущен, предполагается xlSrcRange.
  • Source – если SourceType = xlSrcRange, то передайте объект Range, представляющий диапазон значений данных для преобразования в Таблицу. Необязательный параметр. Если опущен, используется текущий выбор. Если SourceType = xlSrcExternal, передайте массив строковых значений, указывающих соединение с источником, где элементы массива: 0 – URL-адрес сайта SharePoint, 1 – имя списка SharePoint, 2 – код представления GUID (уникальный шестнадцатеричный идентификатор представления),
  • LinkSource – логическое значение, указывающее, должен ли внешний источник данных быть связан с объектом ListObject. Если SourceType имеет значение xlSrcExternal, то значение по умолчанию равно True, и этот параметр не требуется передавать. Если значение передается и SourceType является xlSrcRange, генерируется ошибка.
  • XlListObjectHasHeaders – передает тип константы xlYesNoGuess, которая может принимать три значения: xlYes, xlNo или xlGuess. Константа указывает, имеют ли импортируемые данные метки столбцов. Если источник не содержит заголовков, Excel автоматически создает заголовки. Необязательный параметр. Если опущено, значение по умолчанию = xlGuess. Имя этого параметра должно было быть HasHeaders, но, когда метод был реализован, разработчики ошибочно использовали XlListObjectHasHeaders.
  • Destination – передает объект Range, который указывает ссылку на одну ячейку в качестве назначения для верхнего левого угла Таблицы. Ошибка генерируется, если диапазон относится к нескольким ячейкам. Этот параметр должен быть указан, если SourceType = xlSrcExternal. Он игнорируется, если SourceType имеет значение xlSrcRange. Диапазон назначения должен находиться на листе, содержащем коллекцию ListObjects, указанную в expression. Столбцы вставляются перед целевым диапазоном, чтобы соответствовать новому списку, предотвращая перезапись существующих данных. Необязательный параметр.
  • TableStyleName – передает имя стиля, который будет применен к Таблице. Необязательный параметр. Если опущен, применяется стиль по умолчанию.

Метод Add объекта ListRows вставляет одну новую строку в таблицу в указанной позиции. Вот синтаксис этого метода:

expression.Add(Position, AlwaysInsert)

где:

  • expression – переменная, представляющая объект ListRows.
  • Position – целое число, определяющее относительное положение новой строки. Новая строка вставляется над текущей строкой в этой позиции. Необязательный параметр. Если опущен, новая строка добавляется в нижнюю часть Таблицы.
  • AlwaysInsert – логическое значение, указывающее, следует ли всегда сдвигать данные в ячейках под последней строкой таблицы при вставке новой строки, независимо от того, является ли строка под таблицей пустой. При значении True ячейки под таблицей сдвигаются на одну строку вниз. При значении False, если строка под Таблицей пуста, Таблица расширяется, чтобы занять (добавить) эту строку без сдвига ячеек под ней; если строка под Таблицей содержит данные, эти ячейки сдвигаются вниз при вставке новой строки.

Метод Add возвращает объект ListRow, представляющий новую строку.

Метод Delete объекта ListRow удаляет строку Таблицы, представленную объектом ListRow.

Метод Add объекта ListColumns вставляет один новый столбец в Таблицу в указанной позиции:

  • expression – переменная, представляющая объект ListColumns.
  • Position – целое число, определяющее относительное положение нового столбца. Новый столбец вставляется перед текущим столбцом в этой позиции. Необязательный параметр. Если этот параметр опущен, новый столбец добавляется в правую часть Таблицы.

Этот метод возвращает объект ListColumn, представляющий новый столбец.

Метод Delete объекта ListColumn удаляет столбец Таблицы, представленный объектом ListColumn.

Метод Автофильтр объекта Range

Метод позволяет создать критерии Автофильтра для столбца, очистить критерии Автофильтра или переключить статус Автофильтра:

expression.AutoFilter(Field, Criteria1, Operator, _

   Criteria2, VisibleDropDown)

где:

  • expression – выражение, возвращающее объект Range.
  • Field – целочисленное смещение поля, на котором будет основан фильтр, где крайнее левое поле = 1. Необязательный параметр. Если опущен, то состояние Автофильтра (включено/выключено) переключается для всего диапазона. Отключение Автофильтра удаляет раскрывающиеся элементы управления Автофильтра.
  • Criteria1 – критерий в виде числа, строки или массива, например, 20 или "Расход". Можно использовать знаки равенства = и неравенства <>. Чтобы найти несколько строк, используйте функцию Array со значением оператора xlFilterValues, например, Array("Значение 1", "Значение 2"). Подстановочные знаки * (один или несколько символов) и ? (можно использовать любой отдельный символ). Если оператор xlTop10Items, то Criteria1 задает число элементов, например 10. Когда оператор xlFilterDynamic, Criteria1 – это константа xlDynamicFilterCriteria (описана ниже). Необязательный параметр. Если опущен, критерии для столбца очищаются.
  • Operator – передает константу XlAutoFilterOperator, определяющую тип фильтра. Необязательный параметр. Если опущен, то принимается равным 0, и Crtiteria1 рассматривается как простое значение для поиска; в этом случае, если в Crtiteria1 передается массив значений, то используется только последнее значение. Если этот параметр опущен, а Crtiteria1 не указан, то Автофильтр для указанного столбца будет очищен.
  • Criteria2 – второй критерий в виде числа, строки или массива. Он используется с Crtiteria1 и Operator для построения составных критериев или когда Operator = xlFilterValues, а фильтруются дата и время (описано ниже). Необязательный параметр.
  • VisibleDropDown – передает True, чтобы отобразить стрелку раскрывающегося списка Автофильтра для отфильтрованного поля, и False, чтобы скрыть раскрывающийся список Автофильтра для отфильтрованного поля. Необязательный параметр. Если опущен, принимает значение True.

Если заданы критерии фильтрации, то возвращаемое значение является значением Field. При переключении статуса Автофильтра возвращается значение True.

Значения констант оператора XlAutoFilterOperator:

  • xIAnd или 1 – фильтры с логическим И для Criteria1 and Criteria Оба критерия являются строками, задающими условия, например, ">0" и "<100".
  • xlBottom10Items или 4 – находит отображаемые элементы с наименьшим значением, где число элементов задается как число или строка в Criteria1, например, 5 или "5", то есть пять наименьших элементов. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
  • xlBottom10Percent или 6 – найти отображаемые элементы с наименьшим значением, где процент указан как число или строка в Criteria1, например, 20 или "20" для элементов в нижних 20%. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
  • xlFilterCellColor или 8 – находит цвет ячейки, где цвет указан как значение RGB в Criteria
  • xlFilterDynamic или 11 – динамический фильтр, где критерий фильтра задается как значение XlDynamicFilterCriteria в Criteria Динамический фильтр – это фильтр, изменяющийся в зависимости от какого-либо другого значения, например сегодняшней даты или среднего значения в столбце.
  • xlFilterFontColor или 9 – находит цвет шрифта, где цвет указан как значение RGB в Criteria
  • xlFilterIcon или 10 – находит значок, указанный в Criteria Значки извлекаются из свойства ActiveWorkbookIconSets. Свойство IconSets представляет собой набор объектов IconSets, в котором каждый набор иконок представляет собой набор из ряда иконок, таких как набор "3 стрелки (цветные)" или "3 Arrows (Colored)". В приведенном ниже примере извлекается первый значок в наборе "3 стрелки (цветные)":

ActiveWorkbook.IconSets(xlIconSet.xl3Arrows).Item(1)

Обратите внимание, что при вводе в редакторе VBA "xlIconSet." (включая точку) появится всплывающий список IntelliSense со всеми доступными ссылками на набор значков.

  • xlFilterValues или 7 – находит несколько значений, заданных в виде массива в Criteria1 или Criteria Значения в массиве должны быть строковыми и точно соответствовать отображаемому значению, если оно числовое; например, если соответствующие значения отображаются как "$25.00", передаваемое значение должно быть"$25.00". Criteria2 используется при поиске дат и времени. При поиске дат и времен массив передается как массив пар значений, где первое значение каждой пары является типом поиска, а второе –датой. Типы поиска: 0 – находит элементы в том же году, что и следующее значение даты / времени; 1 – находит элементы в том же месяце, что и следующее значение даты / времени; 2 – находит элементы на ту же дату, что и следующее значение даты / времени; 3 – находит элементы в тот же час, что и следующее значение даты / времени; 4 – находит элементы в ту же минуту, что и следующее значение даты / времени; 5 – находит элементы в ту же секунду, что и следующее значение даты / времени.

Может быть передано любое количество пар типа поиска и значения даты / времени. Все значения типа поиска должны находиться в нечетных позициях в массиве (1, 3, 5 и т.д.), а все значения даты/времени должны быть в четных позициях (2, 4, 6 и т.д.). Любое значение, переданное для типа поиска, которого нет в приведенном выше списке, создает ошибку. Любое значение, переданное для значения даты/времени, которое не является значением даты/времени, создает ошибку. Допустимо любое значение даты/времени, которое может быть введено в ячейку и распознано как дата. Некоторые примеры значений Criteria2:

Показать все элементы в 2014 году: Array(0, "1/1/2014")

Показать все элементы в 2014 году, когда текущий год 2014: Array(0, "1/1")

Показать все элементы в январе 2014 года: Array(1, "1/1/2014")

Показать все элементы 15 января 2014 года: Array(2, "15/1/2014")

Показывать все элементы 15, 20 и 25 января 2014 года: Array(2, "15/1/2014", 2, "20/1/2014", 2, "25/1/2014")

Показать все элементы в 2013 году и в январе 2014 года: Array(0, "1/1/2013", 1, "1/1/2014")

Показать все элементы в в 3 часа дня 15 января 2014 года: Array(3, "15/1/2014 15:00") или Array(3, "15/1/2014 3 PM")

Показать все элементы в 15:01 15 января 2014 года: Array (3, "15/1/2014 15:01") или Array(3, "15/1/2014 3:01 PM")

  • xlOr или 2 – логическим ИЛИ для Criteria1 and Criteria Оба критерия – это строки, задающие условие, например "<0" и ">100" для значений меньше нуля или больше 100.
  • xlTop10Items или 3 – находит отображаемые элементы с наибольшим значением, где число элементов задается как число или строка в Criteria1, например 5 или "5", то есть пять самых больших элементов. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.
  • xlTop10Percent или 5 – находит отображаемые элементы с наибольшим значением, где процент указан как число или строка в Criteria1, например 20 или "20" для элементов в верхних 20%. Столбец, указанный в параметре Field, должен содержать хотя бы одно число, иначе произойдет ошибка.

Значения констант оператора XlDynamicFilterCriteria:

  • xlFilterToday – фильтрует все значения дат, равные сегодняшнему дню.
  • xlFilterYesterday – фильтрует все значения дат, равные вчерашнему дню.
  • xlFilterTomorrow – фильтрует все значения дат, равные завтрашнему дню.
  • xlFilterThisWeek – фильтрует все значения дат на текущей неделе.
  • xlFilterLastWeek – фильтрует все значения дат за предыдущую неделю.
  • xlFilterNextWeek – фильтрует все значения дат на следующей неделе.
  • xlFilterThisMonth – фильтрует все значения дат в текущем месяце.
  • xlFilterLastMonth – фильтрует все значения дат за предыдущий месяц.
  • xlFilterNextMonth – фильтрует все значения дат в следующем месяце.
  • xlFilterThisQuarter – фильтрует все значения дат в текущем квартале.
  • xlFilterLastQuarter – фильтрует все значения дат в предыдущем квартале.
  • xlFilterNextQuarter – фильтрует все значения дат в следующем квартале.
  • xlFilterThisYear – фильтрует все значения дат в текущем году.
  • xlFilterLastYear – фильтрует все значения дат за предыдущий год.
  • xlFilterNextYear – фильтрует все значения, относящиеся к следующему году.
  • xlFilterYearToDate – фильтрует все значения дат с начала года по сегодня.
  • xlFMterAMDatesInPeriodQuarterl – фильтрует все значения дат в квартале
  • xlFMterAMDatesInPeriodQuarter2 – фильтрует все значения дат в квартале 2.
  • xlFMterAMDatesInPeriodQuarter3 – фильтрует все значения дат в квартале 3.
  • xlFilterAllDatesInPeriodQuarter4 – фильтрует все значения дат в квартале 4.
  • xlFilterAllDatesInPeriodJanuary – фильтрует все значения дат в январе.
  • xlFilterANDatesInPeriodFebruary – фильтрует все значения дат в феврале.
  • xlFilterAllDatesInPeriodMarch – фильтрует все значения дат в марте.
  • xlFilterAllDatesInPeriodApril – фильтрует все значения дат в апреле.
  • xlFilterAllDatesInPeriodMay – фильтрует все значения дат в мае.
  • xlFilterAllDatesInPeriodJune – фильтрует все значения дат в июне.
  • xlFilterAllDatesInPeriodJuly – фильтрует все значения дат в июле.
  • xlFilterAllDatesInPeriodAugust – фильтрует все значения дат в августе.
  • xlFilterAllDatesInPeriodSeptember – фильтрует все значения дат в сентябре.
  • xlFilterAllDatesInPeriodOctober – фильтрует все значения дат в октябре.
  • xlFilterAllDatesInPeriodNovember – фильтрует все значения дат в ноябре.
  • xlFilterAllDatesInPeriodDecember – фильтрует все значения дат в декабре.
  • xlFilterAboveAverage – фильтрует все значения выше среднего.
  • xlFilterBelowAverage – фильтрует все значения ниже среднего.

Доступ к элементам Таблицы

Хотя свойства ListObject, ListColumns, ListRows предоставляют доступ к основным частям таблицы, существуют и другие способы доступа к элементам таблицы с использованием синтаксиса структурированных ссылок, описанного в главе 4. Эти способы могут быть более удобными, в зависимости от стиля программирования и предпочтений. В приведенных ниже примерах предполагается, что есть Таблица с именем "tblRegister" на листе с именем "Register" с заголовками столбцов "Date", "Description", "Category" и "Amount":

Ris. 9.5. Tablitsa

Чтобы использовать структурированную ссылку, используйте объект Range для извлечения диапазона, описанного ссылкой. Объект Range является дочерним объектом многих объектов Excel, включая объекты Application и Worksheet. При использовании объекта Range с объектом Application ссылка должна иметь глобальную область действия. При использовании Range с Worksheet (или Sheet) ссылка может иметь глобальную или локальную (Worksheet) область.

Область действия имени определяет, откуда к нему можно получить доступ. Ссылка с глобальной областью действия может быть доступна из любого объекта. На ссылку с локальной областью действия можно ссылаться только из листа, на котором определена конкретная ссылка.

Имена таблиц определены глобально, то есть, вы можете получить к ним доступ из любого модуля кода, не уточняя ссылку на объект листа, в котором находится таблица. Например, следующие ссылки эквивалентны:

ThisWorkbook.Worksheets(«Register»).Range(«tblRegister[Date]»)

Application.Range(«tblRegister[Date]»)

Range(«tblRegister[Date]»)

[tblRegister[Date]]

Чтобы соответствовать этому правилу, Excel требует, чтобы каждая Таблица в книге имела уникальное имя. Это правило управляет всеми глобальными именами, а не только именами Таблиц.

Чтобы уменьшить вероятность коллизии имен, можно предварить все имена таблиц общим префиксом, часто называемым «венгерской нотацией», описанной в главе 2, например, "tbl".

Excel 2003 не поддерживает структурированные ссылки. Существуют также некоторые различия между Excel 2007, 2010 и 2013 с точки зрения поддержки структурированных ссылок.

Создание и присвоение имени Таблице

Таблицы создаются с помощью метода Add объекта ListObjects. После создания новой Таблицы свойству DisplayName объекта ListObject присваивается имя новой Таблицы. Имя Таблицы, присваиваемое по умолчанию, зависит от источника Таблицы: xlSrcRange (диапазон данных на листе), xlSrcExternal (внешний источник данных), xlSrcModel (модель данных Power Pivot) и xlSrcQuery (запрос). Тип источника xlSrcXml (источник XML) не рассматривается, но показаны обходные пути.

Использование диапазона данных

В этом примере создается новая таблица, использующая существующий диапазон данных с заголовками. Параметр SourceType имеет значение xlSrcRange:

Dim TableRange As Range

Dim Table As ListObject

Set TableRange = ThisWorkbook.Worksheets(«Register»). _

   Range(«A1»).CurrentRegion

Set Table = ThisWorkbook.Worksheets(«Register»). _

   ListObjects.Add(xlSrcRange, TableRange, ,xlYes)

Table.DisplayName = «tblRegister»

Обратите внимание, что четвертый параметр, xlYes, сообщает Excel, что список данных уже содержит заголовки. В этом примере Таблица будет названа сразу же после ее создания; это поможет вам найти объект ListObject позже.

Использование модели данных Power Pivot

В этом примере для создания соединения с базой данных SQL Server используется объект TableObject. Таблица SQL "Product" добавляется в модель данных Power Pivot. Таблица помещается на рабочий лист "Sheet1" в ячейку A1. Поскольку взаимодействие происходит с моделью данных, то вместо объекта ListObject с xlSrcModel, переданного для SourceType, должен использоваться объект TableObject. Измените текст "YourServerName" на имя нужного SQL-сервера. Используется база данных AdventureWorks2012:

Dim SQLConnection As WorkbookConnection

Dim TargetWorksheet As Worksheet

Dim Table As TableObject

Dim ConnectionString As String

Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1»)

ConnectionString = «OLEDB;Provider=SQLOLEDB.1; _

   Integrated Security=SSPI;» & «Initial Catalog _

   =AdventureWorks2012;Data Source=YourServerName»

Set SQLConnection = ActiveWorkbook.Connections.Add2(«FriendlyName», _

   «Description», ConnectionString, «Product», 3, True)

With TargetWorksheet

   Set Table = .ListObjects.Add(SourceType:=xlSrcModel, _

   Source:=SQLConnection, Destination:=.Range(«A1»)).NewTable

End With

Table.ListObject.DisplayName = «tblNewTable»

Константа xlSrcModel была добавлена в Excel 2013.

В следующем примере предполагается, что книга уже имеет соединение SQL Server с Таблицей в модели данных Power Pivot, и задача состоит в том, чтобы извлечь данные из таблицы модели данных в новую Таблицу Excel. Тип источника – xlSrcModel, и предполагается, что имя Таблицы модели данных – "Product". Этот пример работает только в Excel 2013:

Dim ModelSource As Model

Dim SourceTable As ModelTable

Dim TargetWorksheet As Worksheet

Dim Table As TableObject

Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1»)

Set ModelSource = ThisWorkbook.Model

Set SourceTable = ModelSource.ModelTables(«Product»)

Set Table = TargetWorksheet.ListObjects.Add(SourceType:=xlSrcModel, _

   Source:=SourceTable.SourceWorkbookConnection, _

   LinkSource:=True, Destination:=DestinationSheet.Range(«A1»)).TableObject

Table.Refresh

Использование запроса Power Query

В этом примере объект QueryTable используется для создания соединения с базой данных SQL Server. Таблица "Product" добавляется на лист "Sheet1" в ячейку А1. Измените текст "YourServerName" на имя нужного SQL-сервера. Используется база данных AdventureWorks2012:

Dim TargetWorksheet As Worksheet

Dim Table As QueryTable

Dim ConnectionString As String

Set TargetWorksheet = ThisWorkbook.Worksheets(«Sheet1»)

ConnectionString = «OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;» _

   & «Initial Catalog=AdventureWorks2012;Data Source=YourServerName»

Set Table = TargetWorksheet.ListObjects.Add(SourceType:=xlSrcExternal, _

   Source:=ConnectionString, LinkSource:=True, _

   Destination:=DestinationSheet.Range(«A1»)).QueryTable

Table.CommandText = Array(«»«AdventureWorks2012»«.»«Production»«.»«Product»«»)

Table.CommandType = xlCmdTable

Table.Refresh BackgroundQuery:=False

Table.ListObject.DisplayName = «tblNewTable»

Константа xlSrcQuery была добавлена в Excel 2007.

При использовании xlSrcExternal необходимо указать параметр назначения. При использовании объекта QueryTable необходимо задать свойства CommandText и CommandType перед обновлением соединения.

В этом примере используется тип источника xlSrcExternal, который используется для любого внешнего подключения к данным. Передача xlSrcQuery для параметра SourceType приводит к тому же результату. Как правило, xlSrcQuery используется для подключения к базе данных, а xlSrcExternal используется для подключения к SharePoint.

Использование источника XML

По замыслу, метод Add объекта ListObjects с типом источника xlSrcXml должен создать объект ListObject, используя в качестве источника XML-файл. Однако этот метод ненадежен, и нет известных рабочих примеров его использования. Для импорта исходного файла XML в Таблицу рекомендуется использовать два метода. Во-первых, необходимо импортировать XML-файл в новую пустую книгу:

Workbooks.OpenXML Filename:=«C:XML File Name.xml», _

   LoadOption:=xlXmlLoadImportToList

Во-вторых, необходимо импортировать XML-файл в существующий лист в указанном диапазоне.:

ActiveWorkbook.XmlImport URL:=«C:XML File Name.xml», _

   ImportMap:=Nothing, Overwrite:=True, _

   Destination:=Range(«A1»)

В этих примерах, если указанный источник XML не ссылается на схему, Excel создает ее на основе того, что он найдет в указанном XML-файле.

Информация о Таблице

В следующих примерах предполагается, что DataBodyRange является допустимым объектом диапазона. Если в Таблице нет существующих строк (то есть если ListRows.Count равно 0), любая ссылка на DataBodyRange вернет ошибку.

Определение того, существует ли таблица

Это не простая задача, так как имя таблицы, которой нет, может использоваться с коллекцией ListObjects. В следующем коде показано, как использовать обработку ошибок для определения того, существует ли таблица:

Dim Table As ListObject

Set Table = Nothing

On Error Resume Next

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

On Error GoTo 0

If Table Is Nothing Then

   Debug.Print «Table does not exist»

Else

   Debug.Print «Table exists»

End If

Зачем устанавливать объектную переменную равную Nothing, прежде чем пытаться присвоить ей значение? В приведенном выше случае это не обязательно, поскольку VBA инициализирует каждую переменную, когда она определена с помощью оператора Dim. Но он включен выше в качестве примера написания надежного кода, потому что, если возникает ошибка, переменная не трогается и, если она уже содержит ссылку на другой объект, следующий тест не даст желаемого результата.

Определение адреса таблицы

В следующем примере выводится адрес Таблицы и адрес DataBodyRange Таблицы:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Debug.Print «Table’s address: « & Table.Range.Address

Debug.Print «Table’s data body range address: « _

   & Table.DataBodyRange.Address

Определение количества строк

Количество строк в таблице определяется с помощью свойства Count объекта ListRows:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Debug.Print «Number of rows: « & Table.ListRows.Count

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

Определение количества столбцов

Количество столбцов в таблице определяется с помощью свойства Count объекта ListColumns:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Debug.Print «Number of columns: « & Table.ListColumns.Count

Определение того, существует ли столбец

Это также непростая задача. В следующем коде показано, как использовать обработку ошибок для определения того, существует ли столбец:

Dim Table As ListObject

Dim ListColumn As ListColumn

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set ListColumn = Nothing

On Error Resume Next

Set ListColumn = Table.ListColumns(«Description»)

On Error GoTo 0

If ListColumn Is Nothing Then

   Debug.Print «Column does not exist»

Else

   Debug.Print «Column exists»

End If

Добавление строк

Существует несколько способов добавления новых строк в Таблицу. Если вы добавляете одну строку, используйте метод Add объекта ListRows. Он возвращает объект ListRow, который затем можно использовать для добавления значений в эту новую строку:

Dim Table As ListObject

Dim NewRow As ListRow

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set NewRow = Table.ListRows.Add

With NewRow.Range

   .Columns(1).Value = #1/1/2015#

   .Columns(2).Value = «Transaction 20»

   .Columns(3).Value = «Expense»

   .Columns(4).Value = 75

End With

Обратите внимание, что в этом примере параметр Position не был передан методу Add, что привело к добавлению новой строки в конец таблицы. Чтобы вставить новую строку в определенную позицию таблицы, используйте параметр Position.

Чтобы добавить более одной строки в нижнюю часть таблицы, удобнее добавлять строки за один шаг, чем вызывать метод Add объекта ListRows несколько раз. В следующем примере строка итогов отключена, новые данные копируются в пустые ячейки непосредственно под Таблицей, после чего строка итогов включается. (Если функция TotalRow не отключена, Таблица не распознает новые строки и поэтому не расширяется для их включения.) Новые данные копируются из диапазона A2:D11 на листе Data:

Dim Table As ListObject

Dim NewValues As Variant

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

NewValues = ThisWorkbook.Worksheets(«Data»).Range(«A2:D11»).Value

Table.ShowTotals = False

With Table.DataBodyRange

   .Resize(10).Offset(.Rows.Count).Value = NewValues

End With

Table.ShowTotals = True

Чтобы вставить несколько строк в середину таблицы, используйте метод Insert объекта Range для вставки пустых ячеек, а затем эти ячейки заполняются новыми данными. В следующем примере 10 строк данных вставляются после существующей строки 2 (и перед строкой 3):

Dim Table As ListObject

Dim NewValues As Variant

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

NewValues = ThisWorkbook.Worksheets(«Data»).Range(«A2:D11»).Value

With Table.DataBodyRange

   .Resize(10).Offset(2).Insert Shift:=xlShiftDown

   .Resize(10).Offset(2).Value = NewValues

End With

Удаление строк

Метод, который вы используете, зависит от того, сколько строк вы хотите удалить.

Удаление одной строки

Для удаления одной строки используется метод Delete объекта ListRow:

Dim Table As ListObject

Dim ListRow as ListRow

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Set ListRow = Table.ListRows(3)

ListRow.Delete

Переменной ListRow присваивается третий объект ListRow в коллекции ListRows, а затем вызывается метод Delete объекта ListRow. Вот альтернативная, более короткая версия примера, которая не требует переменной ListRow:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.ListRows(3).Delete

Удаление нескольких строк

Удаление нескольких строк одновременно требует использования метода Delete объекта Range. В следующем примере удаляются 10 строк, начиная со строки 3:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.DataBodyRange.Resize(10).Offset(2).Delete

Удаление всех строк

В следующем примере удаляются все строки таблицы:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.DataBodyRange.Delete

В этом примере объекту DataBodyRange после завершения кода присваивается значение Nothing. Любые последующие ссылки на этот объект возвращают ошибку, если в Таблицу не добавлена хотя бы одна строка.

Циклы

В первом примере выполняется цикл по всем строкам Таблицы, добавляя в переменную TotalExpenses значения всех строк в столбце Expense (расходы) и выводя результат в окно Immediate:

Dim Table As ListObject

Dim ListRow As ListRow

Dim TotalExpenses As Double

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

For Each ListRow In Table.ListRows

   If ListRow.Range.Columns(3).Value = «Expense» Then

      TotalExpenses = TotalExpenses + ListRow.Range.Columns(4).Value

   End If

Next ListRow

Debug.Print «Total expenses: « & TotalExpenses

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

Dim Table As ListObject

Dim ListRow As ListRow

Dim TotalExpenses As Double

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

For Each ListRow In Table.ListRows

   If Intersect(ListRow.Range, Table.ListColumns(«Category»).Range) _

         .Value = «Expense» Then

      TotalExpenses = TotalExpenses + Intersect(ListRow.Range, Table.

      ListColumns(«Amount»).Range).Value

   End If

Next ListRow

Debug.Print «Total expenses: « & TotalExpenses

Во втором примере выполняется цикл по столбцам Таблицы, выводя имя каждого столбца на экран с помощью коллекции ListColumns и оператора For / Each:

Dim Table As ListObject

Dim ListColumn As ListColumn

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

For Each ListColumn In Table.ListColumns

   Debug.Print ListColumn.Name

Next ListColumn

Фильтрация

Одной из самых мощных особенностей Таблиц является их способность фильтровать строки. Объектная модель Excel предоставляет объект AutoFilter (дочерний элемент объекта ListObject) и метод AutoFilter (дочерний элемент объекта Range), что позволяет полностью контролировать процесс фильтрации в VBA. Используйте объект ListObject.AutoFilter для проверки текущих настроек Автофильтра, обновления Автофильтра и очистки Автофильтра. Используйте метод Range.AutoFilter для задания критериев Автофильтра.

Включение и выключение Автофильтра

Вы включаете и выключаете Автофильтр, задавая свойству ShowAutoFilter значения True (вкл.) и False (выкл.). В следующем примере показано, как включить Автофильтр:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.ShowAutoFilter = True

Поскольку Автофильтр – это объект, который не имеет значения при отключенном Автофильтре, любой код, ссылающийся на какие-либо свойства и методы объекта Автофильтра, будет генерировать ошибку, если Автофильтр отключен. Чтобы избежать ошибок, убедитесь, что Автофильтр включен, и получите доступ к свойствам и методам объекта Автофильтра только в этом случае. Примеры ниже показывают, как осуществить эту проверку.

Вы также можете включать и отключать Автофильтр, повторно вызывая метод Range.AutoFilter без каких-либо параметров. Использование этого метода просто переключает состояние Автофильтра.

Определение состояния фильтрации

Объект Автофильтр используется для определения того, включен ли Автофильтр:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Debug.Print «AutoFilter is on»

Else

   Debug.Print «AutoFilter is off»

End If

Если Автофильтр включен, вы используете свойство FilterMode объекта Автофильтра, чтобы определить, установлены ли критерии фильтрации:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   If Table.AutoFilter.FilterMode Then

      Debug.Print «Filtering is active»

   Else

      Debug.Print «Filtering is inactive»

   End If

Else

   Debug.Print «AutoFilter is off»

End If

Определение того, фильтруется ли столбец

Если Автофильтр включен, можно использовать свойство On объекта Filter, чтобы определить, имеет ли столбец активный критерий фильтра:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   If Table.AutoFilter.Filters(3).On Then

      Debug.Print «Column 3 is being filtered»

   End If

Else

   Debug.Print «AutoFilter is off»

End If

Создание фильтров

Вы создаете (применяете) фильтры по одному столбцу за раз. Для добавления и удаления критериев фильтрации используется метод AutoFilter объекта Range. При применении критерия Автофильтра строка заголовка включается автоматически. В примерах ниже предполагается, что Таблица не имеет активных критериев фильтрации: Ниже приведены примеры, каждый из которых начинается с этих двух строк кода. Предполагается, что Таблица не имеет активных критериев фильтрации:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

В следующем примере фильтруются строки со значением Expense в третьем столбце.:

Table.Range.AutoFilter Field:=3, Criteria1:=«Expense»

А здесь фильтруются строки с Expense или Income в третьем столбце.:

Table.Range.AutoFilter Field:=3, _

   Criteria1:=Array(«Expense», «Income»), Operator:=xlFilterValues

Ниже показаны только строки со значениями во втором столбце, которые начинаются с Transaction:

Table.Range.AutoFilter Field:=2, Criteria1:=«Transaction*»

Строки в четвертом столбце со значениями больше нуля:

Table.Range.AutoFilter Field:=4, Criteria1:=«>0»

Строки с Income в третьем столбце и значениями более 100 – в четвертом:

Table.Range.AutoFilter Field:=3, Criteria1:=«Income»

Table.Range.AutoFilter Field:=4, Criteria1:=«>100»

Повторное применение критериев активного фильтра

Видимость строк в отфильтрованной таблице может не совпадать с критериями фильтра при изменении данных и добавлении новых строк. Эту ситуацию можно исправить, повторно применив критерии активного фильтра:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Table.AutoFilter.ApplyFilter

End If

Очистка фильтра одного столбца

Вы можете очистить фильтр одного столбца, используя метод AutoFilter и указав только параметр Field. В следующем примере очищаются критерии фильтра третьего столбца:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

Table.Range.AutoFilter Field:=3

Очистка всех фильтров

Вы можете очистить критерии фильтрации для всех столбцов за один шаг, не отключая Автофильтр, вызвав метод ShowAllData:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Table.AutoFilter.ShowAllData

End If

Скрытие раскрывающихся элементов управления по столбцам

Вы можете скрыть раскрывающиеся элементы управления Автофильтра в определенных столбцах. В следующем примере показано, как скрыть раскрывающийся элемент управления AutoFilter во втором столбце Таблицы:

Dim Table As ListObject

Set Table = ThisWorkbook.Worksheets(«Register»).ListObjects(«tblRegister»)

If Table.ShowAutoFilter Then

   Table.Range.AutoFilter Field:=2, VisibleDropDown:=False

End If

Пользовательские процедуры

В следующих разделах приведены некоторые пользовательские процедуры. Более надежные версии этих программ и ряд других программ, а также полезные утилиты и библиотеки доступны по адресу http://exceltables.com/.

Делаем объемную вставку

Следующая функция вставляет массив значений в Таблицу и возвращает новые строки в виде диапазона. Если задана строка, то значения вставляются выше этой строки; в противном случае значения добавляются в нижнюю часть Таблицы. Функция также сопоставляет столбцы значений со столбцами Таблицы с помощью параметра ColumnAssignmentS. Дополнительные сведения о параметрах см. в комментариях к процедуре.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

Public Function BulkInsertIntoTable( _

      ByVal Table As ListObject, _

      ByVal Values As Variant, _

      Optional ByVal Position As Long = 1, _

      Optional ByVal ColumnAssignments As Variant _

   ) As Range

‘ Insert an array of values into a Table. Optionally specify the row before

which the new rows are inserted. Optionally specify how the columns are

‘ assigned. The new rows in the Table are returned as a Range.

Syntax

‘ BulkInsertIntoTable(Table, Values, Position, ColumnAssignments)

Table A Table object.

‘ Values — A single value, a single dimension array of values, or a two

dimension array of values.

‘ Position — The row number before which the new rows are inserted. Optional.

If omitted then the new rows are appended to the end of the Table.

‘ ColumnAssignments — A single dimension array of integer values specifying

which Table column receives what column of values in the Values parameter.

‘ Each element in the array is a column number in the Table. The position of

the element in the array corresponds to the column in the Values array.

‘ Optional. If omitted then the values are placed in column order starting in

the first Table column. For example, passing Array(2,3,1) results in this

‘ column mapping:

Values column 1 is placed in Table column 2.

‘ Values column 2 is placed in Table column 3.

Values column 3 is placed in Table column 1.

Dim Calculation As XlCalculation

Dim ScreenUpdating As Boolean

Dim Result As Long

Dim TwoDimensionArray As Boolean

Dim WorkArray As Variant

Dim Column As Long

Dim SourceColumn As Long

Dim TargetColumn As Long

Dim ShowTotals As Boolean

Dim InsertRange As Range

‘ Exit if no values to insert

If IsEmpty(Values) Then Exit Function

Calculation = Application.Calculation

Application.Calculation = xlCalculationManual

ScreenUpdating = Application.ScreenUpdating

Application.ScreenUpdating = False

Normalize Values parameter must be a twodimension array

On Error Resume Next

Result = LBound(Values, 2)

TwoDimensionArray = Err.Number = 0

On Error GoTo 0

If Not TwoDimensionArray Then

   If Not IsArray(Values) Then

      Values = Array(Values)

   End If

   ReDim WorkArray(1 To 1, 1 To UBound(Values) LBound(Values) + 1)

   For Column = 1 To UBound(WorkArray, 2)

      WorkArray(1, Column) = Values(Column 1 + LBound(Values))

   Next Column

   Values = WorkArray

End If

‘ Normalize Position parameter

If Position < 0 Then

   Position = Table.ListRows.Count

End If

Position = Application.Max(1, Application.Min(Position, _

   Table.ListRows.Count+ 1))

Save total row setting and disable total

ShowTotals = Table.ShowTotals

Table.ShowTotals = False

‘ Insert the new rows

If Table.ListRows.Count > 0 And Position <= Table.ListRows.Count Then

Table.DataBodyRange.Resize(UBound(Values)). _

Offset(Position — 1).InsertShift:=xlShiftDown

End If

If Table.ListRows.Count > 0 Then

Set InsertRange = Table.DataBodyRange.Resize _

(UBound(Values)).Offset(Position — 1)

Else

Set InsertRange = Table.InsertRowRange.Resize(UBound(Values))

End If

If IsEmpty(ColumnAssignments) Or IsMissing(ColumnAssignments) Then

   InsertRange.Value = Values

Else

   For TargetColumn = LBound(ColumnAssignments) To _

      UBound(ColumnAssignments)

      SourceColumn = TargetColumn — LBound(ColumnAssignments) + 1

      If ColumnAssignments(TargetColumn) >= 1 And _

         ColumnAssignments(TargetColumn) <= _

            Table.ListColumns.Count Then

         InsertRange.Columns(ColumnAssignments(TargetColumn)) _

            .Value = Application.Index(Values, , SourceColumn)

      End If

   Next TargetColumn

End If

Set BulkInsertIntoTable = InsertRange

Restore the total row setting

Table.ShowTotals = ShowTotals

Application.Calculation = Calculation

Application.ScreenUpdating = ScreenUpdating

End Function

Восстановление форматирования и формул

Обычно Таблица поддерживает одинаковое форматирование и формулы во всех строках, исключая строки заголовка и итоговые строки. При изменении форматирования или формулы в ячейке столбца Таблицы Excel применяет это новое форматирование или формулу ко всему столбцу. Форматирование и формулы автоматически применяются к новым строкам по мере их добавления.

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

Процедура ниже выполняет это с помощью метода изменения размера Таблицы. Сначала Таблица изменяется, чтобы быть только одной строкой. Затем форматирование и формулы удаляются из всех строк таблицы от строки 2 до последней строки плюс одна строка. Наконец, диапазон Таблицы возвращается к тому, что было. На этом заключительном этапе Excel должен применить форматирование и формулы в первой строке ко всем строкам ниже первой строки. В результате получается последовательно отформатированная таблица, использующая первую строку данных в качестве шаблона для всех остальных строк. Код предполагает, что в Таблице есть по крайней мере одна строка данных:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

Public Sub RepairTable( _

      ByVal Table As ListObject _

   )

‘ Repair the Table’s formatting and formulas by making them consistent down the

‘ entire length of each column.

‘ Syntax

‘ RepairTable(Table)

Table A Table object (ListObject object).

Dim RowCount As Long

Dim ListColumn As ListColumn

Dim ShowTotals As Boolean

RowCount = Table.ListRows.Count

If RowCount < 2 Then Exit Sub

With Table

   ShowTotals = .ShowTotals

   .ShowTotals = False

   .Resize .HeaderRowRange.Resize(2)

   For Each ListColumn In .ListColumns

      With ListColumn.DataBodyRange.Resize( _

         Application.Max(RowCount, 1)).Offset(1)

         If Left(.Rows(1).Formula, 1) = «=» Then

            .Cells.Clear

         Else

            .Cells.ClearFormats

         End If

     End With

   Next ListColumn

   .Resize .HeaderRowRange.Resize(1 + RowCount)

   .ShowTotals = ShowTotals

End With

End Sub

Копирование стиля Таблицы в новую книгу

Нет простого способа скопировать стиль Таблицы из одной книги в другую. Следующий пример кода копирует стиль, присвоенный Таблице с именем "tblRegister", в книгу "Destination Workbook. xlsx":

Sub ExportTableStyle()

   Dim Source As Workbook

   Dim Target As Workbook

   Dim Table As ListObject

   Set Source = ThisWorkbook

   Set Target = Workbooks(«Destination Workbook.xlsx»)

   Set Table = Source.Worksheets(«Register»).ListObjects(«tblRegister»)

   Target.Worksheets.Add Before:=Target.Worksheets(1)

   Table.Range.Copy Target.Worksheets(1).Range(«A1»)

   Target.Worksheets(1).Delete

End Sub

[1] Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based) и с отсчетом от специфического значения заданного программистом (n-based).

Содержание

  1. Creating basic data reports with ListObjects and QueryTables
  2. ListObjects
  3. QueryTables
  4. Basic reports with ListObjects and QueryTables
  5. Connection strings
  6. The case
  7. What we have created
  8. Conclusion
  9. How to programmatically wrap a QueryTable in a ListObject?
  10. VBA ListObject Object in Excel
  11. VBA ListObject Object Methods & Properties
  12. VBA ListObject Object Methods in VBA
  13. Delete
  14. ExportToVisio
  15. Publish
  16. Refresh
  17. Resize
  18. Unlink
  19. Unlist
  20. VBA ListObject object Properties in VBA
  21. Active
  22. AlternativeText
  23. Application
  24. AutoFilter
  25. Comment
  26. Creator
  27. DataBodyRange
  28. DisplayName
  29. DisplayRightToLeft
  30. HeaderRowRange
  31. InsertRowRange
  32. ListColumns
  33. ListRows
  34. Parent
  35. QueryTable
  36. Range
  37. SharePointURL
  38. ShowAutoFilter
  39. ShowAutoFilterDropDown
  40. ShowHeaders
  41. ShowTableStyleColumnStripes
  42. ShowTableStyleFirstColumn
  43. ShowTableStyleLastColumn
  44. ShowTableStyleRowStripes
  45. ShowTotals
  46. Slicers
  47. SourceType
  48. Summary
  49. TableObject
  50. TableStyle
  51. TotalsRowRange
  52. XmlMap
  53. Instructions to Run VBA Macro Code or Procedure:
  54. Other Useful Resources:

Creating basic data reports with ListObjects and QueryTables

In this article we will take a closer look on how we can create a basic data report with VBA for Excel 2003 and 2007. With a basic report I refer to solutions where data is, for instance, retrieved from a central database, which is then placed in a worksheet.

ListObjects

The ListObject and the collection of ListObjects was first introduced with Excel 2003 and with the release of Excel xlsx it has been improved. The ListObject represents lists of all kind and it provides end users with a set of built-in features to manipulate the ListObject and its data.

QueryTables

According to the help file to Excel a QueryTable represents: «A worksheet table built from data returned from an external data source such as an SQL Server or a Microsoft Access database.»

We can either create standalone QueryTables or when we are using a ListObject create an associated QueryTable. In this article the focus is set to create an associated QueryTable.

Basic reports with ListObjects and QueryTables

The key point with the article is to show that by combining these two objects in VBA solutions we leverage the good parts from both these two objects. For obvious reasons we also find when exploring the properties and methods in depth that they overlap each other (see the second VBA code example below).

Connection strings

When using VBA and with QueryTables it requires that we use connection strings. Since there are different types of drivers we need to explicit state in the connection string what type we use. In order to use OLE DB Drivers we need to add the prefix «OLEDB;» to the connection string in use:

The case

In this case I use the SQL Server 2005 Express Edition’s Northwind database. If you don’t want to or cannot use this database it can be replaced with the Northwind database shipped with Microsoft Access. If so then you can use one of the mentioned connection strings above.

What the VBA procedure does is the following:

  • Create the ListObject
  • Populate some importants properties of it and create the associated QueryTable.
  • Populate the necessary properties of the QueryTable.
  • Execute and retrieve the data from the database and add the data to the first worksheet in the active workbook.

Although this case uses a simple SQL query we can use parameterized queries where the Parameters property of the QueryTable can be used.

What we have created

In order to understand what we have achieved with the above VBA procedure we can print it out in the Immediate Window the values that different properties of the different objects contain. What should be notable is that in Excel 2007 we have got a new object and collection by the name of «WorkbookConnection «. This object looks promising but it’s only in its early stage so the future will give us additional guidelines about it.

Conclusion

By combining the ListObject and the QueryTable object we can leverage the real power in each of these objects when creating basic data reports. The above VBA solution should give an idea about the framework and what is required to create basic reports.

XL-Dennis is an independent consultant company, situated in Östersund Sweden. The company offers advanced MS Excel consultancy and solution development. XL-Dennis was founded by Dennis Wallentin who has been developing MS Excel solutions since the 1980’s. Dennis has a Masters in Business Management & Accounting. XL-Dennis utilizes MS Excel and other tools to develop professional business solutions. XL-Dennis delivers solutions for all sizes of companies including the public sector in both Sweden and internationally.

Источник

How to programmatically wrap a QueryTable in a ListObject?

Historically external data queries in Excel were expressed with QueryTable s.
ListObjects appeared at some point, but they were not yet compatible with QueryTable s and could not contain them.

In Office 2007 they became not only compatible, but the default. Since then, creating an external query meant creating a ListObject , and the QueryTable was reduced to its internal component.

«Stand-alone» QueryTables, not wrapped in a ListObject, could not be created with the interface any more, but could be created with code and were perfectly supported in both new and old file formats.

Then Excel 2016 came along and introduced a bug that, in case of a «stand-alone» QueryTable, will permanently corrupt the workbook under certain circumstances. The only way to save QueryTables from the bug is to wrap them in a ListObject.

So I have 10k+ legacy Excel documents where the existing QueryTable s need to be wrapped with ListObject s. Importantly, most query tables have formulas to the right of them that are filled down automatically.

Using the Excel interface, wrapping a query in a list is straightforward (activate a cell inside the query result, Insert — Table — Ok ) and works like one would expect, leaving a fully functioning list that gets its data from a query.

Recording this action as a macro yields:

However executing this very code without any modifications results in a Frankenstein query table: it looks like a list object on the outside, but it does not work, cannot be refreshed, cannot be edited, displays the old-style properties dialog, and the list object reports that it’s an xlSrcRange as opposed to xlSrcQuery reported by the interface-created list.

Like an electron, it interferes with itself (the list-object part overlaps the query-table part and refuses to refresh for that reason, even though they should be one and the same — recall that there were formulas to the right of the query table, and they now must be a part of the list too):

Very apparently, the interface does much more when converting the table than was captured by the macro recorder.

I have tried calling ListObjects.Add with various parameters, providing a Range as a source, a WorkbookConnection as a source, a QueryTable ‘s Connection as a source — it all does not work as long it overlaps the existing QueryTable.

I have looked into unlinking the existing QueryTable and recreating the ListObject from scratch where it was, but this causes various issues in formulas around the table.

What is the complete, correct code to programmatically wrap an existing QueryTable with a ListObject , matching exactly what the interface does?

It currently looks to me like I am going to have to do it by directly manipulating the XMLs inside the xslx format which I would hate.

Источник

VBA ListObject Object in Excel

VBA ListObject Object in Excel. The ListObjects collection contains listobject objet. It represents a object on worksheet and most powerful feature. This object contains different methods and properties. In the following tutorial you learn methods, properties of listobject object. And also learn syntax of it.

VBA ListObject Object Methods & Properties

We have different methods and properties for ListObject Object in Excel VBA.

The methods are Delete, ExportToVisio,Publish, Refresh, Resize, Unlink, and Unlist in Excel VBA.

The properties are Active, AlternativeText, Application, AutoFilter, Comment, Creator, DataBodyRange, DisplayName, DisplayRightToLeft, HeaderRowRange, InsertRowRange, ListColumns, ListRows, Name, Parent, QueryTable, Range, SharePointURL, ShowAutoFilter, ShowAutoFilterDropDown, ShowHeaders, ShowTableStyleColumnStripes, ShowTableStyleFirstColumn, ShowTableStyleLastColumn, ShowTableStyleRowStripes, ShowTotals, Slicers, Sort, SourceType, Summary, TableObject, TableStyle, TotalsRowRange, and XmlMap.

Let us see complete details about methods & properties and.

VBA ListObject Object Methods in VBA

Here are the listobject object methods in VBA. Let us see syntax each method.

Delete

Deletes the ListObject object and clears data on the Worksheet cells.

ExportToVisio

Exports a ListObject object to Visio.

Publish

Publishes the ListObject object to a server that is running Microsoft SharePoint Foundation.

Where
Target is a required parameter. It contains array of strings variant type data.
LinkSource is a required parameter. It contains Boolean type data depending on the target.

Refresh

Retrieves the current data and schema for the list from the server that is running Microsoft SharePoint Foundation.

Resize

The Resize method allows a ListObject object to be resized over a new range. No cells are inserted or moved.

Unlink

Removes the link to a Microsoft SharePoint Foundation site from a list and returns Nothing.

Unlist

Removes the list functionality from a ListObject object. After use, the range of cells that made up the the list will be a regular range of data.

VBA ListObject object Properties in VBA

Let us see the the listobject object properties in VBA. Let us see syntax of each property.

Active

Checks the active cell is inside the range of the ListObject object. It returns a Boolean value indicating whether a ListObject object on a worksheet is active or not. It allows to read only.

AlternativeText

This property returns or sets the descriptive text string for the specified table. It allows to read or write.

Application

It is a property and returns an Application object that represents the Microsoft Excel application.

AutoFilter

It filters a table using the AutoFilter feature. It allows to read only.

This property returns or sets the comment associated with the list object. It is to read or write and string type data.

Creator

It returns a 32-bit integer. It represents the application in which this object was created. It allows to read only and Long type data.

DataBodyRange

It returns a Range object that represents the range of values, excluding the header row, in a table. It allows to read only.

DisplayName

This property returns or sets the display name for the specified ListObject object. It allows to read or write and string type data.

DisplayRightToLeft

True if the specified ListObject is displayed from right to left instead of from left to right. False if the object is displayed from left to right. It allows to read only and Boolean type data.

It returns a Range object that represents the range of the header row for a list. It allows to read only and contains range object.

InsertRowRange

This property returns a Range object representing the Insert row for the specified ListObject object. It allows to read only and contains range object.

ListColumns

It returns a ListColumns collection that represents all the columns in a ListObject object. It allows to read only.

ListRows

It returns a ListRows collection that represents all the columns in a ListObject object. It allows to read only.

This property returns or sets a String value that represents the name of the ListObject object.

Parent

It returns the parent object for the specified object. It allows to read only.

QueryTable

This property returns the QueryTable object that provides a link for the ListObject object to the list server. It allows to read only.

Range

It returns a Range object that represents the range to which the specified list object in the list applies.

SharePointURL

Returns a String representing the URL of the SharePoint list for a given ListObject object. It allows to read only and string type data.

ShowAutoFilter

This property returns Boolean to indicate whether the AutoFilter will be displayed. It allows to read or write and conatins Boolean type data.

ShowAutoFilterDropDown

It returns True when the AutoFilter drop-down for the ListObject object is displayed. It allows to read or write and conatins Boolean type data.

It returns or sets if the header information should be displayed for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ShowTableStyleColumnStripes

This property returns or sets if the Column Stripes table style is used for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ShowTableStyleFirstColumn

It returns or sets if the first column is formatted for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ShowTableStyleLastColumn

It returns or sets if the last column is displayed for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ShowTableStyleRowStripes

This property returns or sets if the Row Stripes table style is used for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ShowTotals

It gets or sets a Boolean to indicate whether the Total row is visible.It allows to read or write and conatins Boolean type data.

Slicers

It returns a list of the table slicers associated with a ListObject. It allows to read.

It gets or sets the sort column or columns and sort order for the ListObject collection.

SourceType

This property returns an XlListObjectSourceType value that represents the current source of the list.

Summary

It returns or sets the description associated with the alternative text string for the specified table. It allows to read or write.

TableObject

This property returns a TableObject object. It allows to read only.

TableStyle

It gets or sets the table style for the specified ListObject object. It allows to read or write and contains variant type data.

TotalsRowRange

This property returns a Range object representing the Total row, if any, from a specified ListObject object. It allows to read only.

XmlMap

It returns an XmlMap object that represents the schema map used for the specified table. It allows to read only.

Instructions to Run VBA Macro Code or Procedure:

You can refer the following link for the step by step instructions.

Other Useful Resources:

Click on the following links of the useful resources. These helps to learn and gain more knowledge.

Источник

VBA ListObject Object in Excel. The ListObjects collection contains listobject objet. It represents a object on worksheet and most powerful feature. This object contains different methods and properties. In the following tutorial you learn methods, properties of listobject object. And also learn syntax of it.

We have different methods and properties for ListObject Object in Excel VBA.

The methods are Delete, ExportToVisio,Publish, Refresh, Resize, Unlink, and Unlist in Excel VBA.

VBA ListObject Object

The properties are Active, AlternativeText, Application, AutoFilter, Comment, Creator, DataBodyRange, DisplayName, DisplayRightToLeft, HeaderRowRange, InsertRowRange, ListColumns, ListRows, Name, Parent, QueryTable, Range, SharePointURL, ShowAutoFilter, ShowAutoFilterDropDown, ShowHeaders, ShowTableStyleColumnStripes, ShowTableStyleFirstColumn, ShowTableStyleLastColumn, ShowTableStyleRowStripes, ShowTotals, Slicers, Sort, SourceType, Summary, TableObject, TableStyle, TotalsRowRange, and XmlMap.

Let us see complete details about methods & properties and.

VBA ListObject Object Methods in VBA

Here are the listobject object methods in VBA. Let us see syntax each method.

Delete

Deletes the ListObject object and clears data on the Worksheet cells.

ListObject.Delete

ExportToVisio

Exports a ListObject object to Visio.

ListObject.ExportToVisio

Publish

Publishes the ListObject object to a server that is running Microsoft SharePoint Foundation.

ListObject.Publish (Target, LinkSource)

Where
Target is a required parameter. It contains array of strings variant type data.
LinkSource is a required parameter. It contains Boolean type data depending on the target.

Refresh

Retrieves the current data and schema for the list from the server that is running Microsoft SharePoint Foundation.

ListObject.Refresh

Resize

The Resize method allows a ListObject object to be resized over a new range. No cells are inserted or moved.

ListObject.Resize (Range)

Unlink

Removes the link to a Microsoft SharePoint Foundation site from a list and returns Nothing.

ListObject.Unlink

Unlist

Removes the list functionality from a ListObject object. After use, the range of cells that made up the the list will be a regular range of data.

ListObject.Unlist

VBA ListObject object Properties in VBA

Let us see the the listobject object properties in VBA. Let us see syntax of each property.

Active

Checks the active cell is inside the range of the ListObject object. It returns a Boolean value indicating whether a ListObject object on a worksheet is active or not. It allows to read only.

ListObject.Active

AlternativeText

This property returns or sets the descriptive text string for the specified table. It allows to read or write.

ListObject.AlternativeText

Application

It is a property and returns an Application object that represents the Microsoft Excel application.

ListObject.Application

AutoFilter

It filters a table using the AutoFilter feature. It allows to read only.

ListObject.AutoFilter

Comment

This property returns or sets the comment associated with the list object. It is to read or write and string type data.

ListObject.Comment

Creator

It returns a 32-bit integer. It represents the application in which this object was created. It allows to read only and Long type data.

ListObject.Creator

DataBodyRange

It returns a Range object that represents the range of values, excluding the header row, in a table. It allows to read only.

ListObject.DataBodyRange

DisplayName

This property returns or sets the display name for the specified ListObject object. It allows to read or write and string type data.

ListObject.DisplayName

DisplayRightToLeft

True if the specified ListObject is displayed from right to left instead of from left to right. False if the object is displayed from left to right. It allows to read only and Boolean type data.

ListObject.DisplayRightToLeft

HeaderRowRange

It returns a Range object that represents the range of the header row for a list. It allows to read only and contains range object.

ListObject.HeaderRowRange

InsertRowRange

This property returns a Range object representing the Insert row for the specified ListObject object. It allows to read only and contains range object.

ListObject.InsertRowRange

ListColumns

It returns a ListColumns collection that represents all the columns in a ListObject object. It allows to read only.

ListObject.ListColumns

ListRows

It returns a ListRows collection that represents all the columns in a ListObject object. It allows to read only.

ListObject.ListRows

Name

This property returns or sets a String value that represents the name of the ListObject object.

ListObject.Name

Parent

It returns the parent object for the specified object. It allows to read only.

ListObject.Parent

QueryTable

This property returns the QueryTable object that provides a link for the ListObject object to the list server. It allows to read only.

ListObject.QueryTable

Range

It returns a Range object that represents the range to which the specified list object in the list applies.

ListObject.Range

SharePointURL

Returns a String representing the URL of the SharePoint list for a given ListObject object. It allows to read only and string type data.

ListObject.SharePointURL

ShowAutoFilter

This property returns Boolean to indicate whether the AutoFilter will be displayed. It allows to read or write and conatins Boolean type data.

ListObject.ShowAutoFilter

ShowAutoFilterDropDown

It returns True when the AutoFilter drop-down for the ListObject object is displayed. It allows to read or write and conatins Boolean type data.

ListObject.ShowAutoFilterDropDown

ShowHeaders

It returns or sets if the header information should be displayed for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ListObject.ShowHeaders

ShowTableStyleColumnStripes

This property returns or sets if the Column Stripes table style is used for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ListObject.ShowTableStyleColumnStripes

ShowTableStyleFirstColumn

It returns or sets if the first column is formatted for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ListObject.ShowTableStyleFirstColumn

ShowTableStyleLastColumn

It returns or sets if the last column is displayed for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ListObject.ShowTableStyleLastColumn

ShowTableStyleRowStripes

This property returns or sets if the Row Stripes table style is used for the specified ListObject object. It allows to read or write and conatins Boolean type data.

ListObject.ShowTableStyleRowStripes

ShowTotals

It gets or sets a Boolean to indicate whether the Total row is visible.It allows to read or write and conatins Boolean type data.

ListObject.ShowTotals

Slicers

It returns a list of the table slicers associated with a ListObject. It allows to read.

ListObject.Slicers

Sort

It gets or sets the sort column or columns and sort order for the ListObject collection.

ListObject.Sort

SourceType

This property returns an XlListObjectSourceType value that represents the current source of the list.

ListObject.SourceType

Summary

It returns or sets the description associated with the alternative text string for the specified table. It allows to read or write.

ListObject.Summary

TableObject

This property returns a TableObject object. It allows to read only.

ListObject.TableObject

TableStyle

It gets or sets the table style for the specified ListObject object. It allows to read or write and contains variant type data.

ListObject.TableStyle

TotalsRowRange

This property returns a Range object representing the Total row, if any, from a specified ListObject object. It allows to read only.

ListObject.TotalsRowRange

XmlMap

It returns an XmlMap object that represents the schema map used for the specified table. It allows to read only.

ListObject.XmlMap

Instructions to Run VBA Macro Code or Procedure:

You can refer the following link for the step by step instructions.

Instructions to run VBA Macro Code

Other Useful Resources:

Click on the following links of the useful resources. These helps to learn and gain more knowledge.

VBA Tutorial VBA Functions List VBA Arrays in Excel VBA Tables and ListObjects

VBA Editor Keyboard Shortcut Keys List VBA Interview Questions & Answers Blog

Excel is a Microsoft application used to work with spreadsheets. VBA is embedded in the Excel application and can be used to work programmatically with Excel. The Excel Object Library contains classes that make working with Excel in VBA possible. The classes in the Excel Object Library are referred to as the Excel Object Model. When using VBA within Excel, a reference is automatically included to the Excel Object Library.

Excel Object Model

The Excel Object Model contains classes that make working with Excel in VBA possible. The Excel Object Model contains many classes but the general overview of the Excel Object Model is Application → Workbook → Worksheet → Range.


  1. Application


    1. Workbooks


      1. Workbook


        1. Worksheets


          1. Worksheet

            1. Range

            2. PivotTables

              1. PivotTable

            3. ChartObjects

              1. ChartObject

            4. ListObjects

              1. ListObject

            5. QueryTables

              1. QueryTable

        2. PivotCaches

          1. PivotCache

        3. Charts

          1. Chart
        4. VBProject*

    2. Windows

      1. Window

    3. AddIns

      1. AddIn

    4. Dialogs

      1. Dialog
    5. FileDialog**

*The VBProject class is defined in the VBIDE library but is a property of the Workbook object.

**The FileDialog class is defined in the Office library but is a property of the Excel.Application object.

Context

The place where VBA code is written determines the implied context when referring to classes. For example, when using VBA in Excel and referring to the Application object, it is implied that Application and Excel.Application are the same object. However, when using VBA in another application to work with Excel, it is necessary to qualify references to avoid naming collisions with classes in the other application. Using qualified references requires that a reference is set to the library where the classes are defined. If a reference cannot be set, late-binding can be used instead.

Public Sub Example()

    '''In Excel

    Debug.Print Application Is Excel.Application 'Prints: True

End Sub

Public Sub Example()

    '''In Outlook

    'Reference to Excel Object Library is required

    Debug.Print Application Is Excel.Application 'Prints: False

    Debug.Print Application Is Outlook.Application 'Prints: True

End Sub

To retrieve the Excel Application object from another application, attempt to retrieve the running application and if that fails start a new instance of the application.

Public Function GetExcelApp() As Object

    On Error Resume Next
    Set GetExcelApp = GetObject(, "Excel.Application")
    On Error GoTo 0

    If GetExcelApp Is Nothing Then
        Set GetExcelApp = CreateObject("Excel.Application")
    End If

End Function

Application

The Application object is the top-level object in the Excel Object Model which represents the Excel Application itself. The Application object contains information, settings, and functionality of the Excel application.

Application-Level Settings

Certain properties of the Application object can be changed which alters the way Excel behaves. These properties can sometimes be set manually from the Options menu or programmatically with VBA.

The ScreenUpdating property can be set to False to prevent the screen from updating while a macro is running. Then it can be set back to True to allow the updates to take place. Disabling screen updating while a macro is running can improve performance and speed as well as prevent the screen from flickering while code is executing.

The EnableEvents property can be set to False to prevent events from being triggered when a macro is running. At times it is necessary to disable events to avoid infinite loops. Other times it may be unnecessary for events to be running while code is executing. Set the property back to True at the end of the macro to re-enable normal event behavior.

The DisplayAlerts property can be set to False to prevent Excel alert messages from popping up while a macro is running. The property should be set back to True at the end of the macro to allow Excel pop-up alerts.

The Calculation property can be set to prevent formulas from recalculating while a macro is running. In Excel there are volatile functions that update whenever any change is made on the worksheet. This can be unnecessary and very inefficient. After the macro finishes running the Calculate method can be called on the sheet and the Calculation property can be set to xlCalculationAutomatic.

Public Sub Example()

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual

    'Code statements

    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True
    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub

WorksheetFunction

The WorksheetFunction object can be used to call Excel spreadsheet functions in VBA.

Public Sub Example()

    Dim TheSum As Double

    TheSum = Application.WorksheetFunction.Sum(1, 2, 3, 4, 5)

End Sub

Run

The Run method is used to call a procedure based on a string representing the procedure’s name. The Run method can be used to call a procedure in a similar way to a callback function.

Option Explicit

Public Sub Example()

    Dim Arr(0 To 9) As Long
    Arr(0) = 1
    Arr(1) = 2
    Arr(2) = 3
    Arr(3) = 4
    Arr(4) = 5
    Arr(5) = 6
    Arr(6) = 7
    Arr(7) = 8
    Arr(8) = 9
    Arr(9) = 10

    OperateOnValues Arr, "Square"

    PrintArray Arr

End Sub

Public Sub OperateOnValues(Arr As Variant, Callback As String)
    Dim i As Long
    For i = LBound(Arr) To UBound(Arr)
        Arr(i) = Application.Run(Callback, Arr(i))
    Next i
End Sub

Public Function Square(Num As Long) As Long
    Square = Num * Num
End Function

Public Sub PrintArray(Arr As Variant)
    Dim i As Long
    For i = LBound(Arr) To UBound(Arr)
        Debug.Print Arr(i)
    Next i
End Sub

Evaluate

The Evaluate method can be used to evaluate formulas, cell references, chart elements, and form controls. Square bracket syntax, [expression], can be used instead of using Application.Evaluate(expression). Evaluate can evaluate worksheet formulas that return an array and it can evaluate array literals.

Public Sub Example()

    'Evaluate range reference
    Debug.Print Application.Evaluate("A1").Value2
    Debug.Print [A1].Value2


    'Evaluate worksheet formula
    Debug.Print Application.Evaluate("Sum(1, 2, 3, 4, 5)")
    Debug.Print [Sum(1, 2, 3, 4, 5)]


    'Evaluate array literal
    Dim Arr()
    Arr = Application.Evaluate("{1,2,3;4,5,6;7,8,9}")
    Arr = [{1,2,3;4,5,6;7,8,9}]

    Debug.Print Arr(1, 1)
    Debug.Print Arr(1, 2)
    Debug.Print Arr(1, 3)

    Debug.Print Arr(2, 1)
    Debug.Print Arr(2, 2)
    Debug.Print Arr(2, 3)

    Debug.Print Arr(3, 1)
    Debug.Print Arr(3, 2)
    Debug.Print Arr(3, 3)

End Sub

Union

The Union method is used to combine two or more ranges into a single Range object. The ranges do not need to be contiguous.

Public Sub Example()

    Dim Rng As Range
    
    Set Rng = Union(Range("A1"), Range("A2")) 'Contiguous Range
    Rng.Interior.Color = vbRed

    Set Rng = Union(Range("C1"), Range("C3")) 'Noncontiguous Range
    Rng.Interior.Color = vbGreen

End Sub

Intersect

The Intersect method returns the Range where two or more Ranges intersect. If none of the Ranges intersect the method returns Nothing. If Ranges from more than one Worksheet are passed, an error occurs.

Public Sub IntersectingRanges()

    Dim WS As Worksheet
    Set WS = Activesheet

    Dim R1 As Range
    Set R1 = WS.Range("A1:C5")

    Dim R2 As Range
    Set R2 = WS.Range("C1:E5")

    Dim I As Range
    Set I = Application.Intersect(R1, R2)

    If I Is Nothing Then
        Debug.Print "Ranges do not intersect."
    Else
        Debug.Print I.Address
    End If

End Sub

Volatile

The Volatile method is used to make a User-Defined Function volatile. Volatile functions are recalculated whenever any change occurs on the Worksheet.

Public Function AddTwoNumbers(Num1 As Double, Num2 As Double) As Double

    Application.Volatile

    AddTwoNumbers = Num1 + Num2

End Function

SendKeys

The SendKeys method is used to send keyboard keys to the active application.

Public Sub Example()

    'Add text to the first cell

    Application.SendKeys "^{HOME}"
    Application.SendKeys "Hello, World!"
    Application.SendKeys "{ENTER}"

End Sub

OnKey

The OnKey method is used to assign a macro to a keyboard key.

Public Sub Example()

    'Assign keyboard shortcut
    Application.OnKey "^a", "DisplayMessage"

    'Disable keyboard shortcut
    Application.OnKey "^a", ""

    'Return keyboard shortcut to default
    Application.OnKey "^a"

End Sub

Public Sub DisplayMessage()
    Msgbox "Hello, World"
End Sub

InputBox

The InputBox method is used to display an input box and get user input. Acceptable data types can be specified by the Type parameter.

Public Sub Example()

    Dim UserInput
    UserInput = Application.InputBox("Enter Number", Type:=1 + 2) 'Accepts Number or Text

    Debug.Print UserInput

End Sub

Speech

The Speech object can be used to make Excel talk.

Public Sub Example()

    Application.Speech.Speak "Hello World"

End Sub

FileDialog

The FileDialog property is used to create a FileDialog object which users can use to select files and folders from the file system.

Public Sub Example()

    'Get file path from file picker FileDialog

    Dim FD As FileDialog
    Set FD = Application.FileDialog(msoFileDialogFilePicker)
    With FD
        .AllowMultiSelect = False
        If .Show Then
            Debug.Print .SelectedItems(1)
        Else
            Debug.Print "No file selected."
        End If
    End With

End Sub

Dialogs

The Dialogs property is used to create a Dialog object object which can represent dialog windows.

Public Sub Example()

    'Get color from EditColor Dialog

    Dim ColorIndex  As Long
    Dim EditColor   As Dialog
    Dim Result      As Boolean
    Dim ColorValue  As Long

    ColorIndex = 56
    Set EditColor = Application.Dialogs(xlDialogEditColor)
    Result = D.Show(ColorIndex)
    ColorValue = ThisWorkbook.Colors(ColorIndex)
    Debug.Print ColorValue

End Sub

Properties

There are a number of useful properties that can be used to get information about the Excel application and the user’s platform.

The PathSeparator property returns the path separator character for the user’s system. On Windows this will be a «» and on Mac this will be a «/».

The OperatingSystem property returns a string describing the user’s operating system.

The UserName property returns the UserName of the Excel user.

Windows

The Window object represents a window. The Windows collection object contains a collection of Window objects and can be accessed through the Application.Windows property. The Window object can be used to control various settings and features of windows in Excel. Some properties that can be controlled are Split, FreezePanes, DisplayGridlines, and DisplayFormulas.

Public Sub Example()

    'Toggle Gridlines

    Dim WS As Worksheet
    Set WS = ActiveSheet
    WS.Activate

    Dim W As Window
    Set W = Application.ActiveWindow

    W.DisplayGridlines = Not W.DisplayGridlines

End Sub

Workbooks

The Workbook object represents an Excel Workbook. The Workbooks collection object contains all open Workbooks under the Excel Application. To access the Workbooks collection use the Application.Workbooks property.

Referring to Workbooks

To refer to a Workbook, use the workbook’s Name or Index in the Workbooks collection. When referring to a Workbook by name, the file extension may be required if file extensions are shown on the user’s system in the File Explorer. Workbook indexes start at 1.

Public Sub Example()

    Dim WB As Workbook

    Set WB = Workbooks("Example.xlsx")

    Set WB = Workbooks(1)

End Sub

Every Workbook has its own VBA Project associated with it. To reference the Workbook containing the VBA Project where the code is running, use the ThisWorkbook property.

Public Sub Example()

    Dim WB As Workbook

    Set WB = ThisWorkbook

End Sub

Iterating Over Workbooks

A For Next or For Each loop can be used to iterate over the Workbooks collection.

Public Sub Example()

    Dim i As Long
    For i = 1 To Workbooks.Count
        Debug.Print Workbooks(i).Name
    Next i

    Dim WB As Workbook
    For Each WB In Workbooks
        Debug.Print WB.Name
    Next WB

End Sub

Open Workbook

To Open a Workbook use the Workbooks.Open method.

Public Sub Example()

    Dim WB As Workbook
    Set WB = Workbooks.Open("C:Example.xlsx")

End Sub

Add Workbook

To create a Workbook use the Workbooks.Add method.

Public Sub Example()

    Dim WB As Workbook
    Set WB = Workbooks.Add

End Sub

Save Workbook

To save a Workbook use the Workbook.SaveAs and Workbook.Save methods. Use the XlFileFormat enum to determine the file format to use when saving.

Public Sub Example()

    Dim WB As Workbook
    Set WB = Workbooks.Add

    WB.SaveAs "C:Example.xlsx", xlWorkbookDefault

    WB.Range("A1").Value2 = "Hello, World!"

    WB.Save

End Sub

Close Workbook

To close a Workbook use the Workbook.Close method.

Public Sub Example()

    Dim WB As Workbook
    Set WB = Workbooks.Open("C:Example.xlsx")

    WB.Close 

End Sub

Worksheets

The Worksheet object represents a Worksheet within a Workbook. The Worksheets collection object contains a collection of all Worksheets within a given Workbook. Use the Workbook.Worksheets property to access the Workbooks collection.

Referring To Worksheets

Worksheets can be referenced from the Worksheets collection by the Name property, Index property, or CodeName property. The Name and CodeName appear side by side in the project explorer in the Visual Basic Editor. The Name property is the name that appears on the sheet tab in Excel. The CodeName property can be set in the properties window for the Worksheet object. If a Worksheet is referred to by its Name or Index, the sheet may be moved or renamed which can break code that relies on these properties. It may be better when possible to set the CodeName property of Worksheets in the Visual Basic Editor and refer to sheets by CodeName.

Worksheet Name Property

Public Sub Example()

    Dim WS As Worksheet

    Set WS = Worksheets("Main Sheet") 'Name
    Set WS = Worksheets(1) 'Index
    Set WS = Sheet1 'CodeName

    Debug.Print WS.Name
    Debug.Print WS.Index
    Debug.Print WS.CodeName

End Sub

Iterating

A For Next or For Each loop can be used to iterate over the the Worksheets collection.

Public Sub Example()

    Dim i As Long
    For i = 1 To Worksheets.Count
        Debug.Print Worksheets(i).Name
    Next i

    Dim WS As Worksheet
    For Each WS In Worksheets
        Debug.Print WS.Name
    Next WS

End Sub

Add

Worksheets can be added to a Workbook using the Worksheets.Add method.

Public Sub Example()

    'Add Worksheet after last sheet

    Dim WB As Workbook
    Dim WS As Worksheet

    Set WS = WB.Worksheets.Add(After:=WB.Worksheets(WB.Worksheets.Count))

End Sub

Copy

To copy a Worksheet use the Worksheet.Copy method.

Public Sub Example()

    Dim WB As Workbook
    Set WB = ThisWorkbook

    Dim WS As Worksheet
    Set WS = WB.Worksheets(1)

    Dim WSCopy As Worksheet
    Set WSCopy = WS.Copy(After:=WB.Worksheets(WB.Worksheets.Count))

End Sub

Move

To move a Worksheet use the Worksheet.Move method.

Public Sub Example()

    Dim WB As Workbook
    Set WB = ThisWorkbook

    Dim WS As Worksheet
    Set WS = WB.Worksheets(WB.Worksheets.Count)

    WS.Move Before:=WB.Worksheets(1)

End Sub

Delete

To Delete a Worksheet use the Worksheet.Delete method. When a sheet is deleted an alert pops up warning that the sheet will be permanently deleted. To prevent this pop-up, disable alerts by setting the Application.DisplayAlerts property to False. After the sheet is deleted, alerts can be re-enabled by setting the property to True.

Public Sub Example()

    'Suppress alert that sheet will be deleted permanently
    Application.DisplayAlerts = False

    WS.Delete

    'Unsuppress alerts
    Application.DisplayAlerts = True

End Sub

Naming

The Worksheet.Name property represents the worksheet name displayed on the sheet tab in Excel. The Worksheet.CodeName property represents the Worksheet object’s name in code and can be used directly in code as an object variable.

Public Sub Example()

    Dim WB As Workbook
    Set WB = ThisWorkbook

    Dim WS As Worksheet
    Set WS = WB.Worksheets.Add(After:=WB.Worksheets(WB.Worksheets.Count))

    WS.Name = "Main"

    Debug.Print WS.Name
    Debug.Print WS.CodeName

End Sub

Worksheet Code Name

If the Worksheet name is already taken an error will occur. It may be necessary to create a function to name a Worksheet which handles naming collisions.

Option Explicit

Public Sub Example()

    Dim WS As Worksheet

    Set WS = ThisWorkbook.Worksheets.Add
    NameWorksheet WS, "Test"

    Set WS = ThisWorkbook.Worksheets.Add
    NameWorksheet WS, "Test"

End Sub

Public Sub NameWorksheet(WS As Worksheet, WSName As String)

    Dim WSName1 As String
    WSName1 = WSName

    Dim WB As Workbook
    Set WB = WS.Parent

    Dim WSs As Sheets
    Set WSs = WB.Worksheets

    Dim WSCount As Long
    WSCount = WSs.Count

    Dim IsNamed As Boolean
    Dim c As Long
    Do While Not IsNamed

        Dim NameFound As Boolean
        NameFound = False

        Dim i As Long
        For i = 1 To WSCount
            If WSName1 = WSs(i).Name Then
                NameFound = True
                Exit For
            End If
        Next i

        If NameFound Then
            c = c + 1
            WSName1 = WSName & " (" & c & ")"
        Else
            WS.Name = WSName1
            IsNamed = True
        End If

    Loop

End Sub

Ranges

The Range object represents a range of cells on a Worksheet.

Cells Property

The Worksheet.Cells and Range.Cells properties can be used to return a Range object given a row and column index. With the Worksheet.Cells property the row and column indexes are relative to the entire worksheet. With the Range.Cells property the row and column indexes are relative to the Range. The Cells property is useful when iterating over rows and columns.

Public Sub Example()

    Dim WS As Worksheet
    Set WS = ThisWorkbook.Worksheets(1)

    Dim i As Long
    For i = 1 To 10
        WS.Cells(i, 1).Value2 = i
    Next i

End Sub

Public Sub Example()

    Dim Rng As Range
    Set Rng = ThisWorkbook.Worksheets(1).Range("B11:B20")

    Dim i As Long
    For i = 1 To 10
        Rng.Cells(i, 1).Value2 = i
    Next i

End Sub

Cell Values

The Value property of the Range object returns the value stored in a cell.

The Value2 property of the Range object returns the value stored in a cell. Currency and Date types are returned as their underlying numerical values and not the correctly formatted Currency or Date.

The Text property of the Range object returns the text that is currently displayed in the cell.

Million Dollars
Million Dollars Number Signs

Public Sub Example()

    'Prints 1000000, Currency
    Debug.Print Range("A1").Value, TypeName(Range("A1").Value)

    'Prints 1000000, Double
    Debug.Print Range("A1").Value2, TypeName(Range("A1").Value2)

    'Prints $1,000,000.00, String
    'Prints #########, String
    Debug.Print Range("A1").Text, TypeName(Range("A1").Text)

End Sub

Formulas

The Formula and FormulaR1C1 properties can be used to add or read the formula in a cell. The Formula property uses A-1 style cell referencing and the FormulaR1C1 property uses R1C1 style cell referencing.

Public Sub Example()

    Range("B1").Formula = "=SUM($A$1:$A$10)"

    Range("B1").FormulaR1C1 = "=SUM(RC[-1]:R[9]C[-1])"

End Sub

Copy and Paste

Ranges can be copied and pasted using the Copy method and the PasteSpecial method.

Public Sub ExampleRange()

    'Copy directly
    Range("A1").Copy Range("B1")

    'Copy and paste
    Range("A1").Copy
    Range("B1").PasteSpecial xlPasteValues

End Sub

Formatting

The Interior object allows properties related to the Range’s interior color to be set. Use the Range.Interior property to get the Interior object for a Range.

The Font object allows properties about a Range’s font to be set. Use the Range.Font property to get the Font object for a Range.

The Borders object allows properties about a Range’s borders to be set. Use the Range.Borders property to get the Borders object for a Range.

Public Sub Example()

    With Range("A1")

        With .Interior
            .Color = vbRed
        End With

        With .Font
            .Bold = True
            .Italic = True
        End With

        With .Borders
            .LineStyle = xlContinuous
            .Color = vbBlue
        End With

    End With

End Sub

Conditional Formatting

The FormatConditions object is used to add Conditional Formatting to a Range. Use the Range.FormatConditions property to get the FormatConditions object for a Range.

Public Sub Example()

    'Highlight Duplicates

    With Range("A:A")
        .FormatConditions.AddUniqueValues
        .FormatConditions(.FormatConditions.Count).SetFirstPriority
        .FormatConditions(1).DupeUnique = xlDuplicate
        With .FormatConditions(1).Font
            .Color = -16383844
            .TintAndShade = 0
        End With
        With .FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .Color = 13551615
            .TintAndShade = 0
        End With
        .FormatConditions(1).StopIfTrue = False
    End If

End Sub

NumberFormat

The NumberFormat property is used to set the data type of a range. The format codes for the NumberFormat property are the same codes as the codes in the Format Cells dialog in Excel.

Format Format Code
General «General»
Number «0.00»
Currency «$#,##0.00»
Accounting «_($* #,##0.00_);_($* (#,##0.00);_($* «»-«»??_);_(@_)»
Short Date «m/d/yyyy»
Long Date «[$-x-sysdate]dddd, mmmm dd, yyyy»
Time «[$-x-systime]h:mm:ss AM/PM»
Percentage «0.00%»
Fraction «# ?/?»
Scientific Notation «0.00E+00»
Text «@»
ZIP Code «00000»
ZIP Code + 4 «00000-0000»
Phone Number «[<=9999999]###-####;(###) ###-####»
Social Security Number «000-00-0000»
Public Sub Example()

    'Format cell as Text

    Range("A1").NumberFormat = "@"

End Sub

CurrentRegion

The CurrentRegion property can be used to reference a region of rows and columns where there is connected data. The intersection of a blank row and a blank column divides regions.

Current Region

Public Sub Example()

    Dim Rng As Range
    Set Rng = Range("A1").CurrentRegion

    Debug.Print Rng.Address 'Prints $A$1:$C$4

End Sub

Resize

The Resize property is used to resize a Range object. The Resize property can be used to resize ranges so that arrays can be directly assigned to the range.

Public Sub Example()

    Dim Arr(0 To 2, 0 To 2) As Long

    Arr(0, 0) = 1
    Arr(0, 1) = 2
    Arr(0, 2) = 3

    Arr(1, 0) = 4
    Arr(1, 1) = 5
    Arr(1, 2) = 6

    Arr(2, 0) = 7
    Arr(2, 1) = 8
    Arr(2, 2) = 9

    Dim RowCount As Long
    RowCount = UBound(Arr, 1) - LBound(Arr, 1) + 1

    Dim ColumnCount As Long
    ColumnCount = UBound(Arr, 2) - LBound(Arr, 2) + 1

    Range("A1").Resize(RowCount, ColumnCount).Value = Arr

End Sub

PivotTables And Charts

PivotTables and Charts are a very useful way to view and manipulate data in Excel.

PivotCaches

The PivotCache object contains the data used to create PivotTables. PivotCaches are stored at the Workbook level. The PivotCaches collection object contains all the PivotCache objects for a given Workbook. Use the Workbook.PivotCaches method to return the PivotCaches collection for a Workbook. To create a new PivotCache use the PivotCaches.Create method. Use the XlPivotTableSourceType enum to specify the type of data source for the new PivotCache.

PivotTables

Once a PivotCache is created, it can be used to create a PivotTable. The PivotTable object represents a PivotTable on a Worksheet. The PivotTables collection object contains all the PivotTables for a Worksheet. Use the Worksheet.PivotTables method to get the PivotTables collection for a Worksheet. To create a new PivotTable use the PivotTables.Add or PivotCache.CreatePivotTable method. To add fields to a PivotTable use the PivotTable.AddFields method and the PivotTable.AddDataField method.

Charts

Charts can be created as their own stand-alone sheet or they can be embedded in a Worksheet.

To create a stand-alone chart sheet get a Charts or Sheets collection using the Workbook.Charts property and use the Charts.Add2 or Sheets.Add method respectively. When using the Sheets.Add method specify the type as a chart using the XlSheetType enum. Use the Chart.SetSourceData method and pass the TableRange property of the PivotTable.

To create an embedded chart, create a Shape object using the AddChart2 method of the Worksheet’s Shapes collection object property. Retrieve the Chart object from the Shape using the Shape.Chart property. Finally, set the source data of the Chart using the Chart.SetSourceData method with the TableRange property of the PivotTable.

Example

Consider an example using gardeners and their harvest output crops.

PivotTable Sample Data

Public Sub CreatePivotTableAndCharts()

    Dim PCaches      As PivotCaches
    Dim PCache       As PivotCache
    Dim NewWS        As Worksheet
    Dim PTables      As PivotTables
    Dim PTable       As PivotTable
    Dim PChartShape  As Shape
    Dim PChart       As Chart
    Dim PChartSheet  As Chart

    'Create PivotCache
    Set PCaches = ThisWorkbook.PivotCaches
    Set PCache = _
    PCaches.Create(xlDatabase, ThisWorkbook.Worksheets(1).Range("A1").CurrentRegion)

    'Create PivotTable
    Set NewWS = ThisWorkbook.Worksheets.Add
    Set PTables = NewWS.PivotTables
    Set PTable = PTables.Add(PCache, NewWS.Range("A1"))
    PTable.AddFields RowFields:=Array("Gardener", "Crop Description")
    PTable.AddDataField PTable.PivotFields("Harvest Units"), "Sum of Harvest Units", xlSum

    'Create Embdedded Chart
    Set PChartShape = NewWS.Shapes.AddChart2(XlChartType:=xlColumnStacked)
    Set PChart = PChartShape.Chart
    PChart.SetSourceData PTable.TableRange1
    
    'Create Sheet Chart
    Set PChartSheet = ThisWorkbook.Charts.Add
    PChartSheet.SetSourceData PTable.TableRange1

End Sub

 Embedded Pivot Chart
Pivot Chart Sheet

ListObjects

The ListObject class is used to represent a table in Excel. The ListObjects collection object contains all ListObject objects in a Worksheet. Use the Worksheet.ListObjects property to retrieve the ListObjects collection object for a Worksheet. A ListObject can be created using the ListObjects.Add method. Specify the type of data source using the XlListObjectSourceType enum.

Public Sub Example()

    'Create table from Range

    Dim WS As Worksheet
    Set WS = ThisWorkbook.Worksheets(1)

    Dim LO As ListObject
    Set LO = WS.ListObjects.Add(xlSrcRange, WS.Range("A1").CurrentRegion, , xlYes)
    LO.Name = "Table1"

End Sub

QueryTables

The QueryTable object is used to import source data into Excel. The QueryTables collection object contains all QueryTable objects for a Worksheet. Use the Worksheet.QueryTables property to retrieve the QueryTables collection for the Worksheet. A QueryTable object can be created using the QueryTables.Add method. Provide a connection string for the specific data source when creating a QueryTable.

Public Sub Example()

    'Add QueryTable from Excel sheet

    Dim ExcelFilePath As String
    ExcelFilePath = "C:example.xlsx"

    Dim ConnectionString As String
    ConnectionString = _
        "ODBC;" & _
        "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
        "DBQ=" & ExcelFilePath & ";"

    Dim WS As Worksheet
    Set WS = ThisWorkbook.Worksheets(1)

    Dim QT As QueryTable
    Set QT = WS.QueryTables.Add(ConnectionString, WS.Range("A1"), "SELECT * FROM [Sheet1$]")
    QT.Refresh

End Sub

Public Sub Example()

    'Add QueryTable from Text/CSV file

    Dim WS As Worksheet
    Set WS = ThisWorkbook.Worksheets(1)

    Dim TextFilePath As String
    TextFilePath = "C:example.csv"

    Dim ConnectionString As String
    ConnectionString = "TEXT;" & TextFilePath

    Dim QT As QueryTable
    Set QT = WS.QueryTables.Add(ConnectionString, WS.Cells(1, 1))

    WS.Cells.NumberFormat = "@"

    With QT
        .TextFileConsecutiveDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        'MUST Assign TextFileColumnDataTypes to Avoid Data Type Guessing
        .TextFileColumnDataTypes = Array(xlTextFormat, xlTextFormat, xlTextFormat)
        .Refresh
        .SaveData = False
        .Delete
    End With

End Sub

Понравилась статья? Поделить с друзьями:
  • Excel vba get row from range
  • Excel vba get range names
  • Excel vba get all sheets
  • Excel vba listobject range
  • Excel vba function with no return value