2017-04-20 3 views
0

Ich kann keine Option finden Sie in der VBA-Objektmodell in Microsoft Access als auf diesem Druck Bildschirm zu aktivieren:eine Verbindung zum Access-VBA-Objektmodell von Excel

enter image description here

Von Excel ich in der gleichen sehen Option Dialog-Fenster:

enter image description here

ich folgendes wissen funktioniert gut mit Access VBA-Objektmodell arbeiten

 
Public strAllCode As String 

Public Sub StringAllLines() 

    Dim accObj As AccessObject 'Each module/form/report. 
    Dim bWasOpen As Boolean  'Flag to leave form/report open if it was open. 
    Dim strDoc As String  'Name of each form/report 

    'Stand-alone modules. 
    For Each accObj In CurrentProject.AllModules 
     Call GetModuleLines(accObj.Name, True) 
    Next 

    'Modules behind forms. 
    For Each accObj In CurrentProject.AllForms 
     strDoc = accObj.Name 
    bWasOpen = accObj.IsLoaded 

    If Not bWasOpen Then 
     DoCmd.OpenForm strDoc, acDesign, WindowMode:=acHidden 
    End If 

    If Forms(strDoc).HasModule Then 
     Call GetModuleLines("Form_" & accObj.Name, False) 
    End If 

    If Not bWasOpen Then 
     DoCmd.Close acForm, strDoc, acSaveNo 
    End If 

    Next 

    'Modules behind reports. 
    For Each accObj In CurrentProject.AllReports 
    strDoc = accObj.Name 
    bWasOpen = accObj.IsLoaded 

    If Not bWasOpen Then 
    'In Access 2000, remove the ", WindowMode:=acHidden" from the next line. 
     DoCmd.OpenReport strDoc, acDesign, WindowMode:=acHidden 
    End If 

    If Reports(strDoc).HasModule Then 
     Call GetModuleLines("Report_" & accObj.Name, False) 
    End If 

    If Not bWasOpen Then 
     DoCmd.Close acReport, strDoc, acSaveNo 
    End If 

    Next 

    Dim intFile As Integer 

    '*** Set to next free open number *** 
    intFile = FreeFile() 
    Open "c:\temp\AllCode.txt" For Output As #intFile 
    Print #intFile, strAllCode 
    Close #intFile 

End Sub 

Private Function GetModuleLines(strModule As String, bIsStandAlone As Boolean) 

    Dim bWasOpen As Boolean  'Flag applies to standalone modules only. 
    Dim lngLineNo As Long 

    If bIsStandAlone Then 
     bWasOpen = CurrentProject.AllModules(strModule).IsLoaded 
    End If 

    If Not bWasOpen Then 
     DoCmd.OpenModule strModule 
    End If 

    strAllCode = strAllCode & "**********" & vbCrLf 
    strAllCode = strAllCode & strModule & vbCrLf 
    strAllCode = strAllCode & "**********" & vbCrLf 

    For lngLineNo = 1 To Modules(strModule).CountOfLines 
    strAllCode = strAllCode & Right("  " & lngLineNo, 5) & ": " & Modules(strModule).Lines(lngLineNo, 1) & vbCrLf 
    Next 

    strAllCode = strAllCode & vbCrLf & vbCrLf & vbCrLf 

    If Not bWasOpen Then 
     On Error Resume Next 
     DoCmd.Close acModule, strModule, acSaveNo 
    End If 

    Debug.Print strModule & " complete" 

    DoEvents 

End Function 

Dies ist nur ein Codebeispiel, mit dem Sie alle Module und Objektnamen aus Access in eine Textdatei exportieren können.

Ich würde es gerne aus Excel machen, mit anderen Worten, das VBA-Makro in Excel öffnet die Access-Datenbank und verarbeitet jeden Objektnamen und -typ (Tabelle, Formular, Abfrage, Bericht, VBA-Module ...) in ein Textdatei und schließt dann die Datenbank. Kann das gemacht werden?

Die reference für den Code geschrieben

Antwort

0

könnten Sie schreiben Sie einfach den Code, den Sie haben, dass Sie Werke im Zugriff und führen Sie das Makro aus Excel wissen?

Nicht sehr dynamisch, aber würde Ihr Zweck

Set oAcc = CreateObject("Access.Application") 

oacc.opencurrentdatabase "C:\yourdb.accdb", ,"password" 
oacc.Run "Your_Macro" 
+0

