Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

这样的代码如何写???

54.℡80後2oO  发表于:2013-09-12 12:59:19  
复制

有没有什么办法批量为控件写属性代码???

有个窗体,里面有30个名称数字递增的控件如:项目一,项目二,项目三……

                                                                    结果一,结果二,结果三……

我想达到的是,当项目一更新后,结果一相应变化;项目二更新后,结果二相应变化;以此类推……

正常的做法是,在【项目一】的【更新后】事件中写入代码,来控制【结果一】控件值变化!

                       必须一个个的写,太麻烦,也不好看!因其中代码都类似,只是控件名称的数字有变化而已……

有没有什么办法:把【控件名】用【变量】批量表示,后面的代码也一样,这样,只须写一段代码就可以了,不知各位达人有什么办法没有???

 

Top
煮江品茶 发表于:2013-09-12 14:23:58

当控件标签的尾数为阿拉伯数字时,则:

Sub 控件标签自增()
    Dim ctrl As Control
    Dim m As Long
    For Each ctrl In me.Controls
        If ctrl.ControlType = acComboBox Or ctrl.ControlType = acTextBox Then
            m = Val(StrReverse(ctrl.Controls(0).Caption))
            ctrl.Controls(0).Caption = Replace(ctrl.Controls(0).capation, m, m + 1)
        End If
    Next
End Sub



沈军 发表于:2013-09-12 14:26:48
可以。 在制作此类窗体时要注意给控件取有类名+序号构成的控件名称,以便在代码中实现循环处理 下面实例可看看 http://www.accessoft.com/article-show.asp?id=8558

落尘_小新 发表于:2013-09-12 19:54:13

看看这样行吗。

示例

 



落尘_小新 发表于:2013-09-12 19:54:13

看看这样行吗。

示例

 



54.℡80後2oO 发表于:2013-09-12 21:26:28

我的意思是:先看一段代码:

Private Sub 上限一_AfterUpdate()


    Me.参考范围一 = Me.下限一 & "-" & Me.上限一


End Sub


Private Sub 上限二_AfterUpdate()


    Me.参考范围二 = Me.下限二 & "-" & Me.上限二


End Sub


…………


Private Sub 上限十_AfterUpdate()


    Me.参考范围十 = Me.下限十 & "-" & Me.上限十


End Sub


Private Sub 上限十一_AfterUpdate()


    Me.参考范围十一 = Me.下限十一 & "-" & Me.上限十一


End Sub


…………
Private Sub 上限二十_AfterUpdate()


    Me.参考范围二十 = Me.下限二十 & "-" & Me.上限二十


End Sub


Private Sub 上限二十一_AfterUpdate()


    Me.参考范围二十一 = Me.下限二十一 & "-" & Me.上限二十一


End Sub


Private Sub 上限二十二_AfterUpdate()


    Me.参考范围二十二 = Me.下限二十二 & "-" & Me.上限二十二


End Sub


…………
Private Sub 上限二十九_AfterUpdate()


    Me.参考范围二十九 = Me.下限二十九 & "-" & Me.上限二十九


End Sub


Private Sub 上限三十_AfterUpdate()


    Me.参考范围三十 = Me.下限三十 & "-" & Me.上限三十


End Sub


有没有办法用变量把它缩为一段,用for 循环语句等???




54.℡80後2oO 发表于:2013-09-12 21:27:08

请教@@@达人们




54.℡80後2oO 发表于:2013-09-13 12:11:23
顶住,不要沉!!!

煮江品茶 发表于:2013-09-13 14:43:37

一、你的窗体设计很愚蠢。大可不必这么多控件,只需要一个组合框来选择序号,然后用另外三个控件做赋值和显示的处理即可。

 

二、如果非要按照现有的窗体设计,则可以按以下方式处理:

Private Sub Form_Load()
    dim ctrl as control
    dim m as string
    for each ctrl in me.controls
       if instr(ctrl.name,"参考范围")>0 then
           m=replace(ctrl.name,"参考范围","")
           ctrl.AfterUpdate="=AllAfterUP('" & m & "')"
       end if
    next
