Как выбрать подмножество таблицы в Excel VBA в виде SELECT -> FROM -> WHERE - PullRequest
0 голосов
/ 03 февраля 2010

Извинения - это классический вопрос новичка, но я не смог найти конкретного ответа.

Я совершенно новичок в Excel VBA и в программировании в целом.То, что я пытаюсь сделать, это выбрать подмножество данных из большого листа Excel, который примерно в этом формате:

    Name          Data One     Data Two    Data N
    ----------------------------------------------------
    Person One       x            x          x
    Person One       x            x          x
    Person One       x            x          x
    Person Two       x            x          x
    Person Two       x            x          x
    Person Three     x            x          x

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

Моя конечная цель (на данный момент ...) - взять все данные для Человека Один и скопировать их вновый лист (в той же книге) с именем Person One, скопируйте все данные для Person Two на новый лист под названием Person Two и т. д.

Если мое элементарное понимание SQL правильное, я смог быиспользовать команду в виде SELECT data FROM table WHERE Person = Person One.

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

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

Есть ли лучший способ достичь моей цели, хотя?Я бы подумал, что этот сценарий довольно распространен, но либо нет, либо я ищу неправильные вещи.

Ура!

Стивен

1 Ответ

4 голосов
/ 03 февраля 2010

Вы можете использовать ADO:

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String

strFile = ActiveWorkbook.FullName

''Note HDR=No, then F1,F2 etc is used for column names
''If HDR=Yes, the names in the first row of the range
''can be used.
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")


cn.Open strCon

'Case sensitive
strSQL = "SELECT [Name],[Data One],[Data Two],[Data N] FROM [Sheet1$] " _
       & "WHERE [Name]='Person 1'"


rs.Open strSQL, cn, 3, 3
Worksheets("Sheet2").Cells(2, 1).CopyFromRecordset rs

Обратите внимание, что вы можете выбрать отдельное [имя] и циклически просмотреть полученный набор записей, чтобы получить лист для каждого человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...