Тема: Фильтрация таблицы Excel

Добрый день! Имеется огромный список из нескольких столбцов в таблице Excel, возможно ли из программы AutoCAD  отфильтровать список по значению первого столбца. Если VB поочередно опрашивать каждую строку таблицы и анализировать ее значение, то получается очень долго. Поэтому напрашивается решение сперва отфильтровать всю таблицу по критерию переданному из AutoCAD, а лишь затем  получить доступ к оставшимся строкам таблицы. Подскажите пожалуйста как это сделать и ускорит ли это процесс поиска данных.

Re: Фильтрация таблицы Excel

> Андрей
У меня не стоит на машине VB но в VBA
из Автокада это работает

Option Explicit
' based on macros written by Ken Puls
' www.exelguru.ca
' edited by Fatty 29/04/07
Private Sub SortByFirstColumn(ByVal rang As Range, ByVal order As Integer)
     rang.Activate
     rang.Select
     With Selection
          .Sort Key1:=Range("A1"), Order1:=order, Header:=xlGuess, _
                OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                DataOption1:=xlSortNormal
     End With
     Cells(1, 1).Select
End Sub
Public Sub SortDiapazone()
' Force to late Excel binding
' (with early biding works also)
     Dim xlApp As Object 'Excel.Application
     Dim xlBook As Object 'Excel.Workbook
     Dim xlSheet As Object 'Excel.Worksheet
' Specify the sort order
     Dim shift As String
     shift = InputBox(vbCrLf & "Enter a sorting order of the column" & vbCrLf & _
                      "(1 - by acsending,2 - by descending)", "Sorting Order", "2")
     Dim order As Integer
     order = CInt(shift)
     On Error Resume Next
     ' Clear any errors
     Err.Clear
     ' See if Excel is running
     Set xlApp = GetObject(, "Excel.application")
     ' If Excel not running start a new session
     If Err <> 0 Then
          Err.Clear
          ' Start Excel if excel is not running
          Set xlApp = CreateObject("Excel.application")
          If Err <> 0 Then
               MsgBox " Could not start Excel ! , Is Excel Installed ? ", vbCritical, " Excel Error ! "
               Err.Clear
          End If
     End If
     Err.Clear
     On Error GoTo Err_Control
     ' Make excel application visible
     xlApp.Visible = True
     ' Minimize application window so we don't see it
     ' (optional, change by suit)
     xlApp.WindowState = xlMinimized
     ' Make Autocad window maximum
     AcadApplication.WindowState = acMax
     ' Open the desired book
     Set xlBook = xlApp.Workbooks.Open(FileName:="D:\Temp\table.xls")'// имя файла изменить
     MsgBox xlBook.Name     '// debug only
     Set xlSheet = xlBook.Worksheets("Sheet1") '// имя листа изменить
     ' Make sheet 1 the active sheet
     If Not xlSheet Is Nothing Then
          xlSheet.Activate
     Else
          MsgBox "The work sheet " & """Sorted""" & " not found" & vbCrLf & _
                 "Exit by error occurance."
          GoTo Exit_Here
     End If
     ' Sort the first column by defined criteria
     Dim rang As Range
     Set rang = xlSheet.UsedRange
     Call SortByFirstColumn(rang, order)
Exit_Here:
     Set xlSheet = Nothing
     xlBook.Save
     xlBook.Close
     Set xlBook = Nothing
     xlApp.WindowState = xlMaximized
     xlApp.Quit
     Set xlApp = Nothing
     Exit Sub
Err_Control:
  If Err.Number <> 0 Then
  MsgBox Err.Description
     ' Close book and clean up
     xlBook.Save
     xlBook.Close     '//Savechanges:=True
     xlApp.WindowState = xlMaximized
     xlApp.Quit
End If
End Sub

~'J'~

Re: Фильтрация таблицы Excel

Большое спасибо!!! Стараюсь разобраться .

Re: Фильтрация таблицы Excel

