Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将子例程名称作为字符串传递,以将子例程用作通用输入验证_Excel_Vba - Fatal编程技术网

Excel 将子例程名称作为字符串传递,以将子例程用作通用输入验证

Excel 将子例程名称作为字符串传递,以将子例程用作通用输入验证,excel,vba,Excel,Vba,我阅读了几篇关于类似问题的帖子,并尝试了该社区和其他社区提供的许多解决方案。我不能根据我的具体需要来调整这些 我有一个Excel工作簿,它根据用户表单中提供的信息生成时间表和详细的工作报告 作业报告和时间表导出到访问表(或从所述表导入以进行编辑或删除) 我有一个带有重复代码的工作版本,用于验证用户表单输入 有八种输入必须满足标准。 i) 必须是一个数字 ii)不得小于最小值 iii)不得大于最大值 我为这些输入中的每一个都有一个子例程,它在更新之前使用检查这些标准,并调用另一个子例程对userf

我阅读了几篇关于类似问题的帖子,并尝试了该社区和其他社区提供的许多解决方案。我不能根据我的具体需要来调整这些

我有一个Excel工作簿,它根据用户表单中提供的信息生成时间表和详细的工作报告

作业报告和时间表导出到访问表(或从所述表导入以进行编辑或删除)

我有一个带有重复代码的工作版本,用于验证用户表单输入

有八种输入必须满足标准。
i) 必须是一个数字
ii)不得小于最小值
iii)不得大于最大值

我为这些输入中的每一个都有一个子例程,它在更新之前使用
检查这些标准,并调用另一个子例程对userform进行可见的更改,以提醒用户无效的输入(更改标签颜色和标题、文本框或下拉框颜色等)

使用
AfterUpdate
,我为八个输入中的每一个都有一个子例程,一旦输入了有效项,就会恢复这些更改

这意味着我有24个子例程,它们的代码基本相同,我觉得应该只有三个子例程可以更普遍地使用

以下是我为这些子程序编写的代码,因为它用于一个特定的输入:

第1小段

第3分队

我在sub#3的底部有一条注释,上面写着“调用下一个子例程”。这就是我遇到困难的地方

我可以将最小值和最大值作为变量传递,还可以指定目标控件和标签,根据用户输入触发对sub#1的调用

问题是以字符串形式传递下一个子例程


我尝试将这些子例程放在它们自己的模块中,并使用
Application.Run
。我尝试在userform代码中对这些sub使用
CallByName

我可能不理解,但我认为您可能需要一个类模块。谷歌,看看它是否符合要求。所以你有8个文本框和8个标签,标签名称如下:“nameoftextbox”标签?每个文本框预先知道的最小值和最大值?你可以使用一个类来捕捉事件,并且只使用3个子串(百万人)!到目前为止,我还没有想出一个解决方案,但是类模块似乎是解决这个问题的最好方法。关于如何创建和使用类,我还有很多需要学习的地方,但是我很感激这些有用的建议!
Private Sub NumberOfTechs_BeforeUpdate(ByVal CAncel As MSForms.ReturnBoolean)
    If Not IsNumeric(numberOfTechs) Then
       Call NumberOfTechsInvalid("Must be a number!", numberOfTechsLabel, numberOfTechs)
       CAncel = True
    Else
        If numberOfTechs < 1 Then
            Call NumberOfTechsInvalid("Cannot be less than 1!", numberOfTechsLabel, numberOfTechs)
            CAncel = True
        ElseIf numberOfTechs > 6 Then
            Call NumberOfTechsInvalid("Cannot exceed 6!", numberOfTechsLabel, numberOfTechs)
            CAncel = True
        End If
    End If
End Sub
Private Sub NumberOfTechsInvalid(errorCaption As String, targetLabel As Object, targetControl As Object)
    targetLabel.caption = errorCaption
    targetLabel.ForeColor = rgbRed
    targetControl.BackColor = rgbPink
    targetControl.SelStart = 0
    targetControl.SelLength = Len(targetControl)
End Sub
Private Sub NumberOfTechs_AfterUpdate()
    numberOfTechsLabel.ForeColor = Me.ForeColor
    numberOfTechsLabel = "Number Of Techs"
    numberOfTechs.BackColor = rgbWhite

    ' Call next subroutine
End Sub