在Excel VBA中创建进度条

时间:2012-07-16 19:48:09

标签: excel excel-vba vba

我找到了一个Excel VBA脚本和“教程”,除了它没有真正破坏代码,条形码分成不同的部分。

http://spreadsheetpage.com/index.php/tip/displaying_a_progress_indicator/

随着进度条的流逝,附加到“demo”的脚本会将随机数添加到Excel工作表中。

表单上的代码没有做的是打破部分,所以说'这是随机数的代码,'这是实际进度条的代码。

有人可以解析这段代码并让那些不会说VBAeese的人以及那些似乎写出来的人更加“用户友好”吗?

提前致谢。

1 个答案:

答案 0 :(得分:5)

以下是代码的评论很多的版本:

Sub Main()
'   Inserts random numbers on the active worksheet
    Dim Counter As Integer
    Dim RowMax As Integer, ColMax As Integer
    Dim r As Integer, c As Integer
    Dim PctDone As Single


    If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub
    '- if this subroutine is ran on a sheet that is not called "Worksheet" then exit
    '-- change 'Worksheet' to whatever sheet you want the progress bar on

    Cells.Clear
    '- clear all cells in active worksheet

    Application.ScreenUpdating = False
    '-disables updating the screen in the for loop that follows
    '- that way if we are editing 1000 cells int he workbook it only needs to update them at the end when
    '- this is set back to true

    Counter = 1 '- counter counts what cell we are on
    RowMax = 100 '- this is how many rows will be filled with data
    ColMax = 25 '- this is how many columns will be filled with data

    '- note that Rowmax * ColMax = 2,500 co counter will go from 1 to 2,500

    For r = 1 To RowMax
        '-for each row 1 to 100 we will loop through the 25 columns to add the random number
        For c = 1 To ColMax
            '- enter a random number into the cell we are on (Cells(r,c))
            Cells(r, c) = Int(Rnd * 1000)
            '- +1 to the coutner so we can count which cell we ar eon out of 2,500
            Counter = Counter + 1
        Next c
        '- after finishing each column but before starting the next row
        '- check what percent done we are (to update the userform)
        PctDone = Counter / (RowMax * ColMax)

        '- Edit the progressbar called "UserForm1" (already exists in workbook)
        With UserForm1
            'Userform has 2 items in it a Label called 'FrameProgress' and a onject called 'LabelProgress'
            'Change the text in the Label called 'FrameProgress' to display the percent done we calculated earlier
            .FrameProgress.Caption = Format(PctDone, "0%")
            ' Resize the object called 'LabelProgress' to be X perxent of the width of the previous label (minus 10 to leave room on the edge)
            ' - where X is the percent we are done
            .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
        End With
'       The DoEvents statement is responsible for the form updating
        DoEvents
    Next r
    '- exit form when it is at 100%
    Unload UserForm1
End Sub

对您有用的代码的唯一部分是要注意,虽然它正在循环,但它确定了它的完成百分比,然后使用它来更新表单。

如果您有很多代码,您可以简单地将其整个过程(假设您构建表单)

Sub Example()
    'wait a few seconds
    Application.Wait (100000)
    'your code goes here instead of .wait

    PctDone = 0.3
    With UserForm1
        'Userform has 2 items in it a Label called 'FrameProgress' and a onject called 'LabelProgress'
        'Change the text in the Label called 'FrameProgress' to display the percent done we calculated earlier
        .FrameProgress.Caption = Format(PctDone, "0%")
        ' Resize the object called 'LabelProgress' to be X perxent of the width of the previous label (minus 10 to leave room on the edge)
        ' - where X is the percent we are done
        .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
    End With
    'The DoEvents statement is responsible for the form updating
    DoEvents

    Application.Wait (100000)
    'your code goes here instead of .wait

    PctDone = 0.6
    With UserForm1
        .FrameProgress.Caption = Format(PctDone, "0%")
        .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
    End With
    DoEvents

    Application.Wait (100000)
    'your code goes here instead of .wait

    PctDone = 0.9
    With UserForm1
        .FrameProgress.Caption = Format(PctDone, "0%")
        .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
    End With
    DoEvents

    Application.Wait (100000)
    'your code goes here instead of .wait

End Sub