MDB in ACCDB online konvertieren

FAQ fĂŒr Entwickler, die’s richtig machen wollen

Warum ĂŒberhaupt von MDB nach ACCDB konvertieren?

Die Frage kommt öfter, als du denkst.

MDB ist das alte Access-Format. Bis Access 2003.

ACCDB kam mit Access 2007. Ist seit 18 Jahren Standard.

Warum du konvertieren solltest:

  • MDB ist auf 2 GB limitiert. ACCDB schafft theoretisch bis 32 GB (praktisch: bis 2 GB sinnvoll)
  • ACCDB unterstĂŒtzt AnhĂ€nge, mehrzeilige Textfelder, berechnete Spalten
  • ACCDB hat bessere VerschlĂŒsselung (AES statt RC4)
  • ACCDB unterstĂŒtzt SharePoint-Integration
  • Neuere Access-Versionen nerven mit MDB-Dateien (KompatibilitĂ€tsmodus)

Warum du vielleicht nicht konvertieren solltest:

  • Du hast Legacy-Anwendungen, die nur MDB verstehen
  • Du nutzt Access 2003 oder Ă€lter (dann kannst du ACCDB nicht öffnen)
  • Du hast replizierte Datenbanken (Replikation gibt’s in ACCDB nicht mehr)

Gibt es wirklich Online-Tools zum Konvertieren?

Kurze Antwort: Nein. Nicht seriös.

Lange Antwort: Es gibt ein paar dubiose Websites, die behaupten, sie wĂŒrden MDB nach ACCDB konvertieren.

Warum das Quatsch ist:

  • Du lĂ€dst deine GeschĂ€ftsdaten auf fremde Server hoch (Datenschutz? Fehlanzeige)
  • Die meisten „Konverter“ sind nur Wrapper um Access selbst (brauchen also Access-Installation)
  • Viele sind Malware-Schleudern oder wollen nur deine E-Mail-Adresse

Was wirklich funktioniert:

Access selbst. VBA-Script. PowerShell mit Access-COM-Objekt.

Alles andere ist Unfug.

Wie konvertiere ich mit Access selbst?

Der einfachste Weg.

Methode 1: Manuell in Access

  1. Access öffnen
  2. MDB-Datei öffnen
  3. „Datei“ → „Speichern unter“ → „Datenbank speichern unter“
  4. „Access-Datenbank (*.accdb)“ auswĂ€hlen
  5. Speicherort wÀhlen
  6. Fertig

Achtung: Nicht alle Features werden automatisch konvertiert.

Was manuell nachgearbeitet werden muss:

  • Benutzer-Level-Security (gibt’s in ACCDB nicht mehr)
  • Replikation (gibt’s in ACCDB nicht mehr)
  • DAO 3.6 Code (muss auf DAO 12.0 umgestellt werden)

Methode 2: VBA-Script fĂŒr Batch-Konvertierung

Wenn du viele MDB-Dateien hast.

' Modul: MDB_to_ACCDB_Converter

Option Compare Database
Option Explicit

Public Sub ConvertMDBtoACCDB(strSourcePath As String, strTargetPath As String)
On Error GoTo ErrorHandler
    
    Dim acc As Object
    Dim strMDBFile As String
    Dim strACCDBFile As String
    
    ' Access-Anwendung erstellen
    Set acc = CreateObject("Access.Application")
    
    strMDBFile = strSourcePath
    strACCDBFile = strTargetPath
    
    ' PrĂŒfen, ob Quelle existiert
    If Dir(strMDBFile) = "" Then
        MsgBox "MDB-Datei nicht gefunden: " & strMDBFile, vbCritical
        Exit Sub
    End If
    
    ' MDB öffnen
    acc.OpenCurrentDatabase strMDBFile
    
    ' Als ACCDB speichern
    acc.Application.ConvertAccessProject strMDBFile, strACCDBFile, acFileFormatAccess2007
    
    ' Schließen
    acc.CloseCurrentDatabase
    acc.Quit
    
    Set acc = Nothing
    
    MsgBox "Konvertierung erfolgreich: " & vbCrLf & strACCDBFile, vbInformation
    Exit Sub
    
ErrorHandler:
    MsgBox "Fehler bei Konvertierung: " & Err.Description, vbCritical
    If Not acc Is Nothing Then
        acc.Quit
        Set acc = Nothing
    End If
End Sub

' Batch-Konvertierung fĂŒr ganzen Ordner
Public Sub ConvertAllMDBInFolder(strFolderPath As String)
On Error GoTo ErrorHandler
    
    Dim strFile As String
    Dim strSourceFile As String
    Dim strTargetFile As String
    Dim intCount As Integer
    
    ' PrĂŒfen, ob Pfad mit \ endet
    If Right(strFolderPath, 1) <> "\" Then
        strFolderPath = strFolderPath & "\"
    End If
    
    ' Ersten MDB-Datei finden
    strFile = Dir(strFolderPath & "*.mdb")
    
    intCount = 0
    
    Do While strFile <> ""
        strSourceFile = strFolderPath & strFile
        strTargetFile = strFolderPath & Replace(strFile, ".mdb", ".accdb")
        
        ' Konvertieren
        Call ConvertMDBtoACCDB(strSourceFile, strTargetFile)
        
        intCount = intCount + 1
        
        ' NĂ€chste Datei
        strFile = Dir()
    Loop
    
    MsgBox "Konvertierung abgeschlossen. " & intCount & " Dateien konvertiert.", vbInformation
    Exit Sub
    
ErrorHandler:
    MsgBox "Fehler: " & Err.Description, vbCritical
End Sub

Aufruf:

' Einzelne Datei
ConvertMDBtoACCDB "C:\Daten\alt.mdb", "C:\Daten\neu.accdb"

' Ganzer Ordner
ConvertAllMDBInFolder "C:\Daten\MDB-Dateien\"

Wie konvertiere ich per PowerShell?

Wenn du’s scriptbar brauchst. Ohne Access-GUI.

# MDB zu ACCDB Konverter
# Benötigt: Access installiert

function Convert-MDBtoACCDB {
    param(
        [Parameter(Mandatory=$true)]
        [string]$SourcePath,
        
        [Parameter(Mandatory=$true)]
        [string]$TargetPath
    )
    
    # PrĂŒfen, ob Quelle existiert
    if (-not (Test-Path $SourcePath)) {
        Write-Error "MDB-Datei nicht gefunden: $SourcePath"
        return
    }
    
    # Access-COM-Objekt erstellen
    $access = New-Object -ComObject Access.Application
    
    try {
        # MDB öffnen
        $access.OpenCurrentDatabase($SourcePath)
        
        # Als ACCDB speichern
        # acFileFormatAccess2007 = 12
        $access.Application.SaveAsAcrossMDBFormats($SourcePath, $TargetPath, 12)
        
        Write-Host "Konvertierung erfolgreich: $TargetPath" -ForegroundColor Green
    }
    catch {
        Write-Error "Fehler bei Konvertierung: $_"
    }
    finally {
        # Access schließen
        $access.CloseCurrentDatabase()
        $access.Quit()
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($access) | Out-Null
        Remove-Variable access
    }
}

# Batch-Konvertierung
function Convert-AllMDBInFolder {
    param(
        [Parameter(Mandatory=$true)]
        [string]$FolderPath
    )
    
    # Alle MDB-Dateien finden
    $mdbFiles = Get-ChildItem -Path $FolderPath -Filter "*.mdb"
    
    $count = 0
    
    foreach ($file in $mdbFiles) {
        $sourcePath = $file.FullName
        $targetPath = [System.IO.Path]::ChangeExtension($sourcePath, ".accdb")
        
        Write-Host "Konvertiere: $($file.Name)" -ForegroundColor Yellow
        
        Convert-MDBtoACCDB -SourcePath $sourcePath -TargetPath $targetPath
        
        $count++
    }
    
    Write-Host "`nKonvertierung abgeschlossen: $count Dateien" -ForegroundColor Cyan
}

