Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Automatische Aktualisierung mittels VBA & Makros

Forumthread: Automatische Aktualisierung mittels VBA & Makros

Automatische Aktualisierung mittels VBA & Makros
04.07.2024 19:15:00
kaha3209
Hallo Zusammen,

im Rahmen meiner BA erstelle ich ein Dashboard für meinen Professor, der in seinem Kurs das BPOS Game "spiielt". Dadruch habe ich einige Datenbasen, die jedoch identisch aufgebaut sind. Ich habe das Dashboard auf Basis einer dieser Datenbasen erstellt und möchte es dem Professor nun ermöglichen sich das Dashboard auf alle Gruppen und in jedem Semester per Knopfdruck zu aktualisieren. Ich habe mittels ChatGPT und stundenlangem prompten einen VBA Code erstellt der, denke ich, in eine richtige Richtung geht. Ich habe bereits sichergestellt, dass die ADODB Connection aktiviert ist. Das leeren der aktuellen Tabellen klappt bereits, es hakt immer nur am einspielen der neuen Daten. Folgende Fehlermeldung erscheint: "Fehler bei Herstellen der Verbindung: anwendungs- oder objektdefinierter Fehler."
DSN, User und Passwort wird mittels Userform abgefragt.

Das ist der Code:


Sub NewDatabase()
Dim conn As Object
Dim rs As Object
Dim query As String
Dim ws As Worksheet
Dim pt As PivotTable
Dim pCache As PivotCache
Dim tbl As ListObject
Dim newDSN As String
Dim newUsername As String
Dim newPassword As String

' Show the UserForm
frmDatabaseInput.Show

' Get the input values from the UserForm
newDSN = frmDatabaseInput.txtDSN.Value
newUsername = frmDatabaseInput.txtUser.Value
newPassword = frmDatabaseInput.txtPassword.Value

' If the user clicks cancel or leaves the input blank, exit the sub
If newDSN = "" Or newUsername = "" Or newPassword = "" Then
MsgBox "Keine vollständigen Verbindungsdaten eingegeben. Das Makro wird beendet.", vbExclamation
Exit Sub
End If

' Connection string to your ODBC data source
Dim connStr As String
connStr = "DSN=" & newDSN & ";UID=" & newUsername & ";PWD=" & newPassword & ";"

' Debug-Ausgabe der Verbindungszeichenfolge
Debug.Print "Verbindungszeichenfolge: " & connStr

' Create a new connection
Set conn = CreateObject("ADODB.Connection")

' Error handling to catch connection issues
On Error GoTo ConnectionError

' Debug-Ausgabe vor dem Verbindungsaufbau
Debug.Print "Versuche, eine Verbindung herzustellen..."

conn.Open connStr

' Debug-Ausgabe nach erfolgreichem Verbindungsaufbau
Debug.Print "Verbindung erfolgreich hergestellt."

' Loop through each worksheet and update the queries
For Each ws In ThisWorkbook.Worksheets
' Skip the sheet if it doesn't have any ListObjects
If ws.ListObjects.Count > 0 Then
' Unhide the sheet if it is hidden
ws.Visible = xlSheetVisible

For Each tbl In ws.ListObjects
' Clear existing data
tbl.DataBodyRange.ClearContents

' Define the query based on the table name
Select Case tbl.Name
Case "backlogTable"
query = "SELECT * FROM backlogTable;"
Case "costsTable"
query = "SELECT * FROM costsTable;"
Case "deliveryAmountsTable"
query = "SELECT * FROM deliveryAmountsTable;"
Case "deliveryTable"
query = "SELECT * FROM deliveryTable;"
Case "investmentTable"
query = "SELECT * FROM investmentTable;"
Case "openOrderTable"
query = "SELECT * FROM openOrderTable;"
Case "orderAmountsTable"
query = "SELECT * FROM orderAmountsTable;"
Case "orderTable"
query = "SELECT * FROM orderTable;"
Case "productionAmountsTable"
query = "SELECT * FROM productionAmountsTable;"
Case "productionTable"
query = "SELECT * FROM productionTable;"
Case "productTable"
query = "SELECT * FROM productTable;"
Case "productVersionsTable"
query = "SELECT * FROM productVersionsTable;"
Case "roundsTable"
query = "SELECT * FROM roundsTable;"
Case "stockTable"
query = "SELECT * FROM stockTable;"
Case "tierInfo"
query = "SELECT * FROM tierInfo;"
Case Else
MsgBox "Unbekannte Tabelle: " & tbl.Name, vbExclamation
GoTo NextTable
End Select

' Execute the query and fill the table
Set rs = CreateObject("ADODB.Recordset")
rs.Open query, conn

' Add the data to the table
tbl.HeaderRowRange.Cells(1, 1).CopyFromRecordset rs

' Close the recordset
rs.Close
Set rs = Nothing

' Hide the sheet again
ws.Visible = xlSheetVeryHidden
NextTable:
Next tbl
End If
Next ws

' Refresh all pivot tables
For Each ws In ThisWorkbook.Worksheets
For Each pt In ws.PivotTables
Set pCache = pt.PivotCache
pCache.Refresh
Next pt
Next ws

MsgBox "Abfragen und Daten wurden erfolgreich aktualisiert.", vbInformation
conn.Close
Set conn = Nothing
Exit Sub

ConnectionError:
MsgBox "Fehler beim Herstellen der Verbindung: " & Err.Description, vbCritical
Debug.Print "Fehler beim Herstellen der Verbindung: " & Err.Description
Set conn = Nothing
End Sub



Ich würde mich sehr freuen, wenn mir da jemand helfen könnte.

Vielen Dank im Voraus.
Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Automatische Aktualisierung mittels VBA & Makros
04.07.2024 23:15:16
Yal
Hallo Kaha,

es handelt sich um eine Fehler bei der Verbindung zu der Datenbank. Ohne Datenbank, kein Test und kein Fehler.

Aber nebenbei:
- Leerzeilen haben null Mehrwert. Macht nur den Code unnötig lang
- do not comment what is obvious (ok, als Anfänger, lieber ein bischen mehr als zu wenig, aber "rs.Close" kommentieren?)
- wenn schon Verwendung von ADODB-Objekte, dann unter Anbindung der Bibliothek. Es ermöglicht den Compiler, potentielle Fehlerquelle zu identifizieren (und löst vielleicht dein Problem)
- wenn die abgefragte Tabelle dieselbe Name wie die Quelltabelle, warum nicht damit die SQL-Querystring aufbauen?
- wenn schon ListObject als Datenempfänger, warum nicht diese per Power Query Abfrage befüllen?
- wenn schon Pivottable als Auswertung, warum nicht direkt die Power Query Ausgabe direkt in der Pivottable ausgeben?

Siehe: https://excelhero.de/power-query/power-query-ganz-einfach-erklaert/

Dein Code könnte so aussehen (Änderungen haben aber null Auswirkung auf das Programm. Ausser "Visibility"):

Sub NewDatabase()

'Verwendet Verweise auf Bibliothek: "Extras", "Verweise...", Haken bei:
'Microsoft ActiveX Data Objects 6.1 Library
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim ws As Worksheet
Dim pt As PivotTable
Dim tbl As ListObject
Dim newDSN As String
Dim newUsername As String
Dim newPassword As String
Dim connStr As String
Dim Visibility As Long

frmDatabaseInput.Show
' Get the input values from the UserForm
newDSN = frmDatabaseInput.txtDSN.Value
newUsername = frmDatabaseInput.txtUser.Value
newPassword = frmDatabaseInput.txtPassword.Value
' If the user clicks cancel or leaves the input blank, exit the sub
If newDSN = "" Or newUsername = "" Or newPassword = "" Then
MsgBox "Keine vollständigen Verbindungsdaten eingegeben. Das Makro wird beendet.", vbExclamation
Exit Sub
End If

connStr = "DSN=" & newDSN & ";UID=" & newUsername & ";PWD=" & newPassword & ";" ' Connection string to your ODBC data source

On Error GoTo ConnectionError ' Error handling to catch connection issues
Debug.Print "Versuche, eine Verbindung herzustellen:" & connStr ' Debug-Ausgabe vor dem Verbindungsaufbau
Set conn = New ADODB.Connection ' Create a new connection
conn.Open connStr
For Each ws In ThisWorkbook.Worksheets ' Loop through each worksheet and update the queries
Visibility = ws.Visible 'store the visibility state
ws.Visible = xlSheetVisible ' Unhide the sheet if it is hidden
For Each tbl In ws.ListObjects ' will be skipped when zero ListObjects
tbl.DataBodyRange.ClearContents ' Clear existing data
If Not InStr(1, "backlogTable;costsTable;deliveryAmountsTable;deliveryTable;investmentTable;openOrderTable;orderAmountsTable;orderTable;productionAmountsTable;productionTable;productVersionsTable;roundsTable;stockTable;tierInfo", tbl.Name) Then
MsgBox "Unbekannte Tabelle: " & tbl.Name, vbExclamation
Else
Set rs = New ADODB.Recordset ' Execute the query and fill the table
rs.Open "select * from " & tbl.Name & ";", conn
tbl.HeaderRowRange.Cells(1, 1).CopyFromRecordset rs ' Add the data to the table
rs.Close ' Close the recordset
End Select
Next tbl
ws.Visible = Visibility ' restore the initial visibility
Next ws
' Refresh all pivot tables
For Each ws In ThisWorkbook.Worksheets
For Each pt In ws.PivotTables
pt.PivotCache.Refresh
Next pt
Next ws

MsgBox "Abfragen und Daten wurden erfolgreich aktualisiert.", vbInformation
conn.Close
GoTo Finally

ConnectionError:
MsgBox "Fehler beim Herstellen der Verbindung: " & Err.Description, vbCritical
Debug.Print "Fehler beim Herstellen der Verbindung: " & Err.Description
Finally:
Set conn = Nothing
End Sub


VG
Yal
Anzeige
;

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