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

msgBox oder Fortschrittsbalken?

Forumthread: msgBox oder Fortschrittsbalken?

msgBox oder Fortschrittsbalken?
05.03.2009 11:31:28
Julia
Hallo,
ich habe eine *.vbs die mir Daten aus einer MySQL Datenbank in eine xls importiert.
Der Vorgang dauert 4 bis 5 min.
Ich würde den User gerne über den laufenden Import informieren
Kann man wenn das vbs die xls öffnet sofort eine InfoBox einblenden lassen?
Wenn der Import fertig ist generierrt die vbs selbst eine MsgBox wo mitgeteilt wird das der Import abgeschlossen ist.
Aber für die Zwischenzeit hätte ich gerne eine Meldung das der Import läuft
Ein fortschrittsbalken wäre natürlich noch edler
Eine Idee?
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: msgBox oder Fortschrittsbalken?
05.03.2009 11:42:51
Björn
Hallo Julia,
Application.StatusBar zeigt unten links in Excel den Bearbeitungsstand an.
die MsgBox am Anfang vom Code und am Ende zu setzen dürfte kein Problem sein.
einen Fortschrittsbalken zu generieren ist aufwendiger, da Du den Daten Import aus Deiner Datenbank in eine Schleife integrieren müsstest.
Grüße
Björn
Anzeige
AW: msgBox oder Fortschrittsbalken?
05.03.2009 11:46:23
Julia
Hi Björn,
das vbs füllt ja Zeilen in das Tabellnbaltt Datenbasis.
Könnt ich eine Anzeige machen, wieviel Zeilen er grad improtiert hat?
AW: msgBox oder Fortschrittsbalken?
05.03.2009 11:52:41
Ramses
Hallo
"..wieviel Zeilen er grad improtiert hat..."
Ja,... in der Statusbar.
Mit einem Fortschrittsbalken geht das nicht, oder zumindest nicht wenn du nicht vorher schon die Anzahl der einzulesenden Datensätze kennst. Die Progressbar zur Darstellung braucht einen Start und einen EndWert,... sonst kann das Verhältnis nicht berechnet werden
Gruss Rainer
Anzeige
AW: msgBox oder Fortschrittsbalken?
05.03.2009 11:54:44
Björn
Hallo Julia,
ich kenn mich mit Datenimport nicht so gut aus. Aber wenn Du eine schleife hast, in der Du sagen wir mal i als Variable für sämtliche Zeilen nimmst, und dann festlegst wenn i den Wert 200 hat soll der Text in der Status anzeige geändert werden. Sollte die Möglich sein.
Wie der Code genau aussehen muss, passe ich etwas, weil so sicher bin ich in dem bereich nicht. Da müsste ich auch probieren und testen :)
Grüße
Björn
PS: ich kann Dir aber auch mal eine Datei mit Fortschrittsbalken hochladen, vielleicht kannst Du den Code ja umwandeln.
Anzeige
AW: msgBox oder Fortschrittsbalken?
05.03.2009 12:03:19
Julia
Also je nach SQL Abfrage in der vbs variiert der Anzahl der zu improtierenden Zeilen
Mal sind es 200, mal 1200, mal 4000
Der Import läuft ja Zeile für Zeile
Mit würde es reichen wenn irgendwie fortlaufend angezeigt wird wieviel Zeilen schon importiert sind
Der User weiß nämlich wieviel er ungefähr zu erwarten hat
Bloß keine Ahnung wie ich das lösen sollte
Anzeige
AW: msgBox oder Fortschrittsbalken?
05.03.2009 12:08:20
Ramses
Hallo
Ohne Codebeispiel wie du die Daten einliest kann dir hier niemand helfen
Gruss Rainer
Der Code
05.03.2009 12:15:45
Julia
So sieht der import code aus
Option Explicit
'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
' Const adOpenKeyset = 1
' Const adOpenDynamic = 2
' Const adOpenStatic = 3
'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
' Const adLockPessimistic = 2
' Const adLockOptimistic = 3
' Const adLockBatchOptimistic = 4
'---- CursorLocationEnum Values ----
' Const adUseServer = 2
Const adUseClient = 3
'---- ConnectModeEnum Values ----
' Const adModeUnknown = 0
Const adModeRead = 1
' Const adModeWrite = 2
' Const adModeReadWrite = 3
' Const adModeShareDenyRead = 4
' Const adModeShareDenyWrite = 8
' Const adModeShareExclusive = &Hc
' Const adModeShareDenyNone = &H10
' Const adModeRecursive = &H400000
Dim objExcel, objWb, SkriptPfad
Dim objSheet
Dim Conn, RS
Dim rowCount, i, headerSet
rowCount = 1
SkriptPfad = WScript.ScriptFullName 'Pfadermittlung
SkriptPfad = Left(SkriptPfad, Len(SkriptPfad) - Len(WScript.ScriptName)) 'Pfadermittlung
Set objExcel = CreateObject("Excel.Application")
Set objWb = objExcel.Workbooks.Open(SkriptPfad & "../test.xls")'öffnet die angegebene xls
objExcel.Visible = True
objExcel.Sheets("Datenbasis").Select 'wählt die angegebene Mappe der zuvor geöffneten xls
objExcel.Range("Datenbasis!$1:$65536").ClearContents 'löscht alle Inhalte von angegebener Mappe
'Angabe des Tabellenblattes
Set objSheet = objExcel.ActiveWorkbook.WorkSheets("Datenbasis") 'Import in angegebenes Tabellenblatt
Set Conn = CreateObject("ADODB.Connection")
Conn.Provider = "MSDASQL"
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _
"DATABASE=dbname;" & _
"SERVER=server;", _
"user", "pw"
Set RS = CreateObject("ADODB.Recordset")
RS.CursorLocation = adUseClient
'verwendete SQL-Anweisung
RS.Source = "SELECT * from Kunden;"
Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open
Do While Not RS.EOF
'Die Spalenüberschriften einfügen Bezug aus dem SQL-Statement
If( headerSet = 0 ) Then
For i = 0 to RS.Fields.Count - 1
objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name
Next
headerSet = 1
End If
'Die dazugehörigen Werte einfügen
For i = 0 to RS.Fields.Count -1
objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value
Next
rowCount = rowCount + 1
RS.MoveNext
Loop
objExcel.Sheets("Pivot1").Select 'wählt die angegebene Mappe der zuvor geöffneten xls
RS.Close
Set RS = Nothing
Conn.Close
Set Conn = Nothing
MsgBox "Datenimport abgeschlossen! Die Datenbasis zeigt den Stand vom " & Date & " bis " & Time & "!",64, "Info"
Anzeige
AW: Der Code
05.03.2009 12:20:21
Ramses
Hallo
Dann probier mal folgendes,.. das ist die einfachste Variante
Dim x As Long
x = 1

Do While Not RS.EOF
Application.StatusBar = "Import Datensatz " & x
'Die Spalenüberschriften einfügen Bezug aus dem SQL-Statement
If (headerSet = 0) Then
For i = 0 To RS.Fields.Count - 1
objSheet.Cells(RowCount, i + 1).Value = RS.Fields.Item(i).Name
Next
headerSet = 1
End If
'Die dazugehörigen Werte einfügen
For i = 0 To RS.Fields.Count - 1
objSheet.Cells(RowCount + 1, i + 1).Value = RS.Fields.Item(i).Value
Next
RowCount = RowCount + 1
RS.MoveNext
x = x + 1
Loop
Application.StatusBar = false
Gruss Rainer
Anzeige
AW: Der Code
05.03.2009 12:29:00
Julia
Hallo,
hab es genau nach deinen Vorgaben in mein vbs eingefügt.
Wenn ich die Anwendung mit folgendem Code starte (vbs)
Öffnet sich die xls nicht mehr
Set WshShell = WScript.CreateObject("WScript.Shell")
set plink = WshShell.Exec ("skripte/plink/plink -ssh server -l user -pw pw -L zielport")
set oSplit = WshShell.Exec ("cscript skripte/db_to_xls.vbs")
Do While oSplit.Status = 0
WScript.Sleep 100 'hier wird gewartet bist das db_to_xls.vbs fertig ist.
Loop ' wenn jira_to_xls.vbs fertig ist dann
plink.Terminate 'wird der Plink beendet.
Anzeige
AW: Der Code
05.03.2009 14:04:06
Ramses
Hallo
"...hab es genau nach deinen Vorgaben in mein vbs eingefügt..."
Dein code steht doch in einer EXCEL Mappe,... oder ?
Also muss der Code doch dort hinein.
Wieso kopierst du den in dein VBS Script ?
Gruss Rainer
AW: Der Code
05.03.2009 14:24:27
Julia
Nein der Code steht nicht in der Excel Mappe
Der von mir gepostete Code ist eine *.vbs
Option Explicit
'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
' Const adOpenKeyset = 1
' Const adOpenDynamic = 2
' Const adOpenStatic = 3
'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
' Const adLockPessimistic = 2
' Const adLockOptimistic = 3
' Const adLockBatchOptimistic = 4
'---- CursorLocationEnum Values ----
' Const adUseServer = 2
Const adUseClient = 3
'---- ConnectModeEnum Values ----
' Const adModeUnknown = 0
Const adModeRead = 1
' Const adModeWrite = 2
' Const adModeReadWrite = 3
' Const adModeShareDenyRead = 4
' Const adModeShareDenyWrite = 8
' Const adModeShareExclusive = &Hc
' Const adModeShareDenyNone = &H10
' Const adModeRecursive = &H400000
Dim objExcel, objWb, SkriptPfad
Dim objSheet
Dim Conn, RS
Dim rowCount, i, headerSet
rowCount = 1
SkriptPfad = WScript.ScriptFullName 'Pfadermittlung
SkriptPfad = Left(SkriptPfad, Len(SkriptPfad) - Len(WScript.ScriptName)) 'Pfadermittlung
Set objExcel = CreateObject("Excel.Application")
Set objWb = objExcel.Workbooks.Open(SkriptPfad & "../test.xls")'öffnet die angegebene xls
objExcel.Visible = True
objExcel.Sheets("Datenbasis").Select 'wählt die angegebene Mappe der zuvor geöffneten xls
objExcel.Range("Datenbasis!$1:$65536").ClearContents 'löscht alle Inhalte von angegebener Mappe
'Angabe des Tabellenblattes
Set objSheet = objExcel.ActiveWorkbook.WorkSheets("Datenbasis") 'Import in angegebenes Tabellenblatt
Set Conn = CreateObject("ADODB.Connection")
Conn.Provider = "MSDASQL"
Conn.Mode = adModeRead
Conn.CursorLocation = adUseClient
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _
"DATABASE=dbname;" & _
"SERVER=server;", _
"user", "pw"
Set RS = CreateObject("ADODB.Recordset")
RS.CursorLocation = adUseClient
'verwendete SQL-Anweisung
RS.Source = "SELECT * from Kunden;"
Set RS.ActiveConnection = Conn
RS.CursorType = adOpenForwardOnly
RS.LockType = adLockReadOnly
RS.Open
Do While Not RS.EOF
'Die Spalenüberschriften einfügen Bezug aus dem SQL-Statement
If( headerSet = 0 ) Then
For i = 0 to RS.Fields.Count - 1
objSheet.Cells(rowCount, i+1).Value = RS.Fields.Item(i).Name
Next
headerSet = 1
End If
'Die dazugehörigen Werte einfügen
For i = 0 to RS.Fields.Count -1
objSheet.Cells(rowCount+1, i+1).Value = RS.Fields.Item(i).Value
Next
rowCount = rowCount + 1
RS.MoveNext
Loop
objExcel.Sheets("Pivot1").Select 'wählt die angegebene Mappe der zuvor geöffneten xls
RS.Close
Set RS = Nothing
Conn.Close
Set Conn = Nothing
MsgBox "Datenimport abgeschlossen! Die Datenbasis zeigt den Stand vom " & Date & " bis " & Time & "!",64, "Info"
Anzeige
AW: Der Code
05.03.2009 14:33:37
Ramses
Hallo
Sorry,...lch dachte der Code steht in einer EXCEL Mappe
Dann ändere mal die beiden Zeilen
Application.StatusBar = "Import Datensatz " & x
Application.StatusBar = false
in
objExcel.StatusBar = "Import Datensatz " & x
objExcel.Statusbar = False
und lösche das "As Long" aus der Anweisung "Dim x As Long"
Dann sollte das eigentlich tun.
Gruss Rainer
Anzeige
Super vielen Dank
05.03.2009 14:56:07
Julia
Klappt perfekt
Danke
Noch eine kurze Frage
05.03.2009 14:57:35
Julia
Hi,
deine Läösung klappt ja super
Kann man das ganze in einer MessageBox oder so ähnlich anstatt in der Statusbar realisieren?
AW: Noch eine kurze Frage
05.03.2009 16:54:41
Ramses
Hallo
Nein.
Msgboxen halten das makro solange auf bis eine Taste gedrückt wird.
Du kannst allenfalls zum Schluss noch eine Info anzeigen lassen mit
MsgBox "Import beendet", vbOkOnly, "Info"
Gruss Rainer
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