> Андрей
Забыл добавить, что здесь следует только
простая сортировка больше или меньше,
поскольку мне неизвестно какой критерий
сортировки ты будешь задавать из Автокада
~'J'~

Re: Фильтрация таблицы Excel

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

Re: Фильтрация таблицы Excel

> Андрей
Скинь на webfile.ru файл Эксель а ссылку выложи сюда
Там нарисуй для примера коротенько две таблицы
одну исходную а вторую как отфильтрованый вариант
первой
А то тут гадать можно до бесконечности

Re: Фильтрация таблицы Excel

Спасибо за ваше внимание.
Я попробую упростить вопрос и изложить свою проблему простым языком. В таблице Excel допустим в первом столбце ведены условные номера элементов, а во втором и последующих столбцах его наименование и характеристики. В различных строках условный номер может повторяться.
12    Стол рабочий
3     Полка настольная
45    Стеллаж
33    Стул
3     Полка настенная
5     Вешалка
Мне нужно временно скрыть (отфильтровать) строки отличающиеся от заданного из программы AutoCAD номера.   Допустим если цифра 3, то должно получиться
3     Полка настольная
3     Полка настенная
А если 45, то
45    Стеллаж.
Все другие строки номер которых в первом столбце которых не совпадает с заданным, должны быть скрыты. После этого я бы хотел иметь возможность считать в свою форму данные по оставшимся строкам.
Так как строк очень много, я надеюсь, что такой способ намного ускорит процес считывания.

Re: Фильтрация таблицы Excel

Нашел похожую задачу
http://forum.codenet.ru/showthread.php? … post105186
Возможность фильтровать через макрос.
Sub Макрос1()
'
Selection.AutoFilter Field:=11, Criteria1:="=Вася", _
Operator:=xlOr, Criteria2:="=Петя"
End Sub
Но решить свою проблему не смог.

Re: Фильтрация таблицы Excel

> Андрей
Лучше все-таки иметь конкретный файл
Хотя в принципе понятно
Здесь можно обойтись простой итерацией
Я так понимаю что нужно заполнить данными
листбокс или комбобобох?
Сколько столбцов?
Зачем тогда скрывать строки?
~'J'~

Re: Фильтрация таблицы Excel

Совершено верно, я  заполняю этими данными листбокс.
Сейчас у меня данный кусок программы работает следующим образом. Программа AutoCAD устанавливает связь с Excel, а затем опрашиваются все значения первого столбца, если оно соответствует заданному числу, то вся строка переноситься в листбокс. Но так как таблица очень большая то процесс заполнения листбокса затягивается.
Поэтому я думаю применить к таблице фильтр (наподобие команды из меню Excel ДАННЫЕ/ФИЛЬТР), а лишь затем загружать оставшиеся данные в листбокс.

Re: Фильтрация таблицы Excel

Кажется понял.
Нужно было определить UsedRange, а затем применит AutoFilter. Получилось!!!
Большое спасибо за подсказки.

Re: Фильтрация таблицы Excel

> Андрей
Или как я говорил раньше через итерацию
(с другого компьютера, поэтому русские подсказки
не читаются, сам догадаешься)

Option Explicit
Private Sub CommandButton1_Click()
     Unload Me
End Sub
Private Sub UserForm_Initialize()
     ListBox1.ColumnCount = 2
     ListBox1.BoundColumn = 1
     ListBox1.Clear
     Dim coll As New Collection
     ' get data by filtering
     Set coll = QueryTable()
     MsgBox "&#205;&#224;&#233;&#228;&#229;&#237;&#238; &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#242;&#226;&#232;&#233;: " & coll.Count
     If coll.Count > 0 Then
          Dim i As Integer
          ReDim arr(coll.Count - 1, 1) As String
          ' convert collection to multi-dimensional array
          For i = 1 To coll.Count
               arr(i - 1, 0) = coll.Item(i)(0)
               arr(i - 1, 1) = coll.Item(i)(1)
          Next
          ' populate listbox with array items
          ListBox1.List() = arr
     Else
          ' exception message
          MsgBox "&#205;&#229;&#242; &#241;&#242;&#240;&#238;&#234; &#241; &#242;&#224;&#234;&#232;&#236;&#232; &#237;&#238;&#236;&#229;&#240;&#224;&#236;&#232;"
          End
     End If
