Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
648to652
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
648to652
648to652
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Progressbar

Progressbar
13.08.2005 10:03:02
Rene
Moin zusammen,
Ich weiss das diese Frage schon mehrmals gestellt wurde, aber leider komm ich auch damit nicht weiter. Hier nun mal mein Problem.
Ich habe diesen Code:
Option Explicit
'Variablen Deklaration
' Funktion um Einträge aus einer INI Datei zu Lesen
Private Declare Function ReadINIString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault$, _
ByVal lpReturnedString$, ByVal nSize As Long, _
ByVal lpFileName$) As Long
' Funktion, um Einträge in eine INI Datei zu schreiben
Private Declare Function WriteINIString& Lib _
"kernel32" Alias "WritePrivateProfileStringA" _
(ByVal AppName$, ByVal KeyName$, _
ByVal keydefault$, ByVal FileName$)
'Einstellungen der letzten Ordner werden hier gespeichert
Private Const INI_File = "c:\DQM\LastFolder.ini"
'Einstellungen der letzten Ordner werden in diesen
'INI-Section's gespeichert
Private Const LastFolder As String = "LastFolder"
Private Const BaseFolder As String = "C:\DQM\Messung"
Function SaveMyFolder(mysection As String, NewFolder As String)
'1. Zuletzt verwendeten Ordner speichern
WriteINIString mysection, mysection, NewFolder, INI_File
End Function
Function GetMyFolder(mysection As String, LastFolder As String) As String
Dim tmpRead As String
'Variablengrösse bestimmen
'255 Zeichen lang
tmpRead = String(255, 0)
ReadINIString mysection, LastFolder, vbNullString, tmpRead, 255, INI_File
GetMyFolder = Left$(tmpRead, InStr(1, tmpRead, Chr(0)) - 1)
End Function
Sub Rename_and_MoveFiles()
'Verschiebt alle DQM und PS Dateien in einem Ordner
'in einen Zielordner und nummeriert diese neu
'Die Einstellungen BaseFolder und LastFolder werden in einer INI-Datei gespeichert
Dim tmpName As String, tarName As String, tarPath As String, srcPath As String
Dim myFSO As Object, myFld As Object, myFldFiles As Object, myFile As Object
Dim objFolder As Object, objFolderItem As Object, objShell As Object
Dim psCount As Integer, dqmCount As Integer, dqmCounter As Integer, psCounter As Integer
Dim Qe As Integer
Dim fSearch As FileSearch
Dim myErr As Integer
'ErrorHandler starten
On Error GoTo myErrorHandler
'Erstellen des FileSystemObjectes
Set myFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
'Zielordner auswählen
NewTargetPath:
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen..." & Chr$(13) & _
"ABBRECHEN um neuen Zielordner im Basisverzeichnis: """ & BaseFolder & """ zu erstellen.", 1&, GetMyFolder(LastFolder, LastFolder))
If objFolder Is Nothing Then
'Bei Abbrechen !!!! wenn neuer Zielordner im Basisfolder erstellt werden soll !!!
Qe = MsgBox("Möchten Sie einen neuen Zielordner erstellen ?", vbQuestion + vbYesNo, "Ziel ändern ?")
If Qe = vbYes Then
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen...", 0&, GetMyFolder(BaseFolder, BaseFolder))
If objFolder Is Nothing Then Exit Sub
Else
Exit Sub
End If
End If
Set objFolderItem = objFolder.Self
tarPath = objFolderItem.Path
If Not myFSO.FolderExists(tarPath) Then
MsgBox "Der Ordner :"" " & tarPath & " "" existiert nicht.", vbCritical + vbOKOnly, "Abbruch"
Exit Sub
End If
'Prüfung ob Quell und Zielordner gleich sind
If BaseFolder = tarPath Then
Qe = MsgBox("Der Quell- und der Zielpfad sind gleich." & Chr$(13) & _
"Neuen Ordner auswählen ?", vbCritical + vbYesNo, "Abbruch ?")
If Qe = vbNo Then
Exit Sub
Else
GoTo NewTargetPath
End If
End If
'Wenn neuer Zielordner definiert wurde diesen speichern
If tarPath GetMyFolder(LastFolder, LastFolder) Then
SaveMyFolder LastFolder, tarPath
End If
'File Search Initialisieren um die Anzahl Dateien zu bestimmen
Set fSearch = Application.FileSearch
With fSearch
'ermitteln der Anzahl von *.dqm - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = False ' .FileType = msoFileTypeAllFiles
.FileName = "*.dqm"
.Execute
dqmCount = .FoundFiles.Count
'ermitteln der Anzahl von *.ps - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = False ' .FileType = msoFileTypeAllFiles
.FileName = "*.ps"
.Execute
psCount = .FoundFiles.Count
End With
'Move Schleife starten
Set myFld = myFSO.GetFolder(BaseFolder)
'Zuweisung der Dateien in diesem Ordner
Set myFldFiles = myFld.Files
For Each myFile In myFldFiles
tmpName = myFile.name
'Andere Files vom Kopiervorgang ausschliessen
If Right(tmpName, 3) = "dqm" Or Right(tmpName, 2) = "ps" Then
If Right(tmpName, 3) = "dqm" Then
tarName = tarPath & "\Mp" & Format(dqmCount, "000") & ".dqm"
'DQM Zähler hochsetzen
dqmCounter = dqmCounter + 1
dqmCount = dqmCount + 1
ElseIf Right(tmpName, 2) = "ps" Then
tarName = tarPath & "\Mp" & Format(psCount, "000") & ".ps"
'PS Zähler hochsetzen
psCounter = psCounter + 1
psCount = psCount + 1
End If
myFSO.MoveFile myFile, tarName
End If
MoveRestart:
Next
MsgBox "Es wurden "" " & dqmCounter & " dqm "" und "" " & Chr$(13) & _
psCounter & " ps "" Dateien verschoben"
'Fehlerbehandlung Ende
myErrorExit:
Exit Sub
'Fehlerbehandlung starten
myErrorHandler:
Select Case Err
Case 58
Qe = MsgBox("Die Datei "" " & myFile & " "" mit dem neuen Namen: "" " & tarName & _
" "" existiert bereits im Folder " & tarPath & Chr$(13) & _
"Soll das Makro abgebrochen werden ?" & Chr$(13) & _
"Bei NEIN wird versucht die restlichen Dateien zu verschieben ?! ", _
vbCritical + vbYesNoCancel, "Doppelte Datei")
If Qe = vbYes Then
MsgBox "Makro wird abgebrochen"
Resume myErrorExit
Exit Sub
End If
Resume MoveRestart
Case Else
MsgBox Err.Number & ": " & Err.Description, vbCritical + vbOKOnly, "Unerwarteter Fehler > Abbruch File-Move Action"
Resume myErrorExit
End Select
End Sub
Der klappt auch prima da es aber sehr lange dauert wollte ich gerne ein Progressbar mit einbinden.Nun habe ich diesen Code hier gefunden:
Modul:
' macros written 25. november 1998 by Ole P. Erlandsen, ope@edc.bizhosting.com
Option Explicit
Sub ShowDialog()
Load ProgressDlg
ProgressDlg.Show
End Sub
Sub Main()
Dim i As Long, max As Long
max = 1005000
ProgressDlg.Caption = "In Arbeit,bitte warten..."
For i = 1 To max
If i Mod 5 = 0 Then ProgressBar i / max
' do something
Next i
Unload ProgressDlg
End Sub
Sub ProgressBar(PctDone As Single)
With ProgressDlg
.lblDone.Width = PctDone * (.lblRemain.Width - 2)
.lblPct.Caption = Format(PctDone, "0%")
End With
'The DoEvents statement is responsible for the form updating
DoEvents
End Sub
Userform:

Private Sub UserForm_Activate()
Call Main
End Sub


Private Sub UserForm_Initialize()
With Me.lblDone ' set the "progress bar" to it's initial length
.Top = Me.lblRemain.Top + 1
.Left = Me.lblRemain.Left + 1
.Height = Me.lblRemain.Height - 2
.Width = 0
End With
End Sub

Habe bei diesem Code nur das genommen was für mich interessant ist (original sind noch zwei weitere)
Nun weiß ich aber leider nicht wo ich das in dem meinem Modul einbinden muß,das der Balken solange läuft bis mein Macro zu Ende ist.Die Zeit ist kein Problem wenn ich den Code einfüge läuft der Balken und wenn dieser Ende ist dann führt es erst mein Macro aus.Wenn es aber machbar ist wollte ich es so haben das Balken läuft und im Hintergrund mein Macro läuft.
Ich hoffe ich habe mich verständlich ausgedrückt und es kann mir jemand helfen.
Danke Gruß Rene

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Progressbar
13.08.2005 13:18:39
Rene
Hi,
Hat keiner einer Idee für mich? Bitte helft mir.
gruß Rene
AW: Progressbar
13.08.2005 15:24:40
Rene
Moin,
Frage ist noch offen
gruß rene
AW: Progressbar
13.08.2005 16:05:28
MartinM
Hallo Rene
Versuche den Teil dieses Sub's in deinen Hauptscript"

Sub Rename_and_MoveFiles()
" zu binden.
Dim max As Long ' in die Deklaration des Hauptscrips
max = psCount + dqmCount
ProgressDlg.Caption = "In Arbeit,bitte warten..."
'ab hier Deine Schlaufe beginnen
'dies vor dem Next deiner Schlaufe
ProgressBar (pscounter + dqmcounter) / max
'diesen Teil nach Deiner Schlaufe oder vor dem End Sub

Unload ProgressDlg
'Diese Procedur kanst Du nun löschen, die war für die Demo des Processbar bestimmt..

Sub Main()
Dim i As Long, max As Long
max = 1005000
ProgressDlg.Caption = "In Arbeit,bitte warten..."
For i = 1 To max
If i Mod 5 = 0 Then ProgressBar i / max
' do something
Next i
Unload ProgressDlg
End Sub

Gruss MartinM
Eigentlich sollte das dann funktionieren. Vorausgesetzt die User Form ist richtig erstellt worden
Anzeige
AW: Progressbar
13.08.2005 16:47:19
Rene
Hi Martin,
Danke für deine Antwort werde es gleich mal testen melde mich dann noch mal.
gruß rene
AW: Progressbar
13.08.2005 17:20:36
Rene
Hi Martin,
Habe nun meinen Code so gemacht:
Option Explicit
'Variablen Deklaration
' Funktion um Einträge aus einer INI Datei zu Lesen
Private Declare Function ReadINIString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault$, _
ByVal lpReturnedString$, ByVal nSize As Long, _
ByVal lpFileName$) As Long
' Funktion, um Einträge in eine INI Datei zu schreiben
Private Declare Function WriteINIString& Lib _
"kernel32" Alias "WritePrivateProfileStringA" _
(ByVal AppName$, ByVal KeyName$, _
ByVal keydefault$, ByVal FileName$)
'Einstellungen der letzten Ordner werden hier gespeichert
Private Const INI_File = "c:\DQM\LastFolder.ini"
'Einstellungen der letzten Ordner werden in diesen
'INI-Section's gespeichert
Private Const LastFolder As String = "LastFolder"
Private Const BaseFolder As String = "C:\DQM\Messung"
Function SaveMyFolder(mysection As String, NewFolder As String)
'1. Zuletzt verwendeten Ordner speichern
WriteINIString mysection, mysection, NewFolder, INI_File
End Function
Function GetMyFolder(mysection As String, LastFolder As String) As String
Dim tmpRead As String
'Variablengrösse bestimmen
'255 Zeichen lang
tmpRead = String(255, 0)
ReadINIString mysection, LastFolder, vbNullString, tmpRead, 255, INI_File
GetMyFolder = Left$(tmpRead, InStr(1, tmpRead, Chr(0)) - 1)
End Function
Sub Rename_and_MoveFiles()
'Verschiebt alle DQM und PS Dateien in einem Ordner
'in einen Zielordner und nummeriert diese neu
'Die Einstellungen BaseFolder und LastFolder werden in einer INI-Datei gespeichert
Dim tmpName As String, tarName As String, tarPath As String, srcPath As String
Dim myFSO As Object, myFld As Object, myFldFiles As Object, myFile As Object
Dim objFolder As Object, objFolderItem As Object, objShell As Object
Dim psCount As Integer, dqmCount As Integer, dqmCounter As Integer, psCounter As Integer
Dim Qe As Integer
Dim fSearch As FileSearch
Dim myErr As Integer
Dim max As Long
max = psCount + dqmCount
ProgressDlg.Caption = "In Arbeit,bitte warten...."
'ErrorHandler starten
On Error GoTo myErrorHandler
'Erstellen des FileSystemObjectes
Set myFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
'Zielordner auswählen
NewTargetPath:
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen..." & Chr$(13) & _
"ABBRECHEN um neuen Zielordner im Basisverzeichnis: """ & BaseFolder & """ zu erstellen.", 1&, GetMyFolder(LastFolder, LastFolder))
If objFolder Is Nothing Then
'Bei Abbrechen !!!! wenn neuer Zielordner im Basisfolder erstellt werden soll !!!
Qe = MsgBox("Möchten Sie einen neuen Zielordner erstellen ?", vbQuestion + vbYesNo, "Ziel ändern ?")
If Qe = vbYes Then
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen...", 0&, GetMyFolder(BaseFolder, BaseFolder))
If objFolder Is Nothing Then Exit Sub
Else
Exit Sub
End If
End If
Set objFolderItem = objFolder.Self
tarPath = objFolderItem.Path
If Not myFSO.FolderExists(tarPath) Then
MsgBox "Der Ordner :"" " & tarPath & " "" existiert nicht.", vbCritical + vbOKOnly, "Abbruch"
Exit Sub
End If
'Prüfung ob Quell und Zielordner gleich sind
If BaseFolder = tarPath Then
Qe = MsgBox("Der Quell- und der Zielpfad sind gleich." & Chr$(13) & _
"Neuen Ordner auswählen ?", vbCritical + vbYesNo, "Abbruch ?")
If Qe = vbNo Then
Exit Sub
Else
GoTo NewTargetPath
End If
End If
'Wenn neuer Zielordner definiert wurde diesen speichern
If tarPath GetMyFolder(LastFolder, LastFolder) Then
SaveMyFolder LastFolder, tarPath
End If
'File Search Initialisieren um die Anzahl Dateien zu bestimmen
Set fSearch = Application.FileSearch
With fSearch
'ermitteln der Anzahl von *.dqm - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = False ' .FileType = msoFileTypeAllFiles
.FileName = "*.dqm"
.Execute
dqmCount = .FoundFiles.Count
'ermitteln der Anzahl von *.ps - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = False ' .FileType = msoFileTypeAllFiles
.FileName = "*.ps"
.Execute
psCount = .FoundFiles.Count
End With
'Move Schleife starten
Set myFld = myFSO.GetFolder(BaseFolder)
'Zuweisung der Dateien in diesem Ordner
Set myFldFiles = myFld.Files
For Each myFile In myFldFiles
tmpName = myFile.name
'Andere Files vom Kopiervorgang ausschliessen
If Right(tmpName, 3) = "dqm" Or Right(tmpName, 2) = "ps" Then
If Right(tmpName, 3) = "dqm" Then
tarName = tarPath & "\Mp" & Format(dqmCount, "000") & ".dqm"
'DQM Zähler hochsetzen
dqmCounter = dqmCounter + 1
dqmCount = dqmCount + 1
ElseIf Right(tmpName, 2) = "ps" Then
tarName = tarPath & "\Mp" & Format(psCount, "000") & ".ps"
'PS Zähler hochsetzen
psCounter = psCounter + 1
psCount = psCount + 1
End If
myFSO.MoveFile myFile, tarName
End If
MoveRestart:
ProgressBar (psCounter + dqmCounter) / max
Next
MsgBox "Es wurden "" " & dqmCounter & " dqm "" und "" " & Chr$(13) & _
psCounter & " ps "" Dateien verschoben"
'Fehlerbehandlung Ende
myErrorExit:
Exit Sub
'Fehlerbehandlung starten
myErrorHandler:
Select Case Err
Case 58
Qe = MsgBox("Die Datei "" " & myFile & " "" mit dem neuen Namen: "" " & tarName & _
" "" existiert bereits im Folder " & tarPath & Chr$(13) & _
"Soll das Makro abgebrochen werden ?" & Chr$(13) & _
"Bei NEIN wird versucht die restlichen Dateien zu verschieben ?! ", _
vbCritical + vbYesNoCancel, "Doppelte Datei")
If Qe = vbYes Then
MsgBox "Makro wird abgebrochen"
Resume myErrorExit
Exit Sub
End If
Resume MoveRestart
Case Else
MsgBox Err.Number & ": " & Err.Description, vbCritical + vbOKOnly, "Unerwarteter Fehler > Abbruch File-Move Action"
Resume myErrorExit
End Select
Unload ProgressDlg
End Sub
Dann habe ich noch in der UserForm "ProgessDlg" auf das Macro Rename and MoveFiles verwiesen:

Private Sub UserForm_Activate()
Call Rename_and_MoveFiles
End Sub


Private Sub UserForm_Initialize()
With Me.lblDone ' set the "progress bar" to it's initial length
Das Modul für die ProgessBar sieht so aus:
Sub ShowDialog()
Load ProgressDlg
ProgressDlg.Show
End Sub

Sub ProgressBar(PctDone As Single)
With ProgressDlg
.lblDone.Width = PctDone * (.lblRemain.Width - 2)
.lblPct.Caption = Format(PctDone, "0%")
End With
'The DoEvents statement is responsible for the form updating
DoEvents
End Sub
Wenn ich dann auf meine CmdButton klicke der für das speichern zuständig ist merkt mann das etwas passiert aber bekomme dann kurz danach "Lfz 11: Division durch Null nicht möglich"
Weißt du Rat?
gruß Rene
.Top = Me.lblRemain.Top + 1
.Left = Me.lblRemain.Left + 1
.Height = Me.lblRemain.Height - 2
.Width = 0
End With
End Sub
Anzeige
AW: Progressbar
13.08.2005 21:05:23
MartinM
Hallo Rene
Werde später am Abend den Code analysieren.
Bin zur Zeit auf Besuch
Gruss
MartinM
AW: Progressbar
13.08.2005 22:17:45
MartinM
Hallo Rene
versuch mal diesen Script.
Gruss
MartinM


      
Sub Rename_and_MoveFiles()
'Verschiebt alle DQM und PS Dateien in einem Ordner
'in einen Zielordner und nummeriert diese neu
'Die Einstellungen BaseFolder und LastFolder werden in einer INI-Datei gespeichert
Dim tmpName As String, tarName As String, tarPath As String, srcPath As String
Dim myFSO As Object, myFld As Object, myFldFiles As Object, myFile As Object
Dim objFolder As Object, objFolderItem As Object, objShell As Object
Dim psCount As Integer, dqmCount As Integer, dqmCounter As Integer, psCounter As Integer
Dim Qe As Integer
Dim fSearch As FileSearch
Dim myErr As Integer
Dim max As Long
ProgressDlg.Caption = "In Arbeit,bitte warten...."
'ErrorHandler starten
On Error GoTo myErrorHandler
'Erstellen des FileSystemObjectes
Set myFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
'Zielordner auswählen
NewTargetPath:
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen..." & Chr$(13) & _
"ABBRECHEN um neuen Zielordner im Basisverzeichnis: """ & BaseFolder & """ zu erstellen.", 1&, GetMyFolder(LastFolder, LastFolder))
If objFolder Is Nothing Then
'Bei Abbrechen !!!! wenn neuer Zielordner im Basisfolder erstellt werden soll !!!
Qe = MsgBox("Möchten Sie einen neuen Zielordner erstellen ?", vbQuestion + vbYesNo, "Ziel ändern ?")
If Qe = vbYes Then
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen...", 0&, GetMyFolder(BaseFolder, BaseFolder))
If objFolder Is Nothing Then Exit Sub
Else
Exit Sub
End If
End If
Set objFolderItem = objFolder.Self
tarPath = objFolderItem.Path
If Not myFSO.FolderExists(tarPath) Then
MsgBox "Der Ordner :"" " & tarPath & " "" existiert nicht.", vbCritical + vbOKOnly, "Abbruch"
Exit Sub
End If
'Prüfung ob Quell und Zielordner gleich sind
If BaseFolder = tarPath Then
Qe = MsgBox("Der Quell- und der Zielpfad sind gleich." & Chr$(13) & _
"Neuen Ordner auswählen ?", vbCritical + vbYesNo, "Abbruch ?")
If Qe = vbNo Then
Exit Sub
Else
GoTo NewTargetPath
End If
End If
'Wenn neuer Zielordner definiert wurde diesen speichern
If tarPath <> GetMyFolder(LastFolder, LastFolder) Then
SaveMyFolder LastFolder, tarPath
End If
'File Search Initialisieren um die Anzahl Dateien zu bestimmen
Set fSearch = Application.FileSearch
With fSearch
'ermitteln der Anzahl von *.dqm - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = 
False '<<<
.FileType = msoFileTypeAllFiles
.FileName = "*.dqm"
.Execute
dqmCount = .FoundFiles.Count
'ermitteln der Anzahl von *.ps - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = 
False '<<<
.FileType = msoFileTypeAllFiles
.FileName = "*.ps"
.Execute
psCount = .FoundFiles.Count
End With
'Die Max Variable darf natürlich erst nach der Ermittling von .FoundFiles.Count stehen
'da andernfalls die Werte auf = stehen und Division durch Null geht nun mal nicht.
max = psCount + dqmCount

'Move Schleife starten
Set myFld = myFSO.GetFolder(BaseFolder)
'Zuweisung der Dateien in diesem Ordner
Set myFldFiles = myFld.Files
For Each myFile In myFldFiles
tmpName = myFile.name
'Andere Files vom Kopiervorgang ausschliessen
If Right(tmpName, 3) = "dqm" Or Right(tmpName, 2) = "ps" Then
If Right(tmpName, 3) = "dqm" Then
tarName = tarPath & "\Mp" & Format(dqmCount, "000") & ".dqm"
'DQM Zähler hochsetzen
dqmCounter = dqmCounter + 1
dqmCount = dqmCount + 1
ElseIf Right(tmpName, 2) = "ps" Then
tarName = tarPath & "\Mp" & Format(psCount, "000") & ".ps"
'PS Zähler hochsetzen
psCounter = psCounter + 1
psCount = psCount + 1
End If
myFSO.MoveFile myFile, tarName
End If
MoveRestart:
ProgressBar (psCounter + dqmCounter) / max
Next
MsgBox "Es wurden "" " & dqmCounter & " dqm "" und "" " & Chr$(13) & _
psCounter & " ps "" Dateien verschoben"
'Fehlerbehandlung Ende
myErrorExit:
Exit Sub
'Fehlerbehandlung starten
myErrorHandler:
Select Case Err
Case 58
Qe = MsgBox("Die Datei "" " & myFile & " "" mit dem neuen Namen: "" " & tarName & _
" "" existiert bereits im Folder " & tarPath & Chr$(13) & _
"Soll das Makro abgebrochen werden ?" & Chr$(13) & _
"Bei NEIN wird versucht die restlichen Dateien zu verschieben ?! ", _
vbCritical + vbYesNoCancel, "Doppelte Datei")
If Qe = vbYes Then
MsgBox "Makro wird abgebrochen"
Resume myErrorExit
Exit Sub
End If
Resume MoveRestart
Case Else
MsgBox Err.Number & ": " & Err.Description, vbCritical + vbOKOnly, "Unerwarteter Fehler > Abbruch File-Move Action"
Resume myErrorExit
End Select
Unload ProgressDlg
End Sub
 


Anzeige
AW: Progressbar
14.08.2005 10:40:16
Rene
Moin Martin,
Zuerst mal Danke für deine Mühe,hatte gestern Abend auch keine Zeit mehr. aber leider klappt es immer noch nicht. Das Macro läuft zwar aber ich bekomme nicht die Anzeige von der Progressbar. Probiere hier hin und her komme aber zu keinem Ergebniss. Kann mann das nicht irgendwie simulieren? Das die Progressbar im vordergrund eine gewisse Zeit läuft und im Hintergrund das eigentliche Macro läuft? Nur das der Anwender sieht (durch die Progressbar) hier tut sich etwas und wird nicht ungeduldig.
mfg Rene
AW: Progressbar
14.08.2005 16:00:11
MartinM
Hallo Rene
Hatte ShowDialog vergessen, das sollte unbedingt noch in den Script rein und zwar als Eintrag vor der Schleife.

Sub Rename_and_MoveFiles()
'Verschiebt alle DQM und PS Dateien in einem Ordner
'in einen Zielordner und nummeriert diese neu
'Die Einstellungen BaseFolder und LastFolder werden in einer INI-Datei gespeichert
Dim tmpName As String, tarName As String, tarPath As String, srcPath As String
Dim myFSO As Object, myFld As Object, myFldFiles As Object, myFile As Object
Dim objFolder As Object, objFolderItem As Object, objShell As Object
Dim psCount As Integer, dqmCount As Integer, dqmCounter As Integer, psCounter As Integer
Dim Qe As Integer
Dim fSearch As FileSearch
Dim myErr As Integer
Dim max As Long
ProgressDlg.Caption = "In Arbeit,bitte warten...."
'ErrorHandler starten
On Error GoTo myErrorHandler
'Erstellen des FileSystemObjectes
Set myFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
'Zielordner auswählen
NewTargetPath:
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen..." & Chr$(13) & _
"ABBRECHEN um neuen Zielordner im Basisverzeichnis: """ & BaseFolder & """ zu erstellen.", 1&, GetMyFolder(LastFolder, LastFolder))
If objFolder Is Nothing Then
'Bei Abbrechen !!!! wenn neuer Zielordner im Basisfolder erstellt werden soll !!!
Qe = MsgBox("Möchten Sie einen neuen Zielordner erstellen ?", vbQuestion + vbYesNo, "Ziel ändern ?")
If Qe = vbYes Then
Set objFolder = objShell.BrowseForFolder(0&, "Ziel Ordner auswählen...", 0&, GetMyFolder(BaseFolder, BaseFolder))
If objFolder Is Nothing Then Exit Sub
Else
Exit Sub
End If
End If
Set objFolderItem = objFolder.Self
tarPath = objFolderItem.Path
If Not myFSO.FolderExists(tarPath) Then
MsgBox "Der Ordner :"" " & tarPath & " "" existiert nicht.", vbCritical + vbOKOnly, "Abbruch"
Exit Sub
End If
'Prüfung ob Quell und Zielordner gleich sind
If BaseFolder = tarPath Then
Qe = MsgBox("Der Quell- und der Zielpfad sind gleich." & Chr$(13) & _
"Neuen Ordner auswählen ?", vbCritical + vbYesNo, "Abbruch ?")
If Qe = vbNo Then
Exit Sub
Else
GoTo NewTargetPath
End If
End If
'Wenn neuer Zielordner definiert wurde diesen speichern
If tarPath <> GetMyFolder(LastFolder, LastFolder) Then
SaveMyFolder LastFolder, tarPath
End If
'File Search Initialisieren um die Anzahl Dateien zu bestimmen
Set fSearch = Application.FileSearch
With fSearch
'ermitteln der Anzahl von *.dqm - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = False '<<<
.FileType = msoFileTypeAllFiles
.FileName = "*.dqm"
.Execute
dqmCount = .FoundFiles.Count
'ermitteln der Anzahl von *.ps - Files im Zielordner
.NewSearch
.LookIn = tarPath
.SearchSubFolders = False '<<<
.FileType = msoFileTypeAllFiles
.FileName = "*.ps"
.Execute
psCount = .FoundFiles.Count
End With
'Die Max Variable darf natürlich erst nach der Ermittling von .FoundFiles.Count stehen
'da andernfalls die Werte auf = stehen und Division durch Null geht nun mal nicht.
max = psCount + dqmCount
ShowDialog
'Move Schleife starten
Set myFld = myFSO.GetFolder(BaseFolder)
'Zuweisung der Dateien in diesem Ordner
Set myFldFiles = myFld.Files
For Each myFile In myFldFiles
tmpName = myFile.name
'Andere Files vom Kopiervorgang ausschliessen
If Right(tmpName, 3) = "dqm" Or Right(tmpName, 2) = "ps" Then
If Right(tmpName, 3) = "dqm" Then
tarName = tarPath & "\Mp" & Format(dqmCount, "000") & ".dqm"
'DQM Zähler hochsetzen
dqmCounter = dqmCounter + 1
dqmCount = dqmCount + 1
ElseIf Right(tmpName, 2) = "ps" Then
tarName = tarPath & "\Mp" & Format(psCount, "000") & ".ps"
'PS Zähler hochsetzen
psCounter = psCounter + 1
psCount = psCount + 1
End If
myFSO.MoveFile myFile, tarName
End If
MoveRestart:
ProgressBar (psCounter + dqmCounter) / max
Next
MsgBox "Es wurden "" " & dqmCounter & " dqm "" und "" " & Chr$(13) & _
psCounter & " ps "" Dateien verschoben"
'Fehlerbehandlung Ende
myErrorExit:
Exit Sub
'Fehlerbehandlung starten
myErrorHandler:
Select Case Err
Case 58
Qe = MsgBox("Die Datei "" " & myFile & " "" mit dem neuen Namen: "" " & tarName & _
" "" existiert bereits im Folder " & tarPath & Chr$(13) & _
"Soll das Makro abgebrochen werden ?" & Chr$(13) & _
"Bei NEIN wird versucht die restlichen Dateien zu verschieben ?! ", _
vbCritical + vbYesNoCancel, "Doppelte Datei")
If Qe = vbYes Then
MsgBox "Makro wird abgebrochen"
Resume myErrorExit
Exit Sub
End If
Resume MoveRestart
Case Else
MsgBox Err.Number & ": " & Err.Description, vbCritical + vbOKOnly, "Unerwarteter Fehler > Abbruch File-Move Action"
Resume myErrorExit
End Select
Unload ProgressDlg
End Sub

Anzeige
AW: Progressbar
14.08.2005 18:28:14
Rene
Moin Martin,
Danke dir für deine Mühe aber ich muß dich leider immer noch enttäuschen es klappt immer noch nicht.
Ich habe deinen Script nun mit meinem ersetzt,weiterhin habe ich in der zweiten UserForm die ja ProgressDlg heißt die Call Anweißung meinem Macro zugewießen mit Rename_and_MoveFiles dieses steht in der UserForm_Activate Anweißung. Aber es geht immer noch nicht.
Hier ist mal die gekürzte Fassung ich hoffe das du alles sehen kannst.
https://www.herber.de/bbs/user/25623.xls
Ich weiß nicht warum es nicht geht.Ich hoffe das du mir helfen kannst und danke für deine Mühe
Gruß Rene
Anzeige
AW: Progressbar
14.08.2005 21:37:33
MartinM
Hallo Rene
Habe eine andere Variante des Progressbar eingebaut, das Script kann bei mir nicht laufen, falscher Pfad und fehlende Dateien.
Versuche mal in eine Kopie Deiner Datei die frmProgress Userform mit der Deinen zu tauschen und den Script wie in Modul5 umzukopieren in den Hauptscript.
Mit der Procedur Schleife_Start wird der Progressbar aufgerufen.
https://www.herber.de/bbs/user/25630.xls
Habe diese Version ebenfalls in Bertieb und es funktioniert tip top.
Aber auch bei mir war der Einbau einer Progressbar ein grosser Lernerfolg.
Es ist für mich nicht einfach desn Sript 100% zu testen weil da die CommandButton fehlen.
Gruss
MartinM
Anzeige
AW: Progressbar
14.08.2005 22:43:29
Rene
Hi Martin,
Du machst dir ja echt Arbeit und es sah wirklich erst gut aus,habe alles ersetzt mußte dann in dem Script die 'frmProgress.Show Abfrage wegnehmen da sie ja in der Schleife_Start schon vorhanden war und er mir dabei sonst immer einen Debugg Fehler gab.Danach ging es auch prima bis zu dem Zeitpunkt wo ich bei der Ordnerauswahl auf Abrechen geklickt habe um einen neuen Ordner zu erstellen was auch wichtig ist dieses zu können.Seit dem gibt er mir aber den LZF 6: "Überlauf" ich weiß nicht was dieser zu bedeuten hat.
Gruß Rene
AW: Progressbar
15.08.2005 13:00:37
MartinM
Hallo Rene
Also folgendes
Was dieser Laufzeitfehler zu bedeuten hat, kann ich Dir nicht sagen, aber prüfe doch mal die Logik deiner Schlaufe.
Damit eine Schleife in die Progressbar eingebunden werden kann, müssen folgende Variablen mit Daten gefüttert werden.
lblProgress
Diese Variable ist die prozentuelle Fortschrittsberechnung
(Alle gefundenen Dateien / aktuell abgearbeitete Dateien)
in Deinem Script ((pscounter + dqscounter) / max) in max werden
als erster Schritt gleich nach der Ermittlung der gefundenden Dateien
die werte pscount und dqscount zusammengezäht.
lblProgressTxt
Diese Variable ist die prozentuelle Wert als % angezeigt im Processbar
und ist nur eine umformatierung vom Wert aus lblProgress.
lblProgressTxt.Caption = Format(dblProgress, "0 %")
lblProgressTxt3
Diese Variable wird benötigt zur Darstellung der aktuell abgearbeiteten Dateien.
lblProgressTxt4
Diese Variable ist die Darstellung der variable max (aller abzuarbeitender Dateien)
Deine Aufgabe ist es nun in deiner Schlaufe die Variablen an der richtigen Stelle zu plazieren, damit die logische Aufaddierung der Progressschritte möglich ist.
Geh doch in die Version zurück welche noch ohne Processbar war und ergänze diese mit der neuen Version des Processbar.
Gruss
MartinM
Anzeige
AW: Progressbar
15.08.2005 15:43:49
Rene
Hallo Martin,
Der Fehler 6:Überlauf muß etwas internes sein von dem Macro habe aber noch nichts gefunden.
Habe es noch mal probiert aber leider komme ich nicht zurecht.Ich weiß gar nicht wo die lblProgressTxt und lblProgressTxt3 und 4 stehen. Habe nur die Call Anweißung gefunden.
Ich werde wohl die ganze Sache nie verstehen.
Aber ich gebe nicht auf!
gruß rene
AW: Progressbar
16.08.2005 13:11:14
MartinM
Hallo Rene
Das gleiche habe ich auch erlebt, aber ebenfalls nie aufgegeben.
Die Variablen müssen in deinem Script eingefügt werden und zwar wie in der letzten Antwort erklärt.
Da ich die Logik Deiner Schleife nicht genau interpretieren kann werde ich versuchen die Details etwas genauer zu erklären. Vieleicht kann ich Dir so ein bisschen weiterhelfen, denn wenn Du einmal den Progressbar verstehst, dann wirst Du über Dich selber lachen können (so wie ich mich über mich erfreuen konnte als ich die Logik gefunden hatte)
Hier nochmals die dazu nötigen Variablen, die am besten am Schluss der Schlaufe stehen:
- lblProgress
Diese Variable ist die prozentuelle Fortschrittsberechnung
(Alle gefundenen Dateien / aktuell abgearbeitete Dateien)
in Deinem Script: lblProgress = ((pscounter + dqscounter) / max)
in max werden als erster Schritt gleich nach der Ermittlung der gefundenden Dateien
die werte pscount und dqscount zusammengezäht.
- lblProgressTxt
Diese Variable ist die prozentuelle Wert als % angezeigt im Processbar
und ist nur eine umformatierung vom Wert aus lblProgress.
in Deinem Script: lblProgressTxt.Caption = Format(dblProgress, "0 %")
- lblProgressTxt3
Diese Variable wird benötigt zur Darstellung der aktuell abgearbeiteten Dateien.
in deinem Script: lblProgressTxt3 = pscounter + dqscounter
- lblProgressTxt4
Diese Variable ist die Darstellung der variable max (aller abzuarbeitender Dateien)
in Deinem Script: lblProgressTxt4 = max
Anderes Beispiel
'Vor dem Beginn der Schleife:
'Ermittlung aller Dateien und Übergabe an Variable max.
max = pscount + dqscount
lblProgressTxt4 = max
'Beginn Schleife:
'la la la, lalala
'usw.
'am Ende der Schleife die Counter updaten
'und jetzt die Variablen füttern
lblProgress = ((pscounter + dqscounter) / max)
lblProgressTxt3 = pscounter + dqscounter
'damit die Anzeige ein update erfährt
DoEvents
'jetzt die Schleife weiterführen
Next
und jetzt viel Spass beim umsetzen.
Gruss MartinM
Der Weg ist das Ziel!
Anzeige
Lösung Progressbar
16.08.2005 22:01:32
MartinM
Hallo Rene
Dein Problem sollte jetzt gelöst sein.
Bitte sieh dir die Datei im Link an.
https://www.herber.de/bbs/user/25704.xls
Die Meldung Überlauf kommt wenn keine der Dateien die Du suchst im Vezeichniss Messung sind.
Habe die Makros in Diese Arbeitsmappe und in Tabelle1 deaktiviert. Es fehlen noch CommandButtons welche bei mir Fehler verurschten.
Habe den Script ergänzt mit der Suche nach allen der zu verschiebenden Dateien, damit der Counter in der Progressbar auch etwas zu Progressen hat.
Gruss
MartinM
Der Weg ist das Ziel!
Anzeige
Ich kann wieder schlafen
17.08.2005 01:22:52
Rene
Moin Martin,
Ich freu mich und danke dir 1000 mal für deine Mühe und deine Hilfe da wäre ich bestimmt nie draufgekommen. Habe mir noch diese Sache mit eingebaut:
'Je nachdem, ob der Vorgang abgebrochen wurde oder erfolgreich
' beendet wurde, entsprechenden Text in Label anzeigen
If g_blnCancel Then
Me.lblProgressMsg.Caption = _
"Der Vorgang wurde abgebrochen !"
-------------------------------------------------------------------------------

ElseIf Me.lblProgressTxt4 = 0 Then
Me.lblProgressMsg.Caption = _
"Es sind keine Messungen in " & _
vbCrLf & "C:\DQM\Messung " & _
vbCrLf & "vorhanden !"

Else
-------------------------------------------------------------------------------

Me.lblProgressMsg.Caption = _
"Der Vorgang wurde erfolgreich abgeschlossen !"
End If
das die Meldung der Speichervorgang ist abgeschlossen auch nur dann kommt. Aber das ist ja das kleinste Übel gewesen.Ich hoffe das ich das alles auch irgendwann mal richtig verstehen werde. Danke dir noch mal.
Grüße aus dem Schaumburger Wald
Rene
AW: Ich kann wieder schlafen
17.08.2005 08:43:00
MartinM
Hallo Rene
freut mich, dass es klappt.
Habe das wirklich gerne gemacht, es ist für mich immer wieder eine neue Motivation, alles möglich zu machen, was unlösbar scheint.
Gruss MartinM
Der Weg ist das Ziel!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige