none
VBA - Progressbar während einer Abfrage als *Prozess* anzeigen ..

    Frage

  • Hallo @ all,

    ich habe folgendes Problem. In einer Schleife frage ich mittels VBA, mehrere Rechner ab.
    Um sicherzustellen, das die Rechner Netzseitig zu erreichen sind, setzte ich einen Ping auf den Rechner ab.

    Der Ping wird 3 x wiederholt. Ist nach dem dritten Ping der Rückgabewert wieder *False*, behandle ich diesen als *Offline* und setze die Abfrage mit den nächsten  fort.

    Diesen Status, Ping1 ...... Ping2 ..... Ping3 würde ich gerne mit einer Progressbar darstellen, damit der Anwender sieht, dass der Prozeß noch nicht beendet ist/Programm noch arbeitet.

    Die Progressbar erwartet immer einen Wert (0-100). Das Problem ist für mich, dass ich nicht weiß wie ich es umsetzen muß, das die Zeit **offen** ist, so habe ich keinen Wert von zwischen 0 - 100. Einmal antwortet der Rechner evtl. ja sofort. Der nächste ist Offline und antwortet nie ( für die Dauer von 3 Perioden).

    Wie muß ich den eine Progressßbar aufbauen, wenn das Ende nicht bekannt ist. In Foren habe ich gelesen, dass es die Möglichkeit gäbe, per Timer das ganze **endlos** laufen zu lassen (von links nach recht).

    Hat jemand evtl. ein Beispiel für mich?

    Hier stehe ich :-)
    Aufruf der ProgressBar (mit Zähler von 1 - 100)

    Form1: Public Sub cmdHundertProzent()

    ...

    For RechnerCheck = 1 to Ubound(Liste) Dim i As Integer FortschrittAnzeigen

    For ping = 1 to 3

    ... mein Funktionsaufruf ob der Rechner erreichbar ist... For i = 0 To 100 '(?) FortschrittAktualisieren i & " % fertig", i Next i

    ...

    next Ping FortschrittBeenden

    next RecnerChek End Sub Modul: Option Compare Database Option Explicit Const CForm As String = "frmProgress" ' 1.... Hier wird das Testfeld behandelt .... ' CForm = Name des Form => Public Sub FortschrittAktualisieren(Optional strText As String, Optional intProzent As Integer) On Error Resume Next If Not IsMissing(strText) Then ' 1-A) Forms(CForm).SetDisplay (strText) End If If Not IsMissing(intProzent) Then '1-B Forms(CForm).SetMeter (intProzent) If intProzent >= 100 Then FortschrittBeenden End If End If End Sub ' -------------------------------------------------------------------- 'ProgreesBar mit Form anzeigen ' CForm = Name des Form => Public Sub FortschrittAnzeigen(Optional x, Optional Y) DoCmd.OpenForm CForm ' gibts noch was zum Beschriften? Form_frmProgress.Caption = "Halloooo " & Now Form_frmProgress.lblProgrssbar.Caption = "gibts noch was zum Beschriften?" ' If Not IsMissing(x) Then DoCmd.MoveSize x If Not IsMissing(Y) Then DoCmd.MoveSize , Y DoEvents End Sub ' -------------------------------------------------------------------- ' aktuellen Status des Form's ermitteln ' CForm = Name des Form => Public Function IsFormOpen(strForm As String) As Boolean IsFormOpen = (SysCmd(acSysCmdGetObjectState, acForm, strForm) > 0) End Function ' -------------------------------------------------------------------- ' ProgreesBar mit Form beenden/Ausblenden ' CForm = Name des Form => Public Sub FortschrittBeenden() On Error Resume Next If IsFormOpen(CForm) Then DoCmd.Close acForm, CForm End If End Sub FormMitProgressBar: '1 Positions in Einer Schritten Public Sub SetMeter(intPosition As Integer) If intPosition < 0 Then intPosition = 0 If intPosition > 100 Then intPosition = 100 Me.ProgressBar3.Value = intPosition End Sub ' Beschriftung des Textes Public Sub SetDisplay(strText As String) If Left(strText, 80) = 81 Then Stop If Len(strText) > 80 Then strText = Left(strText, 80) Me!lblText.Caption = strText DoEvents End Sub


    Gruß

    Werner


    Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage?

    Samstag, 1. März 2014 15:46

Antworten

  • Hallo Werner,

    ich denke, Du kannst den Maximalwert bestimmen in dem Du die Anzahl der Rechner mit 3 multiplizierst. Damit weißt Du wieviel 100 % entsprechend.

    Jetzt passt Du in Deiner Schleife den tatsächlichen Wert an: Anzahl der schon geprüften Rechner mal drei plus die Anzahl der Durchläufe, die für den aktuellen Rechner schon durch sind.

    Diesen Wert setzt Du dann zum Maximalwert ins Verhältnis und hast den aktuellen Wert in %.

    Die ganze Sache ist natürlich nicht ganz rund. Ein paar Rechner sind vielleicht sofort erreichbar, während Du beim einigen 3 Versuche lang auf den Timeout wartest. Ich denke aber, dass muss man hier vernachlässigen.

    HTH


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de


    Sonntag, 2. März 2014 12:36