Перечисление подмножества таблиц MS Access в MS Excel с VBA - PullRequest
1 голос
/ 29 мая 2009

У меня есть ряд магазинов запросов / таблиц в базе данных MS Access 2002, который начинается с «RP_». Я хотел бы перечислить эти имена таблиц в меню списка в электронной таблице MS Excel 2002. Есть идеи как это сделать?

Ответы [ 4 ]

3 голосов
/ 29 мая 2009

Есть много способов достичь этого.
Вот один из них:

  • Добавьте элемент ActiveX ComboBox в форму (скажем, ComboBox1) и свяжите его свойство LinkedCell с ячейкой, в которой вы хотите сохранить результат.

  • Добавьте ссылку на «Библиотеку объектов Microsoft DAO 3.6» в вашу книгу Excel (ALT-F11, чтобы открыть IDE, затем выберите Инструменты> Ссылки ...).
    Эти компоненты MDAC уже должны быть установлены на всех современных компьютерах.
    Обратите внимание, что если вы используете Office 2007, вам лучше будет ссылаться на « Библиотека объектов ядра базы данных Microsoft Office 12.0 Access» , поскольку это позволит вам также открывать более новые базы данных ACCDB Access 2007.

  • Вставьте новый модуль в вашу книгу и вставьте в нее код:

    ' Fill the given combobox with all the tables and query names '
    ' starting with RP_ found in the given database. '
    Public Sub FillWithAccessEntities(PathToAccessDB As String, combox As ComboBox)
        Dim db As DAO.Database
        Dim td As DAO.TableDef
        Dim qd As DAO.QueryDef
        combox.Clear
        ' Open the db in exclusive and read-only mode '
        Set db = DBEngine.OpenDatabase(PathToAccessDB, True, True)
        For Each td In db.TableDefs
            If Left(td.Name, 3) = "RP_" Then
                combox.AddItem td.Name
            End If
        Next
        For Each qd In db.QueryDefs
            If Left(qd.Name, 3) = "RP_" Then
                combox.AddItem qd.Name
            End If
        Next
        db.Close
        Set db = Nothing
    End Sub
    
  • Чтобы инициализировать комбинированный список, мы можем вызвать этот код, например, из события Open рабочей книги.
    В модуле ThisWorkbook вставьте этот код, предполагая, что комбинированный список ActiveX ComboBox1 был добавлен к Sheet1:

    Sub Workbook_open()
        FillWithAccessEntities "c:\mydb.mdb", Sheet1.ComboBox1
    End Sub
    

Теперь, когда вы откроете файл, поле со списком будет автоматически заполнено таблицами и именами запросов из базы данных.

2 голосов
/ 29 мая 2009

Проблема, с которой вы сталкиваетесь с ошибками ODBC в Excel, вероятно, вызвана проблемой с правами доступа к самой базе данных. По умолчанию учетная запись администратора (которую вы, скорее всего, используете) не имеет разрешений на чтение для объектов MSysObjects. Вы можете исправить это, зайдя в пользовательские разрешения и предоставив доступ на чтение к этой таблице для учетной записи администратора. Сложность такого подхода заключается в том, что разрешения хранятся в файле system.mdw на вашем локальном компьютере (при условии, что вы не изменили это). Это означает, что вам нужно будет исправить разрешения на каждом компьютере, который использует код, который вы создаете.

Однако вы можете избежать всей проблемы с помощью библиотеки расширений ADO. Код, размещенный ниже, должен «Просто запустить», если вы дадите ему правильный путь в БД.

Option Explicit

Public Sub Example()
    EnumerateDBTables Range("A1:A2"), "C:\Test\db1.mdb"
End Sub

Public Sub EnumerateDBTables(ByVal target As Excel.Range, ByVal dbPath As _
    String, Optional ByVal clearSheet As Boolean = True)
    'Requires reference to Microsoft ADO Ext. 2.8 for DDL and Security
    'If you have trouble finding it, look here:
    'C:\Program Files\Common Files\System\ado\msadox28.tlb
    Dim cat As ADOX.Catalog
    Dim tbl As ADOX.Table
    Dim ws As Excel.Worksheet
    Dim lngRow As Long
    Dim lngCol As Long
    Set ws = target.Parent
    If clearSheet Then ws.UsedRange.Clear
    Set cat = New ADOX.Catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
        dbPath
    'Add Headers:
    ws.Range(target.Cells(1, 1), target.Cells(1, 1).Offset(0, 3)) = _
        Array("Name", "Type", "Created", "Modified")
    lngRow = target.Row + 1&
    For Each tbl In cat.Tables
        lngCol = target.Column
        ws.Cells(lngRow, lngCol) = tbl.Name
        ws.Cells(lngRow, lngCol + 1&) = tbl.Type
        ws.Cells(lngRow, lngCol + 2&) = tbl.DateCreated
        ws.Cells(lngRow, lngCol + 3&) = tbl.DateModified
        lngRow = lngRow + 1&
    Next
    ws.UsedRange.Columns.AutoFit
End Sub

Edit:

Технически вы можете выполнить это даже без написания кода ... Самая оптимальная программа из всех ... 0 строк :) Вот как это сделать:

- Open the database you want to query.
- Go to to Tools>Security>User And Group Permissions.
- In the box marked "User/Group Name", select "Admin".
- In the box marked "Object Name" select "MysObjects".
- In the area marked "Permissions" (Just below), checkmark the box named "Read Data"
- Click Ok Close the database.
- Open Excel.
- Go to Data>Import External Data>New Database Query.
- Select MS Access Database.
- Uncheck "Use Query Wizard".
- Click OK.
- Browse to Database.
- Click Options.
- Check "System Tables".
- Click OK.
- Build Your Query.
- Click Close.
- Now click View then SQL.
- Paste your SQL.
- Now close the window via the Red X in the upper-right hand corner and you will be prompted for a destination range. 
- Tada!
2 голосов
/ 29 мая 2009

В окне VBA Immediate с открытой базой данных Access я делаю следующее:

? access.CurrentData.AllQueries.Count
 11 
? access.CurrentData.AllQueries.Item(1).Name
ATP Underwrites Chinese

Итак, в Access есть класс CurrentData coClass со свойством AllQueries, которое можно подсчитывать и разбивать на части.

В Excel определить ссылку на объект Microsoft Access. Затем вставьте что-то вроде этого в модуль VBA:

Function Queryname(n As Integer) As Variant
    Dim v As Variant
    Dim c As Long
    c = Access.CurrentData.AllQueries.Count
    v = Access.CurrentData.AllQueries.Item(n).Name
    Queryname = v
End Function

тогда на листе вы сможете сказать

=Queryname(1)

и получите что-нибудь полезное.

Кстати, Access должен быть запущен в то время, как я должен думать.

0 голосов
/ 29 мая 2009

В Excel вы можете использовать ADO (объекты данных ActiveX) для работы непосредственно с базой данных Access. Прежде чем вы сможете использовать ADO в Excel, вам нужно обратиться к соответствующей библиотеке (например, к библиотеке Microsoft ActiveX Data Objects 2.8) через Инструменты> Ссылки в редакторе Visual Basic. Эта страница должна помочь вам начать использовать ADO.

Вы можете найти этот пример использования метода OpenSchema объекта Connection для возврата имен таблиц в базе данных и этого примера подключения к Доступ к базе данных будет полезным

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