Как загрузить отфильтрованную таблицу запросов в электронную таблицу Excel?

#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