Как сопоставить данные в Excel с базой данных Access? - PullRequest
0 голосов
/ 24 апреля 2018

Я использую Excel и Access 365 для записи.

У меня есть информация о 100 000 номеров счетов, что слишком много для эффективной обработки в Excel.Я положил их в Access.

В Excel у меня есть список из примерно 10 номеров счетов.Этот список меняется ежедневно.Как получить информацию об учетной записи из Access в Excel?Если бы мне удалось сохранить все в Excel, я бы использовал INDEX MATCH, что эквивалентно получению информации из Access?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Я бы предложил настроить связанную таблицу для Excel в Access и запустить оператор SQL. Гораздо проще, чем циклы в VBA.

  1. Открытый доступ
  2. Создать связанную таблицу с рабочим листом Excel, которая является не чем иным, как информацией о подключении к рабочему листу; фактически он не хранит записи из рабочего листа.

Это позволяет следующее:

  • Изнутри Access - запускать запросы, объединяющие данные между таблицами Access и связанной таблицей Excel. Вы можете сохранять такие запросы, использовать их как RecordSource для формы или отчета и т. Д.
  • Из Excel - вы можете открыть соединение ADO из Excel и запустить SQL-оператор, соединяющий таблицы Access и связанную таблицу Excel. Затем вы можете использовать метод Excel Range.CopyFromRecordset, чтобы вставить эти результаты в лист Excel.
0 голосов
/ 01 мая 2018

Звучит так, как будто вам нужно использовать предложение «In». У меня есть следующие данные на листе 2 в диапазоне A1: A5.

Ryan
Sam
Timmy
Tommy
Teddy

Вставьте приведенный ниже код в модуль и установите ссылку на «Microsoft Active X Data Objects 2.8 Library» в разделе «Инструменты» в окне VBE.

Sub Import()

 Dim connect As ADODB.Connection
 Dim rec1 As ADODB.Recordset
 Dim wb As Worksheet
 Dim Wb2 As Worksheet
 Dim Param() As ADODB.Parameter
 Dim Command1 As ADODB.Command
 Dim lrow As Integer
 Dim i As Integer
 Dim ConcatSQL As String


 Set wb = ActiveWorkbook.Sheets("Sheet1")
 Set Wb2 = ActiveWorkbook.Sheets("Sheet2")
 lrow = Wb2.Range("A" & Wb2.Rows.Count).End(xlUp).Row

 'Concatenate desired range into one cell
 For i = 0 To lrow
 ConcatSQL = ConcatSQL & "'" & Wb2.Cells(i + 1, 1) & "'" & ","
 Next i
 ConcatSQL = "(" & Left(ConcatSQL, Len(ConcatSQL) - 1) & ")"

 'Open Command Object with One Paramter
 Set Command1 = New ADODB.Command

 With Command1
    .CommandText = " Select ID, Price from TABLE where ID IN " & ConcatSQL
    .CommandType = adCmdText
    .CommandTimeout = 600
 End With


 'Connect to Data Source
  Set connect = GetNewConnection 'Represents Private Function with Connection String
  Command1.ActiveConnection = connect

  Set rec1 = New ADODB.Recordset
  Set rec1 = Command1.Execute()

  'Paste Results
  wb.Activate

 With wb.QueryTables.Add(Connection:=rec1, Destination:=wb.Range("A1"))
 .Name = "data"
 .FieldNames = True
 .Refresh BackgroundQuery:=False
  End With

 'Close Connections
 rec1.Close
 connect.Close
 Set rec1 = Nothing
 Set connect = Nothing

 End Sub

Вот снимок экрана, показывающий, как создаются переменные.

enter image description here

Я на 100% уверен, что вы можете выполнить простой запрос в Access и экспортировать результаты этого запроса в Excel. Или сохраните этот запрос и импортируйте записи объекта в Excel. Когда вы получаете большие наборы данных, как вы описали, вы можете рассмотреть возможность использования различных инструментов для работы. Python и R приходят на ум.

0 голосов
/ 24 апреля 2018

Для этого, вероятно, потребуется эффективная работа VBA.

Циклически просматривая номера счетов, и для каждого номера счета запрашивайте базу данных Access (используя ADO) и возвращайте только необходимые данные для каждой учетной записи.

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