2016-09-28 3 views
0

У меня есть макрокоманда для выполнения обрезки данных. Ниже мой код:Обновление строки состояния Excel в VBA Loop

Sub StatusBarExample() 
Application.ScreenUpdating = False 
Application.DisplayStatusBar = True 
Application.StatusBar = "Trimming..." 
Dim x As Long 
x = 1 
Do While Cells(x, 1) <> "" 
Cells(x, 2).Select 
ActiveCell.FormulaR1C1 = "=trim(RC[-1])" 
x = x + 1 
Loop 
Application.Wait Now + TimeValue("00:00:02") 
Application.StatusBar = False 
End Sub 

Количество данных постоянно меняется, поэтому я использую цикл Do While. С помощью этого кода я могу видеть сообщение «Обрезка», не зная прогресса в процентах. Может ли кто-нибудь помочь мне улучшить этот код?

+0

Посмотрите на обновление 'Application.StatusBar' с' x' для одного из способов сделать это. –

+3

Забудьте о цикле и используйте '.range (.cells (1, 1), .cells (.rows.count, 1) .end (xlup)). Offset (0,1) .FormulaR1C1 =" = trim (RC [ -1]) «Пожалуйста, обратите внимание, что код, который я включил, ссылается на рабочий лист, определенный в [With ... End With statement] (https://msdn.microsoft.com/en-us/library/wc500chb.aspx). – Jeeped

ответ

1

Я бы взял такой подход. Мне больше нравится цикл for, и это покажет вам% complete в строке состояния.

Sub StatusBarExample() 
Application.ScreenUpdating = False 
Application.DisplayStatusBar = True 
Application.StatusBar = "Trimming..." 
Dim x As Long 
Dim lRow as Long 
Dim prePct as Single, newPct as Single 

newPct = 0 
prePct = 0 
With ThisWorkbook.Sheets("Sheet Name Goes Here") 
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row 

    For x = 1 to lRow 
     .Cells(x,2).FormulaR1C1 = "=trim(RC[-1])" 
     newPct = x/lRow 

     If newPct > prePct + .01 
     DoEvents 
     prePct = newPct 
     End If 

     Application.StatusBar = "Trimming..." & Format(x/lRow,"0.00%") & " Complete" 
    Next x 
Application.StatusBar = False 
Application.ScreeUpdating = True 
End Sub 

Благодарим за предлагаемые изменения. Я сделал пару изменений. В строке If newPct > prePct + .01 вам может потребоваться изменить .01 на что-то другое в зависимости от объема данных.

+0

Текст строки состояния очень мигает, если вы продолжаете переписывать в него одну и ту же вещь. Обычно я сохраняю новое форматированное значение и на самом деле записываю его, если он отличается. – Jeeped

+1

Я предлагаю несколько изменений: 1. ScreenUpdating необходимо перезагрузить. 2. Вам требуется DoEvents каждый раз так часто, или StatusBar/Excel не будет отображать обновления, если он делает большое количество ячеек. Попробуйте 'If Right (x, 3) =" 000 "Then DoEvents' (я думаю, что Right не будет разбиваться на цифры с менее чем 3-мя цифрами, не уверен) – puzzlepiece87

+0

Спасибо! Я, но у меня есть вопрос об этом: lRow = .Range ("A" & .Rows.Count) .END (xlUp) .Row Если первая строка находится в А5, поэтому он должен быть: lRow =. Диапазон («A5» & .Rows.Count) .End (xlUp) .Row? –