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下运行指令。

假设paramHBeginparamHEnd被定义为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() ),您可以在其中放置代码来处理通用TextBoxvalidation环境

    比如我

    • 禁用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

希望这一切都可以帮助