Vba excel querytables add

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

QueryTables.Add method (Excel)

vbaxl10.chm521074

vbaxl10.chm521074

excel

Excel.QueryTables.Add

ac6cd03e-31aa-cd8c-aa67-a551894c6eb3

05/03/2019

medium

QueryTables.Add method (Excel)

Creates a new query table.

Syntax

expression.Add (Connection, Destination, Sql)

expression A variable that represents a QueryTables object.

Parameters

Name Required/Optional Data type Description
Connection Required Variant The data source for the query table. Can be one of the following:

  • A string containing an OLE DB or ODBC connection string. The ODBC connection string has the form ODBC;<connection string>.
  • A QueryTable object from which the query information is initially copied, including the connection string and the SQL text, but not including the Destination range. Specifying a QueryTable object causes the Sql argument to be ignored.
  • An ADO or DAO Recordset object. Data is read from the ADO or DAO recordset. Microsoft Excel retains the recordset until the query table is deleted or the connection is changed. The resulting query table cannot be edited.
  • A web query. A string in the form URL;<url> where URL; is required but not localized and the rest of the string is used for the URL of the web query.
  • Data Finder. A string in the form FINDER;<data finder file path> where FINDER; is required but not localized. The rest of the string is the path and file name of a Data Finder file (*.dqy or *.iqy). The file is read when the Add method is run; subsequent calls to the Connection property of the query table will return strings beginning with ODBC; or URL; as appropriate.
  • A text file. A string in the form TEXT;<text file path and name> where TEXT; is required but not localized.
Destination Required Range The cell in the upper-left corner of the query table destination range (the range where the resulting query table will be placed). The destination range must be on the worksheet that contains the QueryTables object specified by expression.
Sql Optional Variant The SQL query string to be run on the ODBC data source. This argument is optional when you are using an ODBC data source (if you don’t specify it here, you should set it by using the Sql property of the query table before the table is refreshed). You cannot use this argument when a QueryTable object, text file, or ADO or DAO Recordset object is specified as the data source.

Return value

A QueryTable object that represents the new query table.

Remarks

A query created by this method isn’t run until the Refresh method is called.

Example

This example creates a query table based on an ADO recordset. The example preserves the existing column sorting and filtering settings and layout information for backward compatibility.

Dim cnnConnect As ADODB.Connection 
Dim rstRecordset As ADODB.Recordset 
 
Set cnnConnect = New ADODB.Connection 
cnnConnect.Open "Provider=SQLOLEDB;" & _ 
    "Data Source=srvdata;" & _ 
    "User ID=testac;Password=4me2no;" 
 
Set rstRecordset = New ADODB.Recordset 
rstRecordset.Open _ 
    Source:="Select Name, Quantity, Price From Products", _ 
    ActiveConnection:=cnnConnect, _ 
    CursorType:=adOpenDynamic, _ 
    LockType:=adLockReadOnly, _ 
    Options:=adCmdText 
 
With ActiveSheet.QueryTables.Add( _ 
        Connection:=rstRecordset, _ 
        Destination:=Range("A1")) 
    .Name = "Contact List" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = True 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .PreserveColumnInfo = True 
    .Refresh BackgroundQuery:=False 
End With

This example imports a fixed width text file into a new query table. The first column in the text file is five characters wide and is imported as text. The second column is four characters wide and is skipped. The remainder of the text file is imported into the third column and has the General format applied to it.

Set shFirstQtr = Workbooks(1).Worksheets(1) 
Set qtQtrResults = shFirstQtr.QueryTables.Add( _ 
    Connection := "TEXT;C:My Documents19980331.txt", 
    Destination := shFirstQtr.Cells(1,1)) 
With qtQtrResults 
    .TextFileParsingType = xlFixedWidth 
    .TextFileFixedColumnWidths := Array(5,4) 
    .TextFileColumnDataTypes := _ 
        Array(xlTextFormat, xlSkipColumn, xlGeneralFormat) 
    .Refresh 
End With

This example creates a new query table on the active worksheet.

sqlstring = "select 96Sales.totals from 96Sales where profit < 5" 
connstring = _ 
    "ODBC;DSN=96SalesData;UID=Rep21;PWD=NUyHwYQI;Database=96Sales" 
With ActiveSheet.QueryTables.Add(Connection:=connstring, _ 
        Destination:=Range("B1"), Sql:=sqlstring) 
    .Refresh 
End With

[!includeSupport and feedback]

Программирование в Excel

265

Для большинства практических задач вполне хватает возможностей объектов

Application, Workbook, Worksheet и Range. Например, для вставки информации из базы данных вы можете пройти циклом по объекту ADO.Recordset и вставить все нужные записи в лист Excel, а затем средствами VBA прописать в нижние строки итоги по вставленным данным. Однако в Excel встроено несколько специальных объектов, которые могут сильно упростить работу в различных ситуациях. Например, ту же операцию по вставке информации из базы данных удобнее будет провести при помощи специального объекта QueryTable, который будет рассматриваться в этом разделе. Еще два таких специальных объекта PivotTable и Chart будут рассматриваться в разд. 11.8

и 11.9.

Основное назначение объекта QueryTable — работа с набором значений, возвращаемых из базы данных. Этот объект доступен в Excel из графического интерфейса через меню Данные | Импорт внешних данных | Импортиро-

вать данные. При помощи объектов QueryTable вы можете разместить набор записей, полученных с источника данных, на листе Excel для выполнения с ним различных операций (например, анализа при помощи богатой библиотеки функций, для построения диаграмм, отчетов и т. п.). QueryTable удобно использовать для «односторонней» работы с источником данных, когда данные только скачиваются с источника в Excel, но изменять данные и сохранять изменения на источнике не нужно. В принципе, в Excel такую возможность синхронизации изменений реализовать можно (например, при помощи перехвата события Change объекта Worksheet), но намного проще и правильнее будет использовать для этой цели возможности Access. В этом разделе мы будем рассматривать только такую «однонаправленную» передачу данных из базы в Excel.

Как обычно, для того чтобы создать объект QueryTable и разместить его на листе, нужно использовать специальную коллекцию QueryTables, которая принадлежит рабочему листу (объекту Worksheet) и доступна через его одноименное свойство. Свойства и методы объекта QueryTables стандартные, как у большинства рассмотренных нами коллекций. Подробного рассмотрения заслуживает только метод Add(), при помощи которого и создается объект QueryTable (с одновременным добавлением в коллекцию). Этот метод принимает три параметра:

Connection — источник данных для QueryTable (в виде объекта типа Variant). В качестве источника данных можно использовать:

строку подключения OLE DB или ODBC (см. гл. 9);

готовый объект Recordset, созданный стандартными средствами ADO или DAO. При этом можно изменять Recordset, на который ссылается

QueryTable и обновлять QueryTable. По многим причинам это самый удобный вариант при работе с QueryTable;

другой объект QueryTable (вместе со строкой подключения и текстом запроса);

текстовый файл;

результаты Web-запроса или запроса Microsoft Query (в виде файла DQY или IQY). Создать такой файл запроса можно при помощи графи-

ческих средств Excel в меню Данные | Импорт внешних данных | Создать запрос.

Destination — куда вставлять полученную QueryTable. Передается объект Range, и вставка производится, начиная с верхнего левого угла диапазона.

SQL — при помощи этого необязательного параметра можно определить SQL-запрос, который будет выполняться на источнике данных ODBC. Этот же запрос можно определить при помощи одноименного свойства объекта QueryTable.

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

Northwind.Customers, что и в разд. 9.5):

Dim cn As ADODB.Connection

Set cn = CreateObject(«ADODB.Connection») cn.Provider = «SQLOLEDB»

cn.ConnectionString = «User ID=SA;Password=password;» _ & «Data Source = LONDON1;Initial Catalog = Northwind»

cn.Open

Dim rs As ADODB.Recordset

Set rs = CreateObject(«ADODB.Recordset») rs.Open «select * from dbo.customers», cn Dim QT1 As QueryTable

Set QT1 = QueryTables.Add(rs, Range(«A1»)) QT1.Refresh

Программирование в Excel

267

Непосредственно помещение объекта QueryTable на лист производится при помощи метода QueryTable.Refresh(). Без него объект QueryTable будет создан только в оперативной памяти.

Информация о самых важных свойствах и методах объекта QueryTable представлена далее.

BackgroundQuery — определяет, может ли выполнение запроса производиться в фоновом режиме, пока пользователь совершает в Excel другие действия. По умолчанию установлено в True. В False следует переводить только тогда, когда пользователь своими действиями в Excel может как-то помешать нормальной работе приложения.

CommandText — текст команды SQL, т. е. текст запроса, который передается на источник. Существует совместно с аналогичным свойством SQL (которое оставлено для обратной совместимости) и имеет перед ним приоритет. При передаче QueryTable готового Recordset это свойство недоступно.

CommandType — тип передаваемой в CommandText команды (вся таблица, SQL-запрос, имя куба OLAP и т. п.). При работе с готовым Recordset также недоступно.

Connection — строка подключения, которую можно передать при вызове метода Add() коллекции QueryTables. Также при работе с готовым Recordset недоступно.

Destination — второй параметр, который передается методу Add(). Возвращает объект Range, представляющий верхнюю левую ячейку диапазона, занимаемого на листе объектом QueryTable. После создания QueryTable доступен только для чтения.

EnableEditing — определяет, может ли пользователь изменять на графическом экране свойства объекта QueryTable. По умолчанию установлено в True. Если перевести в False, то пользователь сможет только обновлять

QueryTable.

EnableRefresh — определяет, может ли пользователь обновлять QueryTable, получая заново данные (с источника или из Recordset).

FetchedRowOverflow — это свойство принимает значение True, если записи, полученные с источника, не поместились на листе Excel (т. е. было скачано больше, чем 65 536 записей). Ошибки в такой ситуации не возникает, поэтому если вы работаете с большими наборами записей, имеет смысл реализовать соответствующие проверки.

FieldNames — очень полезное свойство. Позволяет отключить вставку полученных с источника названий столбцов в первую строку QueryTable. По умолчанию True — вставлять названия столбцов.

MaintainConnection — определяет, будет ли соединение с источником открыто все время до закрытия листа. По умолчанию True — оптимизировано для выполнения частых обновлений. Если переставить в False, можно сэкономить оперативную память на клиенте за счет уменьшения скорости обновления данных.

Name — имя объекта QueryTable (на графическом экране его можно посмотреть, если на панели управления Внешние данные нажать кнопку

Свойства диапазона данных). По умолчанию задается как ExternalData_

номер.

Parameters — позволяет получить доступ к коллекции Parameters (набор параметров запроса). Возможности практически такие же, как у параметров объекта Recordset.

PreserveColumnInfo и PreserveFormatting — определяют, сохранять ли ин-

формацию о столбцах (сортировке, фильтрации и т. п.) и форматировании после обновления QueryTable. По умолчанию все сохраняется.

QueryType — позволяет выяснить, что использовалось при создании QueryTable: Recordset, прямой доступ к таблице, SQL-запрос и т. п. Свойство доступно только для чтения.

Recordset — возвращает ссылку на объект Recordset, который использовался для создания QueryTable, или позволяет заменить его для объекта QueryTable на другой (изменения вступят в силу только после вызова ме-

тода Refresh()).

Refreshing — это свойство принимает значение True на момент выполнения фонового запроса к источнику. Если выполнение запроса слишком затянулось, его можно прервать при помощи метода CancelRefresh().

RefreshOnFileOpen — определяет, обновлять ли данные автоматически при открытии листа или можно обойтись уже скачанными значениями (по умолчанию).

RefreshPeriod — определяет, через какие интервалы времени автоматически будет обновляться информация в QueryTable данными с источника. По умолчанию задан 0, т. е. автоматическое обновление отключено.

RefreshStyle — определяет, что делать с существующими ячейками, на место которых вставляются ячейки QueryTable при обновлении.

ResultRange — это, наверное, самое важное свойство объекта QueryTable. Как правило, данные из базы перекачиваются в Excel для дальнейшей обработки. Это свойство позволяет получить диапазон, который включает в себя все ячейки, вставленные на лист из объекта QueryTable, чтобы потом применить к ним различные функции (обычно по столбцам или по строкам). Чтобы этот метод сработал, обязательно нужно провести вставку

Программирование в Excel

269

данных QueryTable на лист при помощи метода Refresh(). После этого можно будет использовать то, что возвращает это свойство, как обычный диапазон. Самый простой способ продемонстрировать работу этого метода — воспользоваться кодом:

QT1.ResultRange.Select

А следующий пример генерирует под первым столбцом QueryTable формулу с суммированием значений этого столбца:

Set c1 = Sheets(«Лист1»).QueryTables(1).ResultRange.Columns(1) c1.Name = «Column1»

c1.End(xlDown).Offset(1, 0).Formula = «=SUM(Column1)»

RowNumbers — свойство, которое может сильно упростить работу с данными, полученными при помощи QueryTable. Позволяет сгенерировать еще один столбец в QueryTable (слева), который будет состоять из номеров записей, полученных через QueryTable.

SaveData — определяет, сохранять ли данные, полученные через QueryTable, вместе с книгой Excel. По умолчанию задано True. В False имеет смысл переводить это свойство для того, чтобы изначально гарантировать работу пользователя только с самыми последними данными, полученными из источника.

SavePassword — определяет, сохранять ли пароль вместе со строкой подключения (это свойство можно использовать только для источников ODBC). Если переставить его в False, то можно повысить уровень безопасности вашего приложения.

SourceDataFile — полный путь и имя файла источника (для Access, DBF и других настольных СУБД). Для клиент-серверных систем (таких как SQL Server) возвращает Null.

Свойства с префиксом Text… — определяют параметры текстового файла, если этот файл был выбран в качестве источника для QueryTable.

Свойства с префиксом Web… — определяют параметры данных, получаемых от запроса к Web-источнику.

Методы Refresh(), CancelRefresh() и Delete() объекта QueryTable очевидны и каких-либо комментариев не требуют. Метод ResetTimer() позволяет обнулить таймер автоматического обновления, а метод SaveAsODC() — сохранить определение источника данных в виде файла Microsoft Query (если источником был объект Recordset, то этот метод вернет ошибку).

У объекта QueryTable есть также два события: BeforeRefresh и AfterRefresh.

Они срабатывают соответственно перед началом загрузки данных с источника и после окончания загрузки.

11.8. Работа со сводными таблицами

(объект PivotTable)

В процессе работы большинства предприятий накапливаются так называемые необработанные данные (raw data) о деятельности. Например, для торгового предприятия могут накапливаться данные о продажах товаров (по каждой покупке отдельно), для предприятий сотовой связи — статистика нагрузки на базовые станции и т. п. Очень часто менеджменту предприятия необходима аналитическая информация, которая генерируется на основе необработанных данных, например, посчитать вклад каждого вида товара в доходы предприятия или качество обслуживания в зоне данной станции. Из необработанной информации такие сведения извлечь очень тяжело: нужно выполнять сложные SQL-запросы, которые обрабатываются долго и часто мешают текущей работе. Поэтому все чаще в настоящее время необработанные данные сводятся вначале в хранилище архивных данных Data Warehouse, а затем — в кубы OLAP, которые очень удобны для интерактивного анализа. Проще всего представить себе кубы OLAP как многомерные таблицы, в которых вместо стандартных двух измерений (столбцы и строки, как в обычных таблицах) измерений может быть очень много. Обычно для описания измерений в кубе используется термин «в разрезе». Например, отделу маркетинга может быть нужна информация во временном разрезе, в региональном разрезе, в разрезе типов продукта, в разрезе каналов продаж и т. п. При помощи кубов (в отличие от стандартных SQL-запросов) очень просто получать ответы на такие вопросы, как «сколько товаров такого-то типа было продано в четвертом квартале прошлого года в Северо-Западном регионе через региональных дистрибьюторов».

Конечно, в обычных базах данных такие кубы не создать. Для работы с кубами OLAP требуются специализированные программные продукты. Вместе с SQL Server поставляется база данных OLAP от Microsoft, которая называется

Analysis Services. Есть OLAP-решения от Oracle, IBM, Sybase и других фирм.

Для работы с такими кубами в Excel встроен специальный клиент. По-русски он называется Сводная таблица (на графическом экране он доступен через меню Данные | Сводная таблица), а по-английски — Pivot Table. Соответственно, объект, который представляет этот клиент, называется PivotTable. Необходимо отметить, что он умеет работать не только с кубами OLAP, но и с обычными данными в таблицах Excel или в базах данных, но многие возможности при этом теряются.

Сводная таблица и объект PivotTable — это программные продукты фирмы Panorama Software, которые были приобретены Microsoft и интегрированы в Excel. Поэтому работа с объектом PivotTable несколько отличается от работы

Программирование в Excel

271

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

При работе со сводной таблицей первое, что нам потребуется сделать, — это создать объект PivotCache, который будет представлять собой набор записей, полученных с источника OLAP. Очень условно этот объект PivotCache можно сравнить с QueryTable. Для каждого объекта PivotTable можно использовать только один объект PivotCache. Создание объекта PivotCache производится при помощи метода Add() коллекции PivotCaches:

Dim PC1 As PivotCache

Set PC1 = ActiveWorkbook.PivotCaches.Add(xlExternal)

PivotCaches — стандартная коллекция, из ее методов, которые заслуживают подробного рассмотрения, можно назвать только метод Add(). Этот метод принимает два параметра:

SourceType — обязательный, определяет тип источника данных для сводной таблицы. Можно указать создание PivotTable на основе диапазона в Excel, данных из базы данных, во внешнем источнике данных, другой PivotTable и т. п. На практике OLAP имеет смысл использовать только тогда, когда данных много — нужно специализированное внешнее хранилище (например, Microsoft Analysis Services). В этой ситуации выбирается значение xlExternal.

SourceData — обязательный во всех случаях, кроме тех, когда значение первого параметра равно xlExternal. Определяет тот диапазон данных, на основе которого и будет создаваться PivotTable. Обычно принимает в качестве значения объект Range.

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

ADOConnection — возвращает объект ADO.Connection, который автоматически создается при подключении к внешнему источнику данных. Используется для дополнительной настройки свойств подключения.

Connection — работает точно так же, как и одноименное свойство объекта QueryTable. Может принимать строку подключения, готовый объект Recordset, текстовый файл, Web-запрос, файл Microsoft Query. Чаще всего при работе с OLAP строка подключения прописывается напрямую (по-

скольку получать объект Recordset, например, для изменения данных смысла нет — источники данных OLAP практически всегда доступны только для чтения). Настройка этого свойства для подключения к базе данных FoodMart (учебная база данных Analysis Services) на сервере LONDON может выглядеть так:

PC1.Connection = «OLEDB;Provider=MSOLAP.2;Data Source=LONDON1;» _ & «Initial Catalog = FoodMart 2000»

CommandType и CommandText — описывают тип команды, которая передается на сервер баз данных, и текст самой команды. Например, чтобы обратиться к кубу Sales и получить его целиком в кэш на клиенте, можно использовать код типа:

PC1.CommandType = xlCmdCube

PC1.CommandText = Array(«Sales»)

LocalConnection — позволяет подключиться к локальному кубу (файлу cub), созданному средствами Excel. Конечно, такие файлы для работы с «производственными» объемами данных использовать очень не рекомендуется — только для целей создания макетов и т. п.

MemoryUsed — возвращает количество оперативной памяти, используемой

PivotCache. Если PivotTable на основе этого PivotCache еще не создана и не открыта, то возвращается 0. Можно использовать для проверки, если ваше приложение будет работать на слабых клиентах.

OLAP — возвращает True, если PivotCache подключен к серверу OLAP.

OptimizeCache — позволяет оптимизировать структуру кэша. Изначальная загрузка данных будет производиться дольше, но потом скорость работы может существенно возрасти. Для источников OLE DB эта оптимизация не работает.

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

Главный метод объекта PivotCache — это метод CreatePivotTable(). С его помощью и производится следующий этап — создание сводной таблицы (объекта PivotTable). Этот метод принимает четыре параметра:

TableDestination — единственный обязательный параметр. Принимает объект Range, в верхний левый угол которого будет помещена сводная таблица.

TableName — имя сводной таблицы. Если не указано, то автоматически сгенерируется имя типа «СводнаяТаблица1».

Программирование в Excel

273

ReadData — если установить в True, то все содержимое куба будет автоматически помещено в кэш. С этим параметром нужно быть очень осторожным, поскольку неправильное его применение может резко увеличить нагрузку на клиента.

DefaultVersion — это свойство обычно не указывается. Позволяет определить версию создаваемой сводной таблицы. По умолчанию задается наиболее свежая версия.

Создание сводной таблицы в первой ячейке первого листа книги может выглядеть так:

PC1.CreatePivotTable Range(«A1»)

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

область столбцов — в нее помещаются те измерения («разрез», в котором будут анализироваться данные), записей в которых меньше;

область строк — те измерения, записей в которых больше;

область страницы — те измерения, по которым нужно только проводить фильтрацию (например, показать данные только по такому-то региону или только за такой-то год);

область данных — центральная часть таблицы. Те числовые данные (например, сумма продаж), которые мы будем анализировать.

Полагаться на пользователя в том, что он правильно разместит элементы во всех четырех областях, не стоит. Кроме того, это может занять определенное время. Поэтому часто требуется расположить данные в сводной таблице программным образом. Эта операция производится при помощи объекта CubeField. Главное свойство этого объекта — Orientation, оно определяет, где будет находиться то или иное поле. Например, помещаем измерение Customers в область столбцов:

PT1.CubeFields(«[Customers]»).Orientation = xlColumnField

измерение Time — в область строк:

PT1.CubeFields(«[Time]»).Orientation = xlRowField

измерение Product — в область страницы:

PT1.CubeFields(«[Product]»).Orientation = xlPageField

и, наконец, показатель Unit Sales (числовые данные для анализа):

PT1.CubeFields(«[Measures].[Unit Sales]»).Orientation = xlDataField

16.3. Работа с базами данных

В примерах этого раздела используется файл Database.accdb, который должен быть расположен в корневом каталоге диска C.

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

16.3.1. OpenDatabase и QueryTable

16-04-Excel OpenDatabase.xlsm — пример к п. 16.3.1.

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

Полный вызов метода выглядит так:

OpenDatabase(Filename, CommandText, CommandType, BackgroundQuery, ImportDataAs)

Рассмотрим параметры метода.

  • Filename — имя и расположение базы данных.
  • CommandText — Текст запроса к базе данных. Здесь можно указать имя таблицы базы данных, которая должна быть открыта.
  • CommandType — тип запроса — xlCmdCube (куб), xlCmdList (список), xlCmdSql (SQL), xlCmdTable (таблица).
  • BackgroundQuery — если установлен в True — обработка данных ведется в фоновом режиме, если в False — в обычном.
  • ImportDataAs — способ импорта данных. Может принимать два значения — первое — xlPivotTableReport (данные будут импортированы в виде сводной таблицы — Pivot Table ), второе xlQueryTable (данные будут импортированы с помощью QueryTable — в виде обычной таблицы).

Чтобы рассмотреть пример использования этой команды, создадим простую базу данных, состоящую из двух таблиц. Первая таблица представляет собой список клиентов, вторая — список их покупок, где учитывается лишь сумма покупки на определенную дату. Таблица клиентов имеет имя Клиенты, таблица покупок — имя Покупки. Импортируем с помощью метода OpenDatabase таблицу Покупки в документ MS Excel. Предположим, что база данных хранится на диске C:, ее имя — Database.accdb. Добавим на лист MS Excel кнопку, содержащую такой код (листинг 16.5.)

Workbooks.OpenDatabase _
        Filename:="C:Database.accdb", _
        CommandText:="Покупки", _
        CommandType:=xlCmdTable, _
        BackgroundQuery:=True, _
        ImportDataAs:=xlQueryTable


Листинг
16.5.
Импорт данных из БД с использованием QueryTable

После нажатия на кнопку будет создана новая книга, лист которой, названный по имени базы данных, будет содержать импортированные данные (рис. 16.1.).

QueryTable в документе

Рис.
16.1.
QueryTable в документе

Чтобы импортировать данные как PivotTable, нам понадобится такой код (листинг 16.6.) — его мы добавим в обработчик события Click другой кнопки на рабочем листе книги-примера.

Workbooks.OpenDatabase _
        Filename:="C:Database.accdb", _
        CommandText:="Покупки", _
        CommandType:=xlCmdTable, _
        BackgroundQuery:=True, _
        ImportDataAs:=xlPivotTableReport


Листинг
16.6.
Импорт данных из БД с использованием PivotTable

На рис. 16.2. вы можете видеть результат выполнения команды — сводную таблицу, с которой можно продолжать дальнейшую работу.

Теперь рассмотрим еще один метод получения информации из БД.

16.3.2. ADO

16-05-Excel ADODB Query.xlsm — пример к п. 16.3.2.

QueryTable можно добавить на рабочий лист, предварительно настроив ее параметры.

Объекты QueryTable объединены в коллекцию QueryTables. Важнейший метод этой коллекции — Add — он добавляет новую таблицу в указанную позицию на листе. Вызов метода Add выглядит так:

WorkBook.QueryTables.Add(Connection, Destination)

В качестве параметра Connection обычно используют объект ADODB.Recordset, о котором ниже, а Destination — это объект Range, который указывает на диапазон (или ячейку), куда будет добавлена QueryTable. Если в Destination задана ячейка, левая верхняя ячейка вставляемой таблицы таблицы совпадет с ячейкой.

Для работы с базами данных используется объектная модель ADO. Чтобы подключить ее к проекту, выберите в окне References пункт Microsoft ActiveX Data Object 2.8 Library — обращаться к ней можно, используя имя объекта ADODB.

ADO — это очень мощный механизм для доступа к источникам данных. Здесь мы рассмотрим методику получения информации из БД с использованием ADO. Нас будут интересовать несколько ключевых объектов ADO.

Во-первых — это объект ADODB.Connection, который позволяет установить соединение с базой данных и работать с ней. У объекта Connection есть свойство ConnectionString — оно представляет собой строку, содержащие параметры подключения к базе данных, в частности — адрес файла базы данных и имя драйвера. Метод Open объекта Connection используется для открытия соединения, заданного свойством ConnectionString.

Во-вторых — объект ADODB.RecordSet — он позволяет получать из открытой базы данных определенные порции информации.

Для получения данных используется метод объекта Open, которому передается запрос на получение данных, а так же — открытое соединение.

Давайте рассмотрим пример. Здесь мы подключаемся к базе данных и создаем Query Table на основе объекта RecordSet, в котором хранится информация, полученная из базы (листинг 16.7.).

'Для хранения ссылки на
    'Query Table
    Dim obj_Query As QueryTable
    'Для ссылки на соединение с
    'базой данных
    Dim obj_ADOConn As ADODB.Connection
    'Для ссылки на набор записей,
    'полученный из БД
    Dim obj_ADORec As ADODB.Recordset
    'Если в ячейке A5 есть данные     'значит мы уже вставляли сюда Query Table
    'если данных нет - начинаем работу с БД
    If ActiveSheet.Range("A5") <> "" Then
        MsgBox "Уже есть Query Table в этом диапазоне"
    Else
    'Создаем новое соединение
    Set obj_ADOConn = New ADODB.Connection
    'Вносим в ConnectionString параметры
    'соединения. В Provider - имя драйвера,
    'который используется для доступа к
    'БД, а так же - параметр Data Source
    'который отвечает за адрес источника данных
    obj_ADOConn.ConnectionString = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:Database.accdb"
    'Подключаемся к базе данных
    obj_ADOConn.Open
    'Создаем новый объект RecordSet     'Он хранит результат запроса к БД
    Set obj_ADORec = New ADODB.Recordset
    'Выполняем запрос
    'В параметре Source хранится строка
    'SQL-запроса
    'В ActiveConnnection - открытое соединение
    obj_ADORec.Open _
        Source:="SELECT * FROM Покупки", _
        ActiveConnection:=obj_ADOConn
    'Создаем новую Query Table, в качестве
    'источника данных передаем заполненный
    'данными RecordSe
    Set obj_Query = _
        ActiveSheet.QueryTables.Add _
        (obj_ADORec, Range("A5"))
    'Используем метод Refresh для того
    'чтобы таблица, заполненная данными
    'была отображена на листе
    obj_Query.Refresh
    End If


Листинг
16.7.
Импорт данных из БД с использованием ADO

Если вы хотите эффективно работать с базами данных — вам придется научиться строить SQL-запросы, изучить особенности взаимодействия с различным видами БД и так далее.

16.4. Работа с диаграммами

16-06-Excel Chart.xlsm — пример к п. 16.4.

Для работы с диаграммами используют объект Chart. Чтобы добавить диаграмму на лист можно применить методом AddChart коллекции Shapes..

Такой код (листинг 16.8.) добавляет диаграмму на активный лист:

ActiveSheet.Shapes.AddChart


Листинг
16.8.
Добавление диаграммы на активный лист

Когда диаграмма добавлена, можно настроить ее свойства, в частности, при помощи метода SetSourceData задать диапазон (объект типа Range ), содержащий информацию, которая должна быть визуализирована. Этот метод принимает два параметра. Первый — Source — отвечает за источник данных, второй — PlotBy — определяет, как берутся данные для диаграммы — по столбцам ( xlColumns ) или по строкам ( xlRows ).

Так же после добавления диаграммы обычно настраивают ее тип — это делается с помощью свойства CharType. Оно может принимать одно из более чем 70 значений типа xlChartType. Например, xlConeCol — это трехмерная коническая диаграмма, xlPie — круговая диаграмма, xlLineMarkersграфик с маркерами.

Рассмотрим пример (листинг 16.9.). Добавим на рабочий лист обычную линейную диаграмму, используя диапазон значений, выделенных пользователем.

'Для хранения ссылки
    'на диаграмму
    Dim obj_Chart As Chart
    'Для хранения ссылки на
    'диапазон входных значений
    Dim obj_Range As Range
    Set obj_Range = Selection
    'Добавляем новую диаграмму и
    'тут же выделяем ее
    ActiveSheet.Shapes.AddChart.Select
    Set obj_Chart = ActiveChart
    'Настраиваем исходные данные
    'для диаграммы
    obj_Chart.SetSourceData _
        Source:=obj_Range, _
        PlotBy:=xlRows
    'Устанавливаем тип для диаграммы
    obj_Chart.ChartType = xlLine


Листинг
16.9.
Добавление диаграммы на лист Excel

16.5. Выводы

В этой лекции мы рассмотрели некоторые дополнительные возможности программирования для MS Excel. Наше следующее занятие посвящено практическим примерам программирования для MS Excel.

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

Name

querytables.Add(Connection, Destination, [Sql])

Synopsis

Creates a new query table and adds it to the worksheet. Returns a QueryTable object.

Argument

Description

Connection

A string or object reference identifying the source of the data.

Destination

A Range object identifying the upper-lefthand corner of the destination of the query table.

Sql

If the Connection argument is an ODBC data source, this argument is a string containing the SQL query to perform. Otherwise, including this argument either causes an error or is ignored.

The Connection argument has different forms, depending on the type of data source being queried as described in the following table:

Data source

Use to

Sample connection argument

Web page

Perform a web query

"URL;http://finance.yahoo.com/q/ecn?s=yhoo"

The Add method’s Connection argument uses the "URL;" prefix when performing a query on a web page. For example, the following code creates a new query table containing a real-time stock quote from Yahoo!:

    Set ws = ThisWorkbook.Sheets("Other QueryTables")
    strConn = "URL;http://finance.yahoo.com/q/ecn?s=dell"
    Set qt = ws.QueryTables.Add(strConn, [QueryDestination])
    qt.Refresh

Понравилась статья? Поделить с друзьями:
  • Vba excel protect cells
  • Vba excel static переменные
  • Vba excel protect all sheets
  • Vba excel sql like
  • Vba excel properties list