# Verwendung:
# Convert-MDBtoACCDB -SourcePath "C:\Daten\alt.mdb" -TargetPath "C:\Daten\neu.accdb"
# Convert-AllMDBInFolder -FolderPath "C:\Daten\MDB-Dateien"

AusfĂŒhren:

# Einzelne Datei
.\Convert-MDB.ps1
Convert-MDBtoACCDB -SourcePath "C:\alt.mdb" -TargetPath "C:\neu.accdb"

# Ganzer Ordner
Convert-AllMDBInFolder -FolderPath "C:\MDB-Dateien"

Was passiert bei der Konvertierung wirklich?

Access macht nicht einfach „Save As“.

Der Prozess:

  1. Neue ACCDB-Datei wird angelegt
  2. Tabellen-Schemas werden kopiert (mit neuen Datentypen)
  3. Daten werden Tabelle fĂŒr Tabelle kopiert
  4. Queries werden konvertiert (SQL wird angepasst)
  5. Formulare werden kopiert
  6. Berichte werden kopiert
  7. VBA-Module werden kopiert
  8. Makros werden konvertiert

Was sich Àndert:

MDBACCDBBemerkung
Jet 4.0 EngineACE EngineNeue Datenbank-Engine
DAO 3.6DAO 12.0Neue Library-Version
User-Level SecurityKeineMuss auf Datei-Ebene gelöst werden
ReplikationKeineAlternative: SharePoint Sync
2 GB Limit2 GB empfohlenTheoretisch 32 GB möglich

Wie migriere ich VBA-Code korrekt?

VBA-Code wird kopiert. Aber nicht immer sauber.

Problem 1: DAO-Referenzen

MDB nutzt DAO 3.6. ACCDB nutzt DAO 12.0.

Vor der Konvertierung in MDB:

Extras → Verweise → „Microsoft DAO 3.6 Object Library“ ist aktiviert

Nach der Konvertierung in ACCDB:

Extras → Verweise → PrĂŒfen

Wenn „MISSING: Microsoft DAO 3.6“ steht:

  1. Haken entfernen bei DAO 3.6
  2. Haken setzen bei „Microsoft Office 16.0 Access database engine Object Library“

VBA-Code anpassen:

' ALT (MDB):
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset("Tabelle1", dbOpenDynaset)

' NEU (ACCDB) - eigentlich identisch, aber Library muss aktualisiert sein
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset("Tabelle1", dbOpenDynaset)

Syntax bleibt gleich. Nur die Referenz muss stimmen.

Problem 2: User-Level Security Code

MDB hatte User-Level Security. ACCDB nicht mehr.

Code wie dieser funktioniert nicht mehr:

' FUNKTIONIERT NICHT in ACCDB
Dim ws As DAO.Workspace
Set ws = DBEngine.Workspaces(0)

MsgBox "Aktueller Benutzer: " & ws.UserName

Alternative in ACCDB:

' Windows-Benutzer abfragen
MsgBox "Aktueller Benutzer: " & Environ("USERNAME")

' Oder: Access-Umgebung
MsgBox "Access-Benutzer: " & CurrentUser()

Problem 3: Jet-SQL vs. ACE-SQL

Manche SQL-Syntax hat sich geÀndert.

Beispiel: TOP mit Prozent

-- MDB (Jet):
SELECT TOP 10 PERCENT * FROM Kunden ORDER BY Umsatz DESC;

-- ACCDB (ACE): identisch, funktioniert weiterhin
SELECT TOP 10 PERCENT * FROM Kunden ORDER BY Umsatz DESC;

Die meisten SQL-Queries funktionieren 1:1. Aber nicht alle.

Problematisch:

-- Alte Jet-Syntax fĂŒr DISTINCTROW
SELECT DISTINCTROW Kunden.Name FROM Kunden;

-- ACE-Syntax
SELECT DISTINCT Kunden.Name FROM Kunden;

Wie konvertiere ich Frontend/Backend-Systeme?

Typisches Setup: Frontend.mdb → Backend.mdb

