Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1056to1060
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
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?

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
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.
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.
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
Anzeige
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
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

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige