Как запросить встроенную таблицу Excel с помощью vba?

Мне явно не хватает знаний по запросам excel. Мне нужно распечатать несколько пользовательских этикеток с заказанными статьями каждого работника.

В моем примере у меня есть 2 таблицы:

      [tabWorkers]
      ID        Name
      1         John
      2         Patrick


      [tabOrders]
      ID        Article   Amount
      1         Shoe      2
      1         T-Shirt   5
      2         T-Shirt   3

Я просматриваю tabWorker, и для каждой работы я хотел бы запросить свою таблицу tabOrders: SELECT * FROM tabOrders WHERE ID=1

Пример синтаксиса того, что я хочу:

    Dim row As Range 
    For Each row In [tabWorkers].Rows 
      myID = row.Columns(row.ListObject.ListColumns("ID").Index).Value

      Write( row.Columns(row.ListObject.ListColumns("Name").Index).Value & " has ordered...<p>" )

      For Each (Article, Amount) In "SELECT * FROM tabOrders WHERE ID ='" & myID & "'")
        Write( Amount & " x " & Article & "<br>" )
      Next

    Next 

person Tiele Declercq    schedule 20.09.2012    source источник
comment
я могу применить фильтр к моей таблице: [tabOrders].ListObject.Range.AutoFilter Field:=1, Criteria1:=myID, но при циклическом выполнении [tabOrders].Rows я все равно получаю все свои строки..   -  person Tiele Declercq    schedule 20.09.2012
comment
Только отвечая на ваш комментарий, но взгляните на метод SpecialCells(xlCellTypeVisible) объекта диапазона.   -  person markblandford    schedule 20.09.2012


Ответы (1)


Я уже использовал это решение на больших наборы данных, он работает хорошо, пока данные на вкладке хорошо определены

В основном установите ссылку на ADO, затем определите соединение с рабочим листом, помните $ в конце имени каждого рабочего листа :)

Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
Dim strSQL as String

Set cn = New ADODB.Connection
cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name

cn.Open

strSQL = "Select Distinct [Name] From [tabWorkers$] Order by [Name]"

Set rs = New ADODB.Recordset
rs.Open cn, strSQL, adOpenStatic, adLockReadOnly

'// then use the recordset
for each .......

rs.Close
person spences10    schedule 08.01.2013