MsgBox oder Fortschrittsbalken in VBS: So informierst du den User


Schritt-für-Schritt-Anleitung

Um den Status eines Datenimports in einem Excel-Sheet während der Ausführung eines VBS-Skripts anzuzeigen, kannst du die Statusleiste in Excel verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. VBS-Skript vorbereiten: Beginne mit dem Import-Skript, das du bereits hast. Stelle sicher, dass du die Excel-Anwendung in deinem Code importiert hast.

  2. Statusleiste verwenden: Füge folgende Zeilen in die Schleife ein, die die Datensätze importiert:

    Dim x As Long
    x = 1
    Do While Not RS.EOF
       Application.StatusBar = "Import Datensatz " & x
       ' Hier deine Importlogik
       x = x + 1
       RS.MoveNext
    Loop
    Application.StatusBar = False
  3. MsgBox am Ende: Zum Abschluss des Imports kannst du eine MsgBox einblenden, um dem Benutzer zu zeigen, dass der Import abgeschlossen ist:

    MsgBox "Datenimport abgeschlossen!", vbInformation, "Info"
  4. Testen: Führe dein Skript aus, um sicherzustellen, dass die Statusleiste während des Imports aktualisiert wird und die MsgBox am Ende korrekt angezeigt wird.


Häufige Fehler und Lösungen

  • Problem: Die Excel-Datei öffnet sich nicht.

    • Lösung: Stelle sicher, dass der Pfad zur Excel-Datei korrekt ist und dass die Excel-Anwendung richtig initialisiert wurde.
  • Problem: Statusleiste wird nicht aktualisiert.

    • Lösung: Überprüfe, ob die Schleifenbedingungen korrekt sind und dass der Code zur Aktualisierung der Statusleiste innerhalb der Schleife steht.
  • Problem: MsgBox bleibt nicht stehen.

    • Lösung: MsgBoxen halten das Skript an, bis eine Taste gedrückt wird. Verwende sie nur für abschließende Informationen.

Alternative Methoden

Anstelle einer MsgBox kannst du auch eine Fortschrittsanzeige in Form eines UserForms in Excel erstellen. Dies erfordert mehr Aufwand, bietet aber eine bessere Benutzererfahrung:

  1. UserForm erstellen: Erstelle ein UserForm in Excel, das einen Fortschrittsbalken enthält.

  2. Fortschritt anzeigen: Aktualisiere den Fortschrittsbalken innerhalb deiner Import-Schleife, um den Fortschritt visuell darzustellen.

  3. Schließen des UserForms: Schließe das UserForm, sobald der Import abgeschlossen ist.


Praktische Beispiele

Hier ist ein Beispiel für einen einfachen Import-Code mit einer Statusanzeige:

Dim objExcel, objWb, Conn, RS
Set objExcel = CreateObject("Excel.Application")
Set objWb = objExcel.Workbooks.Open("C:\path\to\your\file.xls")
objExcel.Visible = True

' Datenbankverbindung aufbauen
Set Conn = CreateObject("ADODB.Connection")
Conn.Open "DRIVER={MySQL ODBC 5.1 Driver};DATABASE=dbname;SERVER=server;USER=user;PASSWORD=pw;"
Set RS = CreateObject("ADODB.Recordset")
RS.Open "SELECT * FROM Kunden;", Conn

Dim rowCount, x
rowCount = 1
x = 1

Do While Not RS.EOF
    Application.StatusBar = "Import Datensatz " & x
    ' Daten importieren
    x = x + 1
    RS.MoveNext
Loop

Application.StatusBar = False
MsgBox "Datenimport abgeschlossen!", vbInformation, "Info"

RS.Close
Conn.Close

Tipps für Profis

  • Nutze Application.ScreenUpdating = False, um das Flackern der Benutzeroberfläche während des Imports zu minimieren.
  • Verwende Error-Handling, um sicherzustellen, dass deine Anwendung auch bei Fehlern robust bleibt.
  • Teste dein Skript zuerst mit einer kleinen Datenmenge, um die Leistung und Genauigkeit zu überprüfen.

FAQ: Häufige Fragen

1. Kann ich die MsgBox in VBS verwenden, um den Fortschritt anzuzeigen?
Nein, MsgBoxen halten das Makro an. Verwende stattdessen die Statusleiste oder ein UserForm.

2. Wie kann ich den Fortschritt bei variabler Anzahl von Datensätzen anzeigen?
Nutze eine Schleife, die die Anzahl der importierten Zeilen zählt und diese in der Statusleiste anzeigt.

3. Was ist der Vorteil einer Statusleiste gegenüber einer MsgBox?
Die Statusleiste zeigt kontinuierlich den Fortschritt an, ohne das Skript anzuhalten, während eine MsgBox nur einmal angezeigt wird und das Skript anhält, bis eine Taste gedrückt wird.

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