Excel VBA用户窗体'确定'

时间:2016-09-16 19:56:32

标签: excel vba excel-vba

有没有人知道如何使用与消息框'确定'按钮相同的方式创建用户表单功能?我会解释一下。

我正在检测电子表格中的列中的错误。找到错误后,会弹出一个消息框,如下所示:

MsgBox“请输入有效数据”

当我选择“确定”时,它会转到列中的下一个错误。这很好,除了消息框是模态的,它冻结了应用程序。我希望用户能够编辑数据,然后转到下一个错误。所以,我设计了一个userform,它可以是非模态的。很好,除了我希望宏前进到下一个错误。如果用户纠正错误,它将执行此操作。如果他们不这样做,它就会停留在那个错误单元格上。

我知道为什么会这样。我的userform'Next'按钮只调用找到第一个错误的宏。但我想知道的是,如果有办法解决这个问题。

错误检查从第19行开始,因为这是用户输入数据的开始位置。

我在这里添加了一个指向电子表格的链接。模块1'NextValidationError'工作正常并继续下一个错误。模块14只是在错误处挂起,直到它被解决。我希望它能够跳过。

https://www.dropbox.com/s/yqko5kj19pnauc9/Transparency%20Data%20Input%20Sheet%20for%20Indirect%20Spend%20V7%2009212016%20v2%200.xlsm?dl=0

有人可以就如何让模块14作为模块1进行建议吗?

1 个答案:

答案 0 :(得分:0)

这样的事情:

Dim r_start As Long

Sub CheckNames()
    Dim r As Long
    'Dim emptyRow As Boolean

     If r_start = 0 Then r_start = 19

     With ActiveSheet
        For r = r_start To 5000
            'Checks entire row for data. User may skip rows when entering data.
            If WorksheetFunction.CountA(.Range(.Cells(r, 1), .Cells(r, 33))) > 0 Then
                If ((.Cells(r, 2) = "") <> (.Cells(r, 3) = "")) Or _
                   ((.Cells(r, 2) = "") = (.Cells(r, 4) = "")) Then

                    MsgBox "Please fill in First and Last Name or HCO in Row " & r & "."

                End If
            End If
        Next
    End With

End Sub

除非我误读了您的代码,否则您可以将两张支票与Or合并。

当用户完成检查时(如果表单在此之后保持打开状态),您将需要一些方法来重置r_start

编辑:这是一个非常基本的例子。 UserForm1有两个按钮 - &#34; Next&#34;和&#34;关闭&#34;

&#34; next&#34;只是:

Private Sub CommandButton1_Click()
    ShowErrors
End Sub

在常规模块中:

Dim r_start As Long

'this kicks off the checking process
Sub StartChecking()
    r_start = 0
    UserForm1.Show vbModeless
    ShowErrors
End Sub

'a simple example validation...
Sub ShowErrors()

    Dim c As Range, r As Long

    If r_start = 0 Then r_start = 9

    For r = r_start To 200
        With ActiveSheet.Rows(r)
            If Not IsNumeric(.Cells(1).Value) Then
                UserForm1.lblMsg.Caption = "Cell " & .Cells(1).Address() & " is not numeric!"
                r_start = r + 1
                Exit Sub
            End If
        End With
    Next r

    r_start = 0

    UserForm1.lblMsg.Caption = "No more errors"

End Sub