Beide mĂŒssen konvertiert werden.

Schritt 1: Backend konvertieren

ConvertMDBtoACCDB "\\Server\Daten\Backend.mdb", "\\Server\Daten\Backend.accdb"

Schritt 2: Frontend konvertieren

ConvertMDBtoACCDB "C:\Frontend\App.mdb", "C:\Frontend\App.accdb"

Schritt 3: Linked Tables neu verknĂŒpfen

Nach der Konvertierung zeigen die verknĂŒpften Tabellen noch auf Backend.mdb.

VBA zum NeuverknĂŒpfen:

Public Sub RelinkTablesToNewBackend(strNewBackendPath As String)
On Error GoTo ErrorHandler
    
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim strOldConnect As String
    Dim strNewConnect As String
    
    Set db = CurrentDb()
    
    ' Durch alle Tabellen iterieren
    For Each tdf In db.TableDefs
        ' Nur verknĂŒpfte Tabellen
        If Len(tdf.Connect) > 0 And Left(tdf.Name, 4) <> "MSys" Then
            
            strOldConnect = tdf.Connect
            
            ' Neuen Connection String bauen
            strNewConnect = ";DATABASE=" & strNewBackendPath
            
            ' Verbindung aktualisieren
            tdf.Connect = strNewConnect
            tdf.RefreshLink
            
            Debug.Print "VerknĂŒpft: " & tdf.Name & " → " & strNewBackendPath
        End If
    Next tdf
    
    Set tdf = Nothing
    Set db = Nothing
    
    MsgBox "Alle Tabellen neu verknĂŒpft mit: " & strNewBackendPath, vbInformation
    Exit Sub
    
ErrorHandler:
    MsgBox "Fehler beim NeuverknĂŒpfen: " & Err.Description, vbCritical
End Sub

' Aufruf
RelinkTablesToNewBackend "\\Server\Daten\Backend.accdb"

Wie prĂŒfe ich, ob die Konvertierung erfolgreich war?

Nicht einfach konvertieren und hoffen.

Checkliste:

1. Tabellenanzahl prĂŒfen

Public Sub VerifyTableCount(strMDB As String, strACCDB As String)
    Dim dbMDB As DAO.Database
    Dim dbACCDB As DAO.Database
    Dim intCountMDB As Integer
    Dim intCountACCDB As Integer
    
    Set dbMDB = OpenDatabase(strMDB)
    Set dbACCDB = OpenDatabase(strACCDB)
    
    ' Tabellen zÀhlen (ohne System-Tabellen)
    For Each tdf In dbMDB.TableDefs
        If Left(tdf.Name, 4) <> "MSys" Then
            intCountMDB = intCountMDB + 1
        End If
    Next
    
    For Each tdf In dbACCDB.TableDefs
        If Left(tdf.Name, 4) <> "MSys" Then
            intCountACCDB = intCountACCDB + 1
        End If
    Next
    
    Debug.Print "MDB: " & intCountMDB & " Tabellen"
    Debug.Print "ACCDB: " & intCountACCDB & " Tabellen"
    
    If intCountMDB = intCountACCDB Then
        Debug.Print "✓ Tabellenanzahl identisch"
    Else
        Debug.Print "✗ Tabellenanzahl unterschiedlich!"
    End If
    
    dbMDB.Close
    dbACCDB.Close
End Sub

2. Datensatz-Anzahl prĂŒfen

Public Sub VerifyRecordCounts(strMDB As String, strACCDB As String, strTableName As String)
    Dim dbMDB As DAO.Database
    Dim dbACCDB As DAO.Database
    Dim rsMDB As DAO.Recordset
    Dim rsACCDB As DAO.Recordset
    
    Set dbMDB = OpenDatabase(strMDB)
    Set dbACCDB = OpenDatabase(strACCDB)
    
    Set rsMDB = dbMDB.OpenRecordset("SELECT COUNT(*) AS Anzahl FROM [" & strTableName & "]")
    Set rsACCDB = dbACCDB.OpenRecordset("SELECT COUNT(*) AS Anzahl FROM [" & strTableName & "]")
    
    Debug.Print "Tabelle: " & strTableName
    Debug.Print "MDB: " & rsMDB!Anzahl & " DatensÀtze"
    Debug.Print "ACCDB: " & rsACCDB!Anzahl & " DatensÀtze"
    
    If rsMDB!Anzahl = rsACCDB!Anzahl Then
        Debug.Print "✓ Datensatzanzahl identisch"
    Else
        Debug.Print "✗ Datensatzanzahl unterschiedlich!"
    End If
    
    rsMDB.Close
    rsACCDB.Close
    dbMDB.Close
    dbACCDB.Close
End Sub

3. VBA-Module prĂŒfen

Manuell durchgehen. Kompilieren.

Extras → Kompilieren (Projektname)

Wenn Fehler: Referenzen prĂŒfen.

4. Formulare/Berichte testen

Alle durchklicken. PrĂŒfen, ob sie öffnen.

Wie konvertiere ich verschlĂŒsselte MDB-Dateien?

MDB konnte mit Passwort verschlĂŒsselt werden.

Problem: Konvertierung funktioniert nur mit entschlĂŒsselter Datei.

Schritt 1: MDB entschlĂŒsseln

Public Sub DecryptMDB(strMDBPath As String, strPassword As String, strOutputPath As String)
On Error GoTo ErrorHandler
    
    Dim dbEncrypted As DAO.Database
    Dim dbDecrypted As DAO.Database
    
    ' VerschlĂŒsselte DB öffnen
    Set dbEncrypted = OpenDatabase(strMDBPath, False, False, ";PWD=" & strPassword)
    
    ' Neue unverschlĂŒsselte DB erstellen
    Set dbDecrypted = CreateDatabase(strOutputPath, dbLangGeneral)
    
    ' Tabellen kopieren
    ' (vereinfacht, in Produktion: alle Objekte kopieren)
    
    dbEncrypted.Close
    dbDecrypted.Close
    
    MsgBox "MDB entschlĂŒsselt: " & strOutputPath, vbInformation
    Exit Sub
    
ErrorHandler:
    MsgBox "Fehler: " & Err.Description, vbCritical
End Sub

Schritt 2: EntschlĂŒsselte MDB nach ACCDB konvertieren

ConvertMDBtoACCDB "C:\temp\decrypted.mdb", "C:\neu.accdb"

Schritt 3: ACCDB wieder verschlĂŒsseln

ACCDB hat andere VerschlĂŒsselung.

Public Sub EncryptACCDB(strACCDBPath As String, strPassword As String)
    Dim db As DAO.Database
    
    Set db = OpenDatabase(strACCDBPath, True) ' Exclusive
    
    ' Passwort setzen (alte Methode, funktioniert noch)
    db.NewPassword strPassword, ""
    
    db.Close
    Set db = Nothing
    
    MsgBox "ACCDB verschlĂŒsselt", vbInformation
End Sub

Moderne Methode (AES-VerschlĂŒsselung):

Extras → Datenbank verschlĂŒsseln (in Access GUI)

Oder per VBA:

' Benötigt Access 2007+
DBEngine.CompactDatabase strACCDBPath, strTempPath, , dbEncrypt, ";pwd=" & strPassword
Kill strACCDBPath
Name strTempPath As strACCDBPath

Mein Fazit aus 20 Jahren Access-Entwicklung

MDB nach ACCDB konvertieren ist nicht schwer.

Aber:

Mach’s nicht online. Mach’s lokal. Mit Access. Mit VBA. Mit PowerShell.

Wichtigste Lektion: Nach der Konvertierung testen. Alles.

Typische Fehler:

  • Referenzen nicht geprĂŒft
  • Linked Tables nicht neu verknĂŒpft
  • User-Security-Code nicht entfernt
  • Keine Backups gemacht

Fragen? Schreib mir.

Ich bin der DatenschÀfer. Und ich konvertiere Access-Datenbanken seit 2005.

Kategorien: