#excel #vba
#excel #vba
Вопрос:
При условии, что у меня есть данные в следующем формате в БД:
-------- -------- -------
| Server | Client | Usage |
-------- -------- -------
| London | Bob | 10% |
| London | Alice | 20% |
| Tokyo | Charlie| 30% |
| Tokyo | Zeke | 40% |
-------- -------- -------
Я хотел бы иметь электронную таблицу, содержащую данные для каждого Server
, но я не знаю заранее, какие серверы будут присутствовать и в каких количествах. Через данные> Соединение, которое я создал, CommonConnection получит все данные.
Вопрос: Есть ли способ отображать информацию для каждого сервера в отдельной электронной таблице, используя это единственное соединение? Что-то вроде SELECT * FROM %CommonConnection% WHERE Server='London'
( %%
синтаксис умозрительный).
Я пишу скрипт VBA, который будет считывать серверы, создавать электронные таблицы для каждого и настраивать фильтры. Теперь, похоже, мне нужно будет установить соединение для списка серверов, а затем создать выделенное соединение для каждого из серверов. Это соединение необходимо будет удалить при перезагрузке, поскольку я не знаю точного количества серверов.
Комментарии:
1. Является ли этот отчет для распространения в виде статического документа или его можно обновить позже? Возможно, вам было бы лучше рассмотреть возможность использования ADO и создания таблиц по мере обработки результирующего набора.
2. Я изучаю возможность распространения документа (в интрасети), который мог бы обновляться сам. В настоящее время (но ограниченное) аналогичное решение существует.
Ответ №1:
Хорошо, я не нашел собственного способа сделать это, поэтому все делается с помощью макроса. Это решение имеет несколько недостатков, один из которых заключается в том, что у вас должно быть специальное расширение для рабочей книги с поддержкой макросов .xlsm
.
Set cnt = New ADODB.connection
Set rst = New ADODB.Recordset
cnt.Open "Provider=SQLOLEDB.1;Integrated Security= ...."
rst.Open "SELECT ...", cnt
While Not rst.EOF
server = rst.Fields(0).Value
' get other values as well
Worksheets(server).Range("whatever").Value = Array(server, value1, value2, etc)
Wend