2009-06-30 2 views
2

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

Каков наилучший способ получить данные из электронной таблицы и как лучше всего провести сравнение. Что касается получения данных из электронной таблицы, ACEDAO представляется лучшим вариантом, поскольку это Excel 2007, но MSDN не имеет никакой информации, которую я мог бы найти о том, как запросить Excel с помощью DAO/ACEDAO, только для экспорта в Excel с использованием DAO/ACEDAO. Что касается выполнения сравнения, не сравнивая каждый столбец каждой записи, я не могу найти лучшего способа сделать это.

+0

Это одноразовый процесс? Если это так, вы можете импортировать лист Excel в БД доступа с использованием Access и создать SQL-запросы с помощью средства Access QBE для создания требуемого отчета. –

+0

Это не разовый процесс; он повторяется по установленному графику. –

ответ

3

Если память служит, вы можете создать связанную таблицу с электронной таблицей Excel. Как только он связан с Access, вы можете рассматривать его как любую другую таблицу.

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

Что касается автоматизации, если вы хотите оставить копию доступа, вы можете set up a Timer in a form. Если нет, вам нужно будет использовать Office Automation. Смотрите здесь для "привет мир", например, в C#:
http://rnarayana.blogspot.com/2008/02/access-2007-office-automation-using-c.html

alt text http://i42.tinypic.com/kalk0k.jpg

+0

Спасибо за идею автоматизации Office. Я планировал запустить Macro, запускающий обновления при запуске, и запуск этой БД в Access с пакетным файлом. –

+0

Я создал эту структуру в запросе (JOIN LEFT from spreadsseet к таблице, где ID - NULL); однако он не прошел тест Is Null и возвращает все записи, а не те, которые отсутствуют в таблице. –

+1

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

1

Если рабочие листы Excel структурированы в виде списков, то ADO может быть путь - подробнее here


Редактировать: здесь существует несколько различных возможных подходов

  • использовать ADO в Excel для чтения из базы данных Access и использовать VBA для сравнения возвращаемых значений с листом Excel. Вероятно, только будет полезен для простых сравнений на относительно небольших наборов записей

  • , как описано в ответ Роберта Харви, сделать рабочий лист EXcel связанной таблицы в базе данных Access и запроса с SQL с помощью Access сам

  • с помощью ADO и ADOX сделать электронную таблицу Excel присоединенной таблицы в базе данных Access и SQL запросов с использованием ADO в Excel

Я не понимал, что DAO вернулся в использовании с Access 2007. Как я использую Excel для подключения к базы данных, DAO устарела в течение многих лет (при этом ADO является предпочтительным ed). Теперь я знаю лучше

+0

В предыдущем вопросе я спросил, будет ли ADO или DAO лучше, и DAO был ответом, поскольку ACEDAO является стандартом для ACEDB в Access 2k7: http://stackoverflow.com/questions/1039224/is-it-better -to-use-ado-or-dao-in-access-2007/1041717 –

+0

В ответ на * этот * вопрос я ответил (перефразировал), что вы не должны использовать исключительно ACEDAO или ADO, но используйте то, что имеет смысл в любом данный случай. В более чем 99% случаев между ними нет существенной разницы. Это разработка программного обеспечения, а не философия :) – onedaywhen

+0

Совместимы ли записи ADO и ACEDAO? –

1

Используя ACE, вы можете запросить книгу непосредственно, например.

SELECT S1.seq AS seq_ACE, 
     S2.seq AS seq_Excel 
    FROM Sequence AS S1 
     LEFT OUTER JOIN [Excel 12.0;Database=C:\Test.xlsx;].Sequence AS S2 
      ON S1.seq = S2.seq; 
0

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

Это быстрый, грязный, без излишеств способ сделать это, но он работает и требует очень небольшой дополнительной работы.

Примечание: Если таблица ДЕЙСТВИТЕЛЬНО большая или активно используется другими, возможно, вы не захотите этого делать. Он может быть медленным и вводить много блокировок.

+0

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

+0

Я использовал его миллион раз для запросов типа «Можете ли вы удалить все элементы из таблицыX с одним из кодов продуктов, перечисленных в прилагаемой таблице?» – JohnFx

Смежные вопросы