Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Access-Datenbank von Excel aus per VBA erzeugen

Access-Datenbank von Excel aus per VBA erzeugen
29.01.2018 12:42:35
Excel
Hallo an die Excel-VBA-Spezialisten,
vor ein paar Tagen wurde hier nach der Möglichkeit gefragt, eine Firebird-Datenbank per VBA zu erzeugen. Ich suche für ein in Excel zu realisierendes Projekt nach einer solchen Möglichkeit, allerdings für eine Access-Datenbank. Leider gab es als Antwort auf die erwähnte Frage nur die Idee, die Datenbank per Kopie aus einer leeren Datenbank zu erzeugen. Das geht natürlich immer, ich würde aber gern per VBA eine neue Datenbank erzeugen. Hat jemand eine Idee, wie man das machen könnte?
Viele Grüße
Holger_M
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Access-Datenbank von Excel aus per VBA erzeugen
29.01.2018 13:12:30
Excel
Hallo Holger,
ich hab den folgenden Code mal irgendwo gefunden und abgespeichert. Guck mal ob es dir weiterhilft bzw. reicht.

Option Explicit
Const Datei As String = "C:\temp\vba_sql.mdb"
Sub in_DB_eine_Tabelle_anlegen()
Dim db As Database
Dim Antwort As Long
On Error GoTo Hell
Rem wenn Datei nicht vorhanden dann anlegen
If Dir(Datei) = "" Then
Set db = CreateDatabase(Datei, dbLangGeneral)
Else
Rem wenn alte Datei vorhanden nachfragen
Antwort = MsgBox("soll die alte Datei:" & vbNewLine _
& Datei & vbNewLine _
& "gelöscht werden?", vbYesNo, "Datei ist schon vorhanden")
If Antwort = 6 Then
Rem alte Datei löschen
Kill Datei
Rem neue Datei anlegen
Set db = CreateDatabase(Datei, dbLangGeneral)
Else
Rem falls Nein angeklickt dann aussteigen
MsgBox "keine Änderung vorgenommen", , "Abbruch"
Exit Sub
End If
End If
Rem DB öffnen
Set db = OpenDatabase(Datei)
Rem Tabelle "Personal" anlegen und Spalten einfügen
db.Execute ("Create table Personal" _
& "(PersonalNR SMALLINT NOT NULL, Name CHAR(40), Vorname char(40)," _
& "Geschlecht char(1), AbtNR SMALLINT, Eintritt DATE, Gehalt NUMERIC)")
Rem in Tabelle "Personal" Daten eintragen
db.Execute ("Insert into Personal Values" _
& "(5,'Schröder','Heinz','M',2, #61-05-15#,2500.00)")
db.Execute ("Insert into Personal Values" _
& "(8,'Schneider','Sybille','W',3, DateValue('1.5.79'),4200.00)")
Set db = Nothing
MsgBox "Daten eingetragen", , Datei
Exit Sub
Hell:
Set db = Nothing
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler aufgetreten"
End Sub
Sub DatenübernahmeNachExcel()
' unbedingt Verweis auf ActiveX Data Objects setzen
Dim ADOC As New ADODB.Connection
Dim DBS As New ADODB.Recordset
Dim cmd As ADODB.Command
On Error GoTo Fehlerbehandlung
ADOC.Open "Provider=Microsoft.Jet.oledb.4.0;data source=C:\temp\vba_sql.mdb;"
DBS.Open "Personal", ADOC, adOpenKeyset, adLockOptimistic
Set cmd = New ADODB.Command
cmd.CommandText = "Select * from Personal"
cmd.ActiveConnection = ADOC
Set DBS = cmd.Execute
Sheets("Tabelle1").Activate
Range("A2").Select
Do While Not DBS.EOF
ActiveCell.Value = DBS!PersonalNR
ActiveCell.Offset(0, 1).Value = DBS!Name
ActiveCell.Offset(0, 2).Value = DBS!Vorname
ActiveCell.Offset(0, 3).Value = DBS!Geschlecht
ActiveCell.Offset(0, 4).Value = DBS!AbtNR
ActiveCell.Offset(0, 5).Value = DBS!Eintritt
ActiveCell.Offset(0, 6).Value = DBS!Gehalt
DBS.MoveNext
ActiveCell.Offset(1, 0).Select
Loop
Columns("A:J").AutoFit
DBS.Close
ADOC.Close
Set DBS = Nothing
Set ADOC = Nothing
Set cmd = Nothing
Exit Sub
Fehlerbehandlung:
MsgBox "Es ist ein Fehler aufgetreten!" & Chr(13) & Err.Description
DBS.Close
ADOC.Close
Set ADOC = Nothing
Set DBS = Nothing
End Sub
Beste Grüße
chaosoft
Anzeige
AW: Access-Datenbank von Excel aus per VBA erzeugen
29.01.2018 13:17:05
Excel
Hi Holger
Hier eine Variante (Late Binding)
Sub t()
Dim objAccess As Object
Dim objDB As Object, strDB As String
Dim objTable As Object, strTable As String
Dim objFeld As Object, strFeld As String
Set objAccess = CreateObject("Access.Application")
strDB = ThisWorkbook.Path & "\Newdb.mdb"
strTable = "Tabelle1"
strFeld = "MeineSpalte"
objAccess.NewCurrentDatabase strDB
Set objDB = objAccess.currentDB
Set objTable = objDB.CreateTableDef(strTable)
Set objFeld = objTable.CreateField(strFeld, 10, 40)
objTable.Fields.Append objFeld
objDB.TableDefs.Append objTable
Set objAccess = Nothing
Set objTable = Nothing
Set objFeld = Nothing
End Sub