end sub


function AllAfterUP(byval m as string)
    me.controls("参考范围" & m).value=me.controls("下限" & m) & "-" & me.controls("上限" & m)
end function



54.℡80後2oO 发表于:2013-09-13 20:44:55
Private Sub Form_Load()


    Dim ctrl As Control
    Dim m As String
    For Each ctrl In Me.Controls
        If InStr(ctrl.Name, "参考范围") > 0 Then
            m = Replace(ctrl.Name, "参考范围", "")

            ctrl.AfterUpdate = "=AllAfterUP('" & m & "')"    <----报错!!!“对像不支持该属性或方法  

      End If

    Next


End Sub


Function AllAfterUP(ByVal m As String)


    Me.Controls("参考范围" & m).value = Me.Controls("下限" & m) & "-" & Me.Controls("上限" & m)


End Function



煮江品茶 发表于:2013-09-14 08:28:45

你看看是否有标签控件、子窗体控件的名称中含有“参考范围”字样,如果有的话将它们修改成别的名称。



54.℡80後2oO 发表于:2013-09-14 09:17:08

是有个标签含参考范围的字样,但我改了之后,错倒没报错,但没效果啊?
如图:

我想达到的效果是,当下限,上限不为空,且在上限输入完后,参考范围自动按格式填充***

但现在我代码放进去后,没反应啊&&&


54.℡80後2oO 发表于:2013-09-14 21:07:57
再顶,不顶就沉了!!!!

cspa 发表于:2013-09-14 22:07:24
首先在模块中写一函数如下:
Sub a(obj1 as object, obj2 as object)   
Select case mid(obj2.name,3,1)
    Case "一"
         a = obj1 & "-" & obj2
    Case "二"
         a = obj1 & "-" & obj2
    Case "三"
         a = obj1 & "-" & obj2
••••••
End select
end sub

然后在每个上限的更新后事件加入以下代码,如:
Private Sub 上限一_AfterUpdate()
Me.参考范围一=a(me.下限,me.上限)
End sub



cspa 发表于:2013-09-15 11:42:09


验证过了,煮江品茶老师的方法很棒,只是按楼主的需求要做如下修改:

Private Sub Form_Load()

    dim ctrl as control
    dim m as string
    for each ctrl in me.controls
       if instr(ctrl.name,"上限")>0 then
           m=replace(ctrl.name,"上限","")
           ctrl.AfterUpdate="=AllAfterUP('" & m & "')"
       end if
    next
end sub




function AllAfterUP(byval m as string)
    forms!你的主窗体名称!你的子窗体名称.controls("参考范围" & m).value=forms!你的主窗体名称!你的子窗体名称.controls("下限" & m) & "-" & forms!你的主窗体名称!你的子窗体名称.controls("上限" & m)
end function





54.℡80後2oO 发表于:2013-09-15 21:22:55

利用煮江品茶老师的代码,再结合cspa版主的指导,终于把要实现的功能实现了,谢谢两位老师的指点,呵呵!!!

Private Sub Form_Load()


    dim ctrl as control
    dim m as string

    for each ctrl in me.controls

If ctrl.ControlType = acComboBox Or ctrl.ControlType = acTextBox Then

       if instr(ctrl.name,"上限")>0 then
           m=replace(ctrl.name,"上限","")
           ctrl.AfterUpdate="=AllAfterUP('" & m & "')"

       end if

end  if

    next

end sub


function AllAfterUP(byval m as string)

    forms!你的主窗体名称!你的子窗体名称.controls("参考范围" & m).value= _

            forms!你的主窗体名称!你的子窗体名称.controls("下限" & m) & "-" & forms!你的主窗体名称!你的子窗体名称.controls("上限" & m)

end function



分还是给cspa老师吧,鼓励下分少的,以便能为更多的人服务,煮江老师不会介意吧!!!呵呵




cspa 发表于:2013-09-15 23:14:58
这功劳应是煮江品茶老师的,沾老师的光本人终于250了。呵呵。

总记录:16篇  页次:1/1 9 1 :