W programie Excel mam połączoną tabelę do tabeli dostępu "TBL_Output"

Obecnie istnieje ręczny krok, który przed uruchomieniem makro Excela muszę wejść do bazy danych i otworzyć zapytanie do tabeli tworzenia i ręczne wprowadzić kryteria i uruchomić. Zadzwoń do tego pola "Nazwa dostawcy"

Ta nazwa dostawcy istnieje w dokumencie Excel. Czy można zadeklarować tę zmienną w programie Excel, przekazać go, aby uzyskać dostęp i uruchomić zapytanie do tworzenia tabeli za pomocą tej zmiennej jako jego kryteria.

Zadanie zostanie uruchomione dla wielu dostawców, więc jeśli mogę zautomatyzować ten krok, mogę utworzyć pętlę, aby przejść przez wszystkich dostawców.

Próbowałem obejścia, mając połączoną tabelę obrotową do źródła danych, które opiera się na stole TABLE OFF, a następnie filtrowanie w samej tabeli Pivot Excel, ale ze względu na dużą ilość danych odświeżanie trwa zbyt długo.

Przepraszam, jeśli jest to coś oczywistych. Kodowanie VBA z dostępem jest coś, czego nie znam.

0
Ric Hutton 26 luty 2019, 13:13

2 odpowiedzi

Najlepsza odpowiedź

Nie 100% na pytanie, które jest pytany, ale zrobię na nim strzał. Poniższy kod zostanie wykonany listę nazw dostawców [Identyfikatory dostawcy] i będzie pętlą przez listę wykonującą zapytanie do tworzenia tabeli dla każdego z identyfikatorów dostawców zawierających informacje dla tego konkretnego dostawcy

Sub umCreateDBTables()
    Dim DBPath As String ' Path to the database with the information
    Dim DBPath2 As String ' Path to the database to store the newly created tables in
    Dim xlCell As Range
    Dim sSQL As String
    Dim DB As DAO.Database
    Dim VenID As String
    Dim i As Integer
        DBPath = "C:\DB_Temp\AccessDB_A.accdb"
        DBPath2 = "C:\DB_Temp\AccessDB_B.accdb"
        Set DB = OpenDatabase(DBPath, True, False)
        Set xlCell = Range("A2") ' Assumes that this is the beginning of the column with your vendor ids
        Do Until xlCell.Value = "" ' Loops through the list of vendor ids until it gets to an empty cell
            VenID = "v_" & xlCell.Value ' would be best to feed this through a function to strip out any invalid db field name characters
            sSQL = "SELECT T1.F1, T1.F2, T1.F3, INTO " & VenID & " IN '" & DBPath2 & "' FROM T1 WHERE (((T1.F1)='" & xlCell.Value & "'));"
            For i = DB.TableDefs.Count - 1 To 0 Step -1 ' Cycle through the list of database objects [tables, queries, etc....]
                If DB.TableDefs(i).Name = VenID Then ' If the vendor table already exists in the DB, delete it so it can be recreated
                    DB.TableDefs.Delete (VenID)
                End Select
            Next i
            DB.Execute sSQL ' Run the SQL to create the vendor table
            Set xlCell = xlCell.Offset(1, 0) ' move down to the next row
        Loop
        DB.Close
        Set DB = Nothing
        Set xlCell = Nothing
End Sub

Mam nadzieję że to pomoże

0
Glenn G 26 luty 2019, 20:57

Dziękuję bardzo Glenn G

Podany kod był niezwykle pomocny i umieścił mnie we właściwym kierunku.

Miałem problemy z czasem wykonywanym z Dao nawet z dodanymi referencjami, ale pracował wokół niego.

Kod, który mam do pracy:

Sub UpdateDatabase()
Dim DBPath As String
Dim xlcell As Range
Dim sSQL As String, stProvider As String
Dim DB As New ADODB.Connection
    DBPath = "C:\Temp\Data.accdb"
    stProvider = "Microsoft.ACE.OLEDB.12.0"
    With DB
        .ConnectionString = DBPath
        .Provider = stProvider
        .Open
    End With
    Set xlcell = Sheet3.Range("X2")
    Do Until xlcell.Value = ""
        venid = xlcell.Value
        sSQL = "SELECT ALL * INTO tbl_Output FROM qry_Data WHERE (((qry_Data.VendorName)='" & xlcell.Value & "'));"
        DB.Execute "DROP TABLE tbl_Output;"
        DB.Execute sSQL
        Set xlcell = xlcell.Offset(1, 0)
    Loop
    DB.Close
    Set DB = Nothing
    Set xlcell = Nothing

Jeszcze raz dziękuję za pomoc.

Pozdrowienia

Richard.

0
Ric Hutton 27 luty 2019, 12:27