Ich möchte das Makro aus Excel ausführen und die Access-Datei unberührt lassen, danke – pascalb

1

Hinzufügen des Microsoft Access XX.X Object Reference Library in der Excel VBE werden die Methoden, Parameter und Funktionen/U-Boote in Access aussetzen dienen, die Sie anrufen können aus Excel heraus.

Nachdem der Verweis hinzugefügt wurde, fügen Sie ein Objekt vom Typ Access.Application hinzu und verwenden Sie dann den Befehl Set, um ihn gleich einer neuen Instanz des Access.Application-Objekts festzulegen.

Sie können Variablen dann an Datenmengen, Abfrage-/Tabellendefinitionen binden und so ziemlich alles tun, was Sie in Access tun können. Dies wird als frühzeitige Bindung bezeichnet.

Alternativ können Sie eine ungebundene Objektvariable (Dim foo As Object) erstellen und sie dann gleich der Objektreferenz (Set foo = New Access.Application) setzen.

Sie können dieselben Strukturen wie zuvor erstellen und bearbeiten, aber Sie verlieren die Intellisense-Funktion. Dies wird als späte Bindung bezeichnet.

0

ok Ich war ziemlich faul, dies zu experimentieren, bevor ich frage, aber mit kleinen Anpassungen aus dem Code, der zuerst oben gepostet wurde, ist es möglich, die Kontrolle über das Access-VBA-Objektmodell zu übernehmen. Im folgenden sehen Sie den Code I-Code (erster Versuch) kam ich mit und es funktioniert:

 
Public strAllCode As String 
Public appAccess As Object 

Public Sub StringAllLines() 

    'create new access object 
    Set appAccess = CreateObject("Access.Application") 
    'open the acces project 
    Call appAccess.OpenCurrentDatabase(_ 
    "D:\ShF3\vba_list_module_proj\access northw modules _4_ok\Northwind 2007z.accdb") 
    appAccess.Visible = False 

    Dim accObj As Object 'Each module/form/report. 
    Dim bWasOpen As Boolean  'Flag to leave form/report open if it was open. 
    Dim strDoc As String  'Name of each form/report 
    'Stand-alone modules. 
    For Each accObj In appAccess.CurrentProject.AllModules 
     Call GetModuleLines(accObj.Name, True) 
    Next 
    'Modules behind forms. 
    For Each accObj In appAccess.CurrentProject.AllForms 
     strDoc = accObj.Name 
     bWasOpen = accObj.IsLoaded 
     If Not bWasOpen Then 
      'DoCmd.OpenForm strDoc, acDesign, WindowMode:=acHidden 
     End If 

    Next 

    'Modules behind reports. 
    Dim intFile As Integer 
    '*** Set to next free open number *** 
    intFile = FreeFile() 
    Open "c:\temp\AllCode.txt" For Output As #intFile 
    Print #intFile, strAllCode 
    Close #intFile 

End Sub 


Private Function GetModuleLines(strModule As String, bIsStandAlone As Boolean) 

    Dim bWasOpen As Boolean  'Flag applies to standalone modules only. 
    Dim lngLineNo As Long 
    If bIsStandAlone Then 
     bWasOpen = appAccess.CurrentProject.AllModules(strModule).IsLoaded 
    End If 
    If Not bWasOpen Then 
     appAccess.DoCmd.OpenModule strModule 
    End If 
    strAllCode = strAllCode & "**********" & vbCrLf 
    strAllCode = strAllCode & strModule & vbCrLf 
    strAllCode = strAllCode & "**********" & vbCrLf 

    For lngLineNo = 1 To appAccess.Modules(strModule).CountOfLines 
     strAllCode = strAllCode & Right("  " & lngLineNo, 5) & ": " & appAccess.Modules(strModule).Lines(lngLineNo, 1) & vbCrLf 
    Next 

    strAllCode = strAllCode & vbCrLf & vbCrLf & vbCrLf 

    If Not bWasOpen Then 
     On Error Resume Next 
     'appAccess.DoCmd.Close acModule, strModule, acSaveNo 
    End If 

    Debug.Print strModule & " complete" 
    DoEvents 

End Function 

Ich brauche nur richtig die Access-Datenbank zu schließen, die offen bleibt und einige Anpassung an die Informationen, die in der Textdatei angegeben. Am Ende brauche ich die Textdatei nicht als Zwischenschritt, sondern alles in Excel. Pascal

Verwandte Themen