brillox
brillox

Reputation: 373

Calculating progress bar percentage

I know there are endless posts for this but as my math skills are -100 I am getting issues in calculating the correct percentage. Below I have the loop that runs and then the sub that attempt to calculate the percentage. The issue is that the width of the label is wrong and for recordset with tiny numbers as 2 all is crewed up :-)

LOOP CODE

'loop until the end of the recordset
      Do While Not Glob_RecSet.EOF

         'inner loop to get each record fields
         For FieldCount = 0 To Glob_RecSet.Fields.Count - 1
            Glob_Sheet.Range(GLobWorkSheetRange).Offset(loopCounter, FieldCount).value = Glob_RecSet.Fields(FieldCount).value
         Next

            'start progress bar calculations the form show and unload is called on the form code apply changes button
            RunProgressBar loopCounter, TotalRows, "Runningquery for " & Glob_RecSetRunning

         'Next record
         Glob_RecSet.MoveNext

         'advance counter
         loopCounter = loopCounter + 1
      Loop

SUB CODE FOR PROGRESS BAR

Public Sub RunProgressBar(loopCounter As Variant, TotalRecords As Variant, FormTitle As String)
   Dim LblDonewidth As Variant
   Dim ProgBarCaption As Variant
   Dim ProgresPercentage As Variant

   If (TotalRecords < 100) Then
      TotalRecords = 100
   End If

   ProgresPercentage = Round(loopCounter / TotalRecords * 100, 0)

  'to avoid to give the progress bar a percentage greater than 100
   If (ProgresPercentage > 100) Then
      ProgresPercentage = 100

   End If

   ProgBarCaption = Round(ProgresPercentage, 0) & "%"

   FrmProgBar.Caption = FormTitle
   FrmProgBar.LblDone.Width = ProgresPercentage * 2
   FrmProgBar.LblText.Caption = ProgBarCaption

   'The DoEvents statement is responsible for the form updating
   DoEvents
End Sub

Upvotes: 0

Views: 530

Answers (1)

brillox
brillox

Reputation: 373

I found the asnwer; the main issue was that I was not passing the corrent total of records in the recordset; this is solved by adding the line below before opening the recordset

'Clinet-Side cursor
Glob_RecSet.CursorLocation = adUseClient

then I found this example of progress bar here from which i took the correct logic for the progress bar percentage calculation. Below the whole code

Sub InitProgressBar(maxValue As Long)

    With FrmProgBar

        .LblDone.Tag = .LblRemain.Width / maxValue
        .LblDone.Width = 0
        .LblText.Caption = ""
    End With

End Sub

Public Sub RunProgressBar(loopCounter As Variant, formTitle As String)

   Dim LblDonewidth As Variant
   Dim ProgBarCaption As Variant
   Dim ProgresPercentage As Variant


   LblDonewidth = FrmProgBar.LblDone.Tag * loopCounter

   ProgresPercentage = Round(FrmProgBar.LblDone.Width / FrmProgBar.LblRemain.Width * 100, 0)

   ProgBarCaption = ProgresPercentage & "%"

  'to avoid to give the progress bar a percentage greater than 100
   If (ProgresPercentage > 100) Then
      ProgresPercentage = 100
   End If

   FrmProgBar.Caption = formTitle
   FrmProgBar.LblDone.Width = LblDonewidth
   FrmProgBar.LblText.Caption = ProgBarCaption

End Sub

which is used as follow

TotalRecords = Glob_RecSet.RecordCount

'init progressbar
InitProgressBar (TotalRecords)

 'loop until the end of the recordset
  Do While Not Glob_RecSet.EOF

      . . . . 
'The DoEvents statement is responsible for the form updating
 DoEvents

 'start progress bar calculations the form show and unload 
 'is called on the form code apply changes button
  RunProgressBar loopCounter, "Runningquery for " & Glob_RecSetRunning

enter image description here

Upvotes: 1

Related Questions