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