End Sub
Public Function QueryTable() As Collection
' Force to late Excel binding
' (with early biding works also)
     Dim xlApp As Excel.Application
     Dim xlBook As Excel.Workbook
     Dim xlSheet As Excel.Worksheet
     ' Specify the sort num
     Dim shift As String
     shift = InputBox(vbCrLf & "&#194;&#226;&#229;&#228;&#232;&#242;&#229; &#237;&#238;&#236;&#229;&#240; &#232;&#231;&#228;&#229;&#235;&#232;&#255;" & vbCrLf & _
                      "&#228;&#235;&#255; &#226;&#251;&#225;&#238;&#240;&#234;&#232; &#232;&#231; &#241;&#239;&#232;&#241;&#234;&#224;:", "&#207;&#238;&#231;&#232;&#246;&#232;&#255;")
     On Error Resume Next
     ' Clear any errors
     Err.Clear
     ' See if Excel is running
     Set xlApp = GetObject(, "Excel.application")
     ' If Excel not running start a new session
     If Err <> 0 Then
          Err.Clear
          ' Start Excel if excel is not running
          Set xlApp = CreateObject("Excel.application")
          If Err <> 0 Then
               MsgBox " Could not start Excel ! , Is Excel Installed ? ", vbCritical, " Excel Error ! "
               Err.Clear
          End If
     End If
     Err.Clear
     On Error GoTo Err_Control
     ' Make excel application visible
     xlApp.Visible = True
     ' Minimize application window so we don't see it
     ' (optional, change by suit)
     xlApp.WindowState = xlMinimized
     ' Make Autocad window maximum
     AcadApplication.WindowState = acMax
     ' Open the desired book
     Set xlBook = xlApp.Workbooks.Open(FileName:="D:\AUTOLISP\LISPS\PRIMITIVES\#EXCEL\table.xls")
     '//MsgBox xlBook.Name     '// debug only
     Set xlSheet = xlBook.Worksheets(1)
     ' Make sheet 1 the active sheet
     If Not xlSheet Is Nothing Then
          xlSheet.Activate
     Else
          MsgBox "The work sheet " & """Sorted""" & " not found" & vbCrLf & _
                 "Exit by error occurance."
          GoTo Exit_Here
     End If
     Dim rang As Range
     Set rang = xlSheet.UsedRange
     rang.Select
     Dim target As Range
     Set target = rang.Range(Cells(1, 1), Cells(rang.Rows.Count, 1))
     target.Activate
     target.Select
     '//Debug.Print "Rows " & rang.Rows.Count'//
     Dim coll As Collection
     Set coll = New Collection
     Dim i As Long
     For i = 1 To target.Rows.Count
          Dim found As Range
          Set found = target.Cells(i, 1)
          '
          If CStr(found.Value) = shift Then
               Dim tmp(1) As String
               tmp(0) = CStr(found.Value)
               tmp(1) = CStr(found.Offset(0, 1).Value)
               coll.Add tmp
          End If
     Next
Exit_Here:
     Set xlSheet = Nothing
     xlBook.Save
     xlBook.Close
     Set xlBook = Nothing
     xlApp.WindowState = xlMaximized
     xlApp.Quit
     Set xlApp = Nothing
Err_Control:
     If Err.Number <> 0 Then
          MsgBox Err.Description
          ' Close book and clean up
          xlBook.Save
          xlBook.Close     '//Savechanges:=True
          xlApp.WindowState = xlMaximized
          xlApp.Quit
     End If
     Set QueryTable = coll
End Function

~'J'~

Re: Фильтрация таблицы Excel

Большое спасибо!!!

Re: Фильтрация таблицы Excel

> Андрей
Успехов и,
кстати очень хороший материал по AutoFilter:
http://proofficedev.com/blog/2007/04/10 … -in-excel/
~'J'~