cu
Chris
Anzeige
AW: Access-Datenbank von Excel aus per VBA erzeugen
29.01.2018 18:01:19
Excel
Hallo Holger,
ich habe hier noch eine Lösung, bei der du Access nicht starten musst. Du brauchst Verweise auf die Bibliotheken ADODB und ADOX (Microsoft ActiveX Data Objects x.y Library und Microsoft ADO Ext. x.y for DDL and Security):
Sub Datenbank_erzeugen()
Dim anzSätze As Long
Dim cat As ADOX.Catalog
Dim col As ADOX.Column
Dim con As ADODB.Connection
Dim datei As String
Dim dauer As Single
Dim i As Long
Dim idx As ADOX.Index
Dim k As Long
Dim pfad As String
Dim rs As ADODB.Recordset
Dim tbl As ADOX.Table
Dim zf As String
Application.StatusBar = False
anzSätze = 50
dauer = Timer
pfad = ThisWorkbook.Path & "\"
datei = "NetzTestDB.accdb"
' Eine eventueel vorhandene Datenbank vorsorglich
' löschen
On Error Resume Next
Kill pfad & datei
On Error GoTo 0
' Datenbank neu anlegen (Tabelle "Zugriffe" und Felder)
Set cat = New ADOX.Catalog
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & pfad & datei
Set tbl = New ADOX.Table
tbl.Name = "Zugriffe"
tbl.Columns.Append "IdentNr", adInteger
tbl.Columns.Append "GenName", adVarWChar, 9
tbl.Columns.Append "ZugriffsSaldo", adInteger
For i = 1 To 15
zf = "PC" & Format$(i, "00") & "_Name"
tbl.Columns.Append zf, adVarWChar, 16
tbl.Columns(2 * i + 1).Attributes = adColNullable
zf = "PC" & Format$(i, "00") & "_AnzZugr"
tbl.Columns.Append zf, adInteger
Next i
' Index anfügen
Set idx = New ADOX.Index
idx.Name = "PrimaryKey"
idx.Columns.Append "IdentNr"
tbl.Indexes.Append idx
cat.Tables.Append tbl
Set cat = Nothing
' Datenbank mit der gewünschten Anzahl Sätze füllen
Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & pfad & datei
Set rs = New ADODB.Recordset
rs.Open Source:="Zugriffe", _
ActiveConnection:=con, _
CursorType:=adOpenKeyset, _
LockType:=adLockOptimistic, _
Options:=adCmdTableDirect
Randomize
For i = 1 To anzSätze
' Anfangsbuchstabe des generierten Namens (Großschreibung)
zf = Chr(Fix(26 * Rnd()) + 65)
For k = 1 To 8
' Folgebuchstaben des generierten Namens (Kleinschreibung)
zf = zf & Chr(Fix(26 * Rnd()) + 97)
Next k
rs.AddNew
rs!IdentNr = i
rs!GenName = zf
rs!zugriffssaldo = 0
For k = 1 To 15
rs(2 * k + 2) = 0
Next k
rs.Update
Application.StatusBar = "Satz: " & i
Next i
' Abschlußarbeiten
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
dauer = Timer - dauer
Application.StatusBar = Empty
MsgBox Prompt:="Datenbank" & vbNewLine & vbNewLine & _
pfad & datei & vbNewLine & vbNewLine & _
"mit " & anzSätze & " Sätzen neu erzeugt!" & vbNewLine & vbNewLine & _
"Zeitdauer: " & Format$(dauer, "#,##0.0 \S\e\k\."), _
Buttons:=vbInformation
End Sub
Viele Grüße
Dieter
Anzeige
AW: Access-Datenbank von Excel aus per VBA erzeugen
29.01.2018 22:09:27
Excel
Hallo chao.soft, Chris, Case und Dieter,
herzlichen Dank für eure Lösungen. Sie funktionieren alle 4 einwandfrei. Für mich sind die drei Lösungen besonders interessant, die nicht voraussetzen, dass Access installiert ist. Ich werde die Lösungen in Ruhe analysieren und mir dann die zu meinem Problem am besten passende aussuchen.
Nochmals besten Dank und viele Grüße
Holger_M
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Access-Datenbank von Excel aus per VBA erzeugen


Schritt-für-Schritt-Anleitung

Um eine Access-Datenbank aus Excel per VBA zu erstellen, kannst du den folgenden Code verwenden. Dieser Code überprüft, ob die Datei bereits existiert, und erstellt eine neue Datenbank, falls nicht. Du kannst die Datenbank nach Bedarf anpassen.

Option Explicit
Const Datei As String = "C:\temp\vba_sql.mdb"

Sub in_DB_eine_Tabelle_anlegen()
    Dim db As Database
    Dim Antwort As Long
    On Error GoTo Hell
    ' Wenn Datei nicht vorhanden, dann anlegen
    If Dir(Datei) = "" Then
        Set db = CreateDatabase(Datei, dbLangGeneral)
    Else
        ' Wenn alte Datei vorhanden, nachfragen
        Antwort = MsgBox("Soll die alte Datei:" & vbNewLine & Datei & vbNewLine & "gelöscht werden?", vbYesNo, "Datei ist schon vorhanden")
        If Antwort = vbYes Then
            ' Alte Datei löschen
            Kill Datei
            ' Neue Datei anlegen
            Set db = CreateDatabase(Datei, dbLangGeneral)
        Else
            ' Falls Nein angeklickt, dann aussteigen
            MsgBox "Keine Änderung vorgenommen", , "Abbruch"
            Exit Sub
        End If
    End If

    ' DB öffnen und Tabelle anlegen
    Set db = OpenDatabase(Datei)
    db.Execute ("Create table Personal (PersonalNR SMALLINT NOT NULL, Name CHAR(40), Vorname CHAR(40), Geschlecht CHAR(1), AbtNR SMALLINT, Eintritt DATE, Gehalt NUMERIC)")
    MsgBox "Datenbank erfolgreich erstellt!", , Datei
    Set db = Nothing
    Exit Sub

Hell:
    Set db = Nothing
    MsgBox "FehlerNr.: " & Err.Number & vbNewLine & "Beschreibung: " & Err.Description, vbCritical, "Fehler aufgetreten"
End Sub

Häufige Fehler und Lösungen

  • Fehler 3265: "Feldname nicht gefunden": Überprüfe, ob die Spaltennamen in der SQL-Anweisung korrekt sind. Achte auf Groß- und Kleinschreibung.

  • Fehler 3343: "Ungültige Datenbankdatei": Stelle sicher, dass die Datenbankdatei im richtigen Format erstellt wurde (z.B. .mdb oder .accdb).

  • Fehler bei der Verbindung: Überprüfe, ob die nötigen Verweise auf ADO und ADOX gesetzt sind, insbesondere wenn du die Datenbank ohne Access erstellen möchtest.


Alternative Methoden

Eine Alternative zum Erstellen der Access-Datenbank besteht darin, Late Binding zu verwenden. Dies erfordert kein installiertes Access und kann so aussehen:

Sub ErstelleAccessDB()
    Dim objAccess As Object
    Set objAccess = CreateObject("Access.Application")
    objAccess.NewCurrentDatabase "C:\temp\NeueDatenbank.mdb"
    objAccess.CloseCurrentDatabase
    objAccess.Quit
    Set objAccess = Nothing
End Sub

Du kannst auch ADO verwenden, um eine Datenbank zu erstellen, ohne Access zu starten. Dies ist besonders nützlich, wenn du eine Access-Datenbank aus Excel erstellen möchtest, ohne dass Access auf dem Computer installiert ist.


Praktische Beispiele

  1. Access-Kontaktdatenbank erstellen: Verwende die oben genannten Methoden, um eine Kontaktdatenbank zu erstellen. Du kannst Felder wie Name, Adresse, Telefon hinzufügen.

  2. Kundendatenbank erstellen: Ändere die SQL-Anweisung, um eine Tabelle für Kunden zu erstellen, z.B. CREATE TABLE Kunden (KundenID INT, Name VARCHAR(100), Email VARCHAR(100)).


Tipps für Profis

  • Verwende Parameterabfragen: Um SQL-Injection zu vermeiden, solltest du immer Parameterabfragen verwenden, wenn du Daten in die Datenbank einfügen möchtest.

  • Fehlerbehandlung: Implementiere eine umfassende Fehlerbehandlung in deinen VBA-Skripten, um die Anwendung robuster zu machen.

  • Datenbankdesign: Plane dein Datenbankdesign im Voraus. Überlege dir, welche Tabellen und Beziehungen du benötigst, um die Effizienz zu maximieren.


FAQ: Häufige Fragen

1. Kann ich Access-Datenbanken auch aus einer Excel-Tabelle erstellen?
Ja, du kannst die Daten aus einer Excel-Tabelle in eine Access-Datenbank importieren oder direkt eine Datenbank aus Excel erstellen.

2. Benötige ich Access, um eine Access-Datenbank zu erstellen?
Nicht unbedingt. Mit den richtigen ADO-Referenzen kannst du eine Access-Datenbank allein mit Excel und VBA erstellen, ohne dass Access installiert ist.

3. Wie kann ich eine bereits existierende Access-Datenbank anpassen?
Du kannst das ADO-Objekt verwenden, um eine Verbindung zu einer bestehenden Datenbank herzustellen und dann SQL-Anweisungen verwenden, um Änderungen vorzunehmen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige