
Estou seriamente pasmo com esse problema, tenho um loop for-next aninhado que fornece mais de mil loops. Sei disso ao ver este código:
'find row ranges for department 1-10
For i = 1 To 10 Step 1
Dim tempRange As Range
Set tempRange = GetRowRange(importsheet, DepColumn, i)
'and iterate through the columns to insert them
' find row ranges for section
If Not (importsheet.UsedRange.Find("afdeling_" & i) Is Nothing) Then
Dim SecColumn
Dim secRange As Range
SecColumn = importsheet.UsedRange.Find("afdeling_" & i).column
Set bCell = tempRange.Columns(SecColumn)
tempRange.Sort Key1:=bCell, Order1:=xlAscending, Header:=xlYes
For ix = 1 To 10 Step 1
'check for a valid section column
Set secRange = GetRowRange(tempRange, SecColumn, ix)
totalposts = totalposts + IterateColumns(secRange, spgsheet, importsheet, debugsheet, year, month, week, Hospital, i, ix, varType, False)
Progress
Next ix
Else
totalposts = totalposts + IterateColumns(tempRange, spgsheet, importsheet, debugsheet, year, month, week, Hospital, i, 0, varType, False)
End If
Progress
Next i
Minha função de progresso é assim:
Function Progress()
iProgress = iProgress + 1
Application.StatusBar = Format(iProgress, "0%") & " Completed"
End Function
mas a barra de progresso geralmente mostra até 3300%.
Como isso é possível?
Responder1
Você não está mostrando todo o código. Por exemplo, presumo que iProgress
seja definido globalmente, mas não podemos ver isso aqui.
Além disso, por que você está fazendo DIM
instruções dentro de um loop? Você deve fazê-los apenas uma vez e também deve definir variáveis de objeto assim nothing
que terminar de usá-las. Não fazer isso provavelmente resultará em alguns problemas desagradáveis de memória ao longo do caminho.
Para responder à pergunta específica. Você configurou iProgress
para ser um contador e não um%.
Para obter a%, você precisa saber quantos itens irá iterar antes de iniciar a barra de progresso. Você então precisa do contador de itens atual e do total. CurrentCount/TotalItemCount
dá-lhe o progresso.