问题:界面上有一文本框和100个按钮,在文本框内输入1则触发command1_click()事件。如果在框内输入2则触发command2_click()事件,依此类推。
要求:不用select等穷举的方法。

解决方案 »

  1.   

    ' 还是直接在Text中写代码比较好,如果要根据Text中的内容执行但又不用Select
    ' 下面这个函数肯定有帮助
    Option Explicit
    Private Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As LongPublic Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean
        ExecuteLine = EbExecuteLine(StrPtr(sCode), 0&, 0&, Abs(fCheckOnly)) = 0
    End Function'用法:Private Sub Command1_Click()
    ExecuteLine ("msgbox 2+3")      ' 把一个正确的VB语句当成字符串传给它,它会像VB一样去执行
    End Sub
      

  2.   

    把100个command搞成控件数组,接下来调用不就很简单了
      

  3.   

    我觉得不如直接写成过程,在command的click事件中能调用,在Text的Change事件中也能调用。
    不过我知道楼主自有难处!
      

  4.   

    事实上我想知道的是,是否能按文本调用事件。
    有没有简单的方法实现。
    如在delphi中可以这样实现:
    TButton(findcomponent('button'+inttostr(2))).click;
      

  5.   

    使用字符串名调用属性和方法
    大多数情况下,您可以在设计时发现对象的属性和方法,并且编写代码以处理它们。但是,在少数情况下,您可能不知道某个对象的一些高级属性和方法,或者,您可能只是想要这种灵活性,即允许最终用户在运行时指定属性或执行方法。例如,请考虑下面的情况,某个客户端应用程序,它通过传递一个运算符到服务器程序来计算由用户输入的表达式。现在,假定您要经常性地向需要新运算符的服务器添加新函数。那么,不幸的是,在客户端应用程序能够使用新的运算符之前,您需要重新编辑和重新发布它。为了避免这种情况,可以使用 CallByName 函数把新运算符当作字符串来传递,而不需要更改应用程序。CallByName 函数允许您使用一个字符串在运行时指定一个属性或方法。CallByName 函数的用法如下:Result = CallByName(Object, ProcedureName, CallType, Arguments())CallByName 的第一个参数包含要对其执行动作的对象名。第二个参数,ProcedureName,是一个字符串,包含将要调用的方法或属性过程名。CallType 参数包含一个常数,代表要调用的过程的类型:方法 (vbMethod)、property let (vbLet)、property get (vbGet),或 property set (vbSet)。最后一个参数是可选的,它包含一个变量数组,数组中包含该过程的参数。假定您有一个服务器应用程序,MathServer,并且它具有一个新的函数 SquareRoot。该应用程序中有两个 TextBox 控件:Text1 包含要计算的表达式;Text2 用于输入该函数的名称。要对 Text1 中的表达式调用 SquareRoot 函数,您可以在一个命令按钮的 Click 事件中使用下面的代码:Private Sub Command1_Click()
       Text1.Text = CallByName(MathServer, Text2.Text, vbMethod, Text1.Text)
    End Sub如果用户在 Text1 中输入 "64 / 4",在 Text 2 中输入 "SquareRoot",则上面的代码将调用 SquareRoot 函数(要求一个必需的参数,它是一个包含将要计算的表达式的字符串),并且在 Text1 中返回 "4" (16 或64/4的平方根)。当然,如果用户在 Text2 中输入了一个无效的字符串,或者该字符串包含一个属性名而不是方法名,或者该方法要求附加的必需的参数,那么将会产生一个运行时错误。可以猜到,当您使用 CallByName 来预处理这些或其他的错误时,需要添加强健的错误处理程序代码。尽管 CallByName 函数在某些情况下可能很有用,但是,还是需要在衡量其实用性时考虑对性能可能的影响 — 同后期绑定相比,使用 CallByName 来调用一个过程只会稍稍慢一点儿。如果您正调用的函数将要被重复调用很多次,例如在一个循环内部,则 CallByName 将会对性能产生严重的影响。
      

  6.   

    最简单肯定使用控件数组了。可以用直接根据index来调用。
      

  7.   

    zyl910,callbyname我知道,但其无法call某一事件,只能是方法或属性。
    rainstormmaster(rainstormmaster) ,要用到api?
    goodname008(卢培培,想学好VB) ,vba6.dll要如何使用?能否告知?那看来的确是无法使用delphi中的方法了。
      

  8.   

    vba6.dll就是照我上面的回贴用啊,不过好像对根据文本触发事件也有些无能为力。
      

  9.   

    '可以利用.setfocus来调用事件:
    Option ExplicitPrivate Sub Command1_Click()
       MsgBox "Hello"
    End SubPrivate Sub Command1_GotFocus()
       Call Command1_Click
    End SubPrivate Sub Text1_Change()
       Dim ctl As Control
       For Each ctl In Me.Controls
          If ctl.Name = "Command" & Trim$(Text1.Text) Then
             MsgBox "判断有这个命令按钮存在!"
             ctl.SetFocus
             Exit Sub
          End If
       Next ctl
    End Sub
      

  10.   

    goodname008(卢培培,想学好VB)已经加到5个角了,厉害厉害!!!!!!!!!
      

  11.   

    to qingming81(晴明) :
    你不是都已经一星了吗,呵呵。
      

  12.   

    to 楼主:
    我发现一个解决的办法:
    把zyl910(910:分儿,我又来了!) 和qingming81(晴明)的方法结合起来。
    只用callbyname不能call某一事件,但可以call某个方法,你可以call控件的setfocus方法,然后在控件的gotfocus事件中写代码或调用click事件。我没试,楼主可以试试看。