Мне нужно динамически (и быстро) импортировать часть данных из таблицы Access (большая) в Excel - PullRequest
2 голосов
/ 09 марта 2012

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

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

Проблема в том, что на этот раз мне нужно обработать 6.000.000+ строк данных (и их количество). Хранить все это в листе Excel не вариант. Кроме того, данные уже представлены в виде таблицы доступа.

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

Должен быть более быстрый способ сделать это! Мне нужен весь этот процесс, чтобы чувствовать себя «мгновенным».

Есть мысли?


Edit: Ok, проблема, похоже, связана с тем фактом, что моя таблица доступа на самом деле является связанной таблицей, указывающей на файл * .txt. Это сильно замедляет импорт.

Я попробовал оба предложенных решения.

Идея iDevlop работает довольно быстро (200 000 строк импортируются за 10-15 секунд), но у меня есть недостаток в том, что мне приходится каждый раз обновлять таблицу. Я опубликую еще один вопрос, как он предложил, чтобы увидеть, как и можно ли автоматизировать процесс.

Сценарий Рему тоже отлично работает сейчас (мне было трудно понять его правильно, но он был действительно открытым и полезным, поэтому знайте, что я его понял) и, хотя и медленнее, он имеет преимущество, не требующее какого-либо обслуживания базы данных.

Есть еще несколько вещей, которые мне нужно выяснить, прежде чем выбирать, какой подход использовать. Пока все, что я хочу сказать, это спасибо вам, ребята, за вашу помощь! Я бы никогда не сделал это без тебя !!!

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Не беспокойтесь о доступе через Access, если у вас есть текстовый файл. Это может удерживать вас до тех пор, пока вы не добьетесь лучшей системы на месте.

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim s As String
Dim i As Integer, j As Integer

strFile = "z:\docs\"

''Note that if HDR=No, F1,F2 etc are used for column names,
''if HDR=Yes, the names in the first row of the range
''can be used.
''
''Connection strings : http://www.connectionstrings.com/excel

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
    & ";Extended Properties=""Text;HDR=Yes;IMEX=1"";"

''Late binding, so no reference is needed

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

cn.Open strCon

strSQL = "SELECT * " _
       & "FROM [test.txt] a " _
       & "WHERE a.FirstName ='Bernard'"

rs.Open strSQL, cn, 3, 3


''Pick a suitable empty worksheet for the results

Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs

''Tidy up
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

Если ваш файл разделен табуляцией, вы можете использовать schema.ini (http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx). Он должен находиться в том же каталоге, что и ваш текстовый файл, и содержать только две строки:

[Ordini BO new.txt]
Format=TabDelimited

Строка подключения должна выглядеть следующим образом:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Text;HDR=No;IMEX=1;FMT=Delimited"";"
2 голосов
/ 09 марта 2012

Как говорит Рему, проверьте xour индексы, но также убедитесь, что ваши критерии введены таким образом, что позволяют использовать индексы!
например: WHERE Format(myDate,"yyyy-mm") = "2011-09" не позволяет оптимизировать индекс даты,
в то время как WHERE myDate BETWEEN #09/01/2011# AND #09/30/2011# разрешает оптимизацию индекса.


Edit:
Если у вас есть какой-то уникальный идентификатор в текстовом файле, и вы переводите его в PK в дизайне таблицы, вы можете импортировать все это на регулярной основе, и дубликаты будут удалены PK. Импорт может быть автоматизирован, даже с .vbs, вам не нужен доступ для этого. Задайте другой вопрос, если вы застряли. Вы также можете попросить ИТ-специалистов удалять старые записи каждый месяц или около того.

...