vba参数没有收到
我正在尝试制作一个程序,用于searchexcel中单元格的特定内容:
- 行代表从00:00到23:00的一天中的小时
- 列表示一个月中的一天
以下代码通过使用名称将用户的input与单元格的内容进行匹配。 它也可以添加或跳过事件的时间间隔
但是,即使用户为2个参数字段input了2个数值,以下代码也始终运行Else下的说明。 一些帮助将不胜感激:
pNume = paramNume aux = "" aux1 = paramHBegin - 1 aux2 = paramHEnd - 1 If IsNumeric(paramHBegin) And IsNumeric(paramHEnd) Then For i = 1 To 31 For j = aux1 To aux2 If Cells(i + 1, j + 1) Like pNume & "*" Or Cells(i + 1, j + 1) Like "*" & pNume & "*" _ Or Cells(i + 1, j + 1) Like "*" & pNume Then aux = aux + Cells(i + 1, j + 1) + " la ora " + CStr(i) + vbCrLf End If Next j Next i Else For i = 1 To 31 For j = 1 To 24 If Cells(i + 1, j + 1) Like pNume & "*" Or Cells(i + 1, j + 1) Like "*" & pNume & "*" _ Or Cells(i + 1, j + 1) Like "*" & pNume Then aux = aux + Cells(i + 1, j + 1) + " la ora " + CStr(i) + vbCrLf End If Next j Next i End If displayInfo.Text = aux
这个语句If IsNumeric(paramHBegin) And IsNumeric(paramHEnd) Then
只有当你传递的值都是数字时才是真的。 但是你写道: “但是,即使用户为2个参数字段input2个数值,以下代码也总是在Else下运行指令。
假设paramHBegin
和paramHEnd
被定义为string,我可以看到发生这种情况的唯一方法是为一个或两个值都有一个非数字的字符。 在Excel 2013 IsNumeric
忽略回车,制表符和空格,所以他们不是问题的原因。 如果它们被定义为对象,那么你应该指定这些对象的正确属性。
对不起,我不能自己尝试,但尝试这样的事情:
If IsNumeric(paramHBegin.Text) And IsNumeric(paramHEnd.Text) Then
或这个:
If IsNumeric(val(paramHBegin.Text)) And IsNumeric(val(paramHEnd.Text)) Then
我认为最好在input会话本身处理用户input,而不是将所有内容传递给前端,然后尝试处理exception
例如,强制(在某种程度上)可以在UserForm代码窗格中放置数字input:
Option Explicit Private Sub paramHBegin_AfterUpdate() TextBoxValidate Me.paramHBegin End Sub Private Sub paramHEnd_AfterUpdate() TextBoxValidate Me.paramHEnd End Sub Private Sub paramNume_AfterUpdate() TextBoxValidate Me.paramNume End Sub Sub TextBoxValidate(ctrl As MSForms.TextBox) Dim number As Double Me.CommandButton1.Enabled = False With ctrl If Not ValidateText(.text, number) Then MsgBox "invalid input", vbCritical .SetFocus Else .text = number Me.CommandButton1.Enabled = True End If End With End Sub Function ValidateText(text As String, number As Double) As Boolean On Error Resume Next number = CDbl(WorksheetFunction.Substitute(text, " ", "")) ValidateText = IsNumeric(number) End Function
在本质上:
-
为每个相关的
TextBox
添加一个AfterUpdate
事件处理程序 -
该事件处理程序将简单地将validation费用传递给特定的子(
TextBoxValidate()
),您可以在其中放置代码来处理通用TextBox
validation环境比如我
- 禁用
CommandButton1
button
(在我的testing中的“确定”一个) -
调用一个函数(
ValidateText
())来validation将返回的TextBox
控件的Text
属性:- 如果
Text
属性实际上是可能的数字,则为True
和validation的数字 - 否则为
False
- 如果
-
如果validation结果为
True
:-
用validation号码更新
TextBox
-
启用“确定”
Button
-
-
如果validation结果是
False
:- 提示消息并将焦点返回到“无效”
TextBox
- 提示消息并将焦点返回到“无效”
- 禁用
当然你可以调整所有这些子和function,以满足您的实际需求,如:
-
检查特定的文本格式(使用
Like
运算符或 – 更好 – 使用RegEx
对象) -
检查特定types(使用
Clng()
或CInt()
或CDate()
而不是CDbl()
以TryParse()
方式 -
根据每个控件types(
TextBox
而不是ListBox
等)和属性(Text
属性而不是Value
…)来更改validation规则
最后
-
使用“&”运算符而不是“+”来连接string
-
If Cells(i + 1, j + 1) Like pNume & "*" Or Cells(i + 1, j + 1) Like "*" & pNume & "*" _ Or Cells(i + 1, j + 1) Like "*" & pNume Then
可以简化为:
If Cells(i + 1, j + 1) Like "*" & CStr(pNume) & "*" Then
希望这一切都可以帮助