龙空技术网

Excel VBA 类模块实现动态添加的TextBox的Change事件完整代码

Excel活学活用 284

前言:

眼前朋友们对“textbox1的值怎么调用”大概比较珍视,朋友们都需要分析一些“textbox1的值怎么调用”的相关内容。那么小编在网摘上收集了一些有关“textbox1的值怎么调用””的相关文章,希望你们能喜欢,各位老铁们快快来了解一下吧!

本文于2023年7月9日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

☆本期内容概要☆

VBA 类模块实现TextBox的Change事件完整代码

完整代码:

1、Sheet1_CmdShow (命令按钮)

Private Sub CmdShow_Click()    UserForm1.ShowEnd Sub

代码解析:

(1)启动用户窗体UserForm1。

2、模块1

(1)Pxy自定义函数

Function Pxy(arr() As Variant, searchValue As Variant) As Long    t = LBound(arr)    t = 1 - t    For i = LBound(arr) To UBound(arr)        If arr(i) = searchValue Then            Pxy = i + t            Exit Function        End If    Next    Pxy = -1 ' 如果未找到值,则返回 -1End Function

代码解析:用来查找定位查找值在数组中的位置

A)t等于数组最大下标,再使之等于1-t,作用是修正数组最小下标不为1时对应的位置值。

(B)通过i循环数组,比对查找值与数组中的值,若找到,则函数值等于t+1。

(C)如果没有找到,则返回-1。

3、类模块(TextBoxEventHandler)

(1)定义变量

Public WithEvents txtBox As MSForms.TextBoxPrivate previousValue As String

代码解析:

A)声明一个公共变量 txtBox,它是一个带有事件处理程序的文本框对象。

(B)声明一个私有变量 previousValue,用于存储文本框在更新前的值。

(2)ReceiveTextbox

Public Sub ReceiveTextbox(ByVal reTextbox As MSForms.TextBox)    Set txtBox = reTextboxEnd Sub

代码解析:

A)定义一个公共子过程 ReceiveTextbox,用于接收一个文本框对象,并将其赋值给 txtBox 变量。。

(B)将传入的文本框对象赋值给 txtBox 变量。

(3)txtBox_Change,文本框(TextBox)相关的事件处理程序

Private Sub txtBox_Change()    On Error Resume Next    Dim i As Integer    i = CInt(Mid(txtBox.Name, 7))    With UserForm1        If .Controls("topLb_" & i).Caption = "金额" Then            If Not IsNumeric(txtBox) Then                MsgBox "请输入数字!"                txtBox.Text = previousValue            End If            .Controls("topTb_" & i + 2).Text = CDbl(.Controls("topTb_" & i)) + CDbl(.Controls("topTb_" & i + 1))        ElseIf .Controls("topLb_" & i).Caption = "税额" Then            If Not IsNumeric(txtBox) Then                MsgBox "请输入数字!"                txtBox.Text = previousValue            End If            .Controls("topTb_" & i + 1).Text = CDbl(.Controls("topTb_" & i)) + CDbl(.Controls("topTb_" & i - 1))        ElseIf .Controls("topLb_" & i).Caption = "价税合计" Then              .Controls("topTb_" & i).Text = CDbl(.Controls("topTb_" & i - 2)) + CDbl(.Controls("topTb_" & i - 1))        End If    End WithEnd Sub

代码解析:如果文本框发生了改变,激活其Change事件。

A)如果当前文本框对应的标签是金额,限制仅输入数字,同时价税合计重新计算=金额+税额。如果当前文本框对应的标签是税额,操作同“金额“。

(B)如果当前文本框对应的标签是价税合计,则将其重新计算=金额+税额,直观看来,不管输入什么,价税合计总保持不变,实现价税合计不可编辑的目的。

(4)txtbox_KeyDown

Private Sub txtbox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)    ' 在按下任意键之前,存储当前值    previousValue = txtBox.ValueEnd Sub

代码解析:

A)在按下任意键之前,将当前文本框的值存储在 previousValue 变量中,供后续调用。

(B)这样做的目的:金额、税额如果输入了非数字字符,将其返回原来的值。

4、UserForm1

(1)添加控件:FrmHeader

插入一个框架控件:FrmHeader在FrmHeader中,添加一个标签控件:LbTopAmount

(2)UserForm_Initialize(),窗体初始化过程

Dim clsTxB As New TextBoxEventHandlerDim textBoxes As CollectionPrivate Sub UserForm_Initialize()    Dim tbTitle()    tbTitle = Array("ID", "报销单号", "开票日期", "发票号码", "销售方全称", _    "开票项目", "金额", "税额", "价税合计", "购买方全称", "购买方税号", "销售方税号", _    "发票代码", "发票类型", "登记人", "报销人", "审核人", "登记日期", "报销日期", _    "报销项目", "发票源文件地址", "发票文件路径", "备注", "付款人", "记账人", _    "月份", "会计凭证号", "部门", "发票原文件名", "电子票号", "附件文件路径")    arrWidth = Array(0, 0, 60, 0, 100, 120, 80, 60, 90, 0, 0, 120, 0, 0, _                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, _                     0, 0, 0, 0, 0, 0, 0, 0, 0)    For i = 0 To UBound(tbTitle, 1) - 1        Set lbCtrl = Me.FrmHeader.Controls.Add("Forms.Label.1", "topLb_" & i, True)        Set txtBox = Me.FrmHeader.Controls.Add("Forms.TextBox.1", "topTb_" & i, True)        If i = 0 Then            iWidth = 0        Else            iWidth = iWidth + arrWidth(i - 1)        End If        With lbCtrl            .Caption = tbTitle(i)            .Height = 20            .Top = 0            .Width = arrWidth(i)            .Left = iWidth            .BorderStyle = 1            .FontSize = 9            .FontName = "微软雅黑"            .ForeColor = RGB(50, 50, 255)            .TextAlign = 2            .ZOrder (0)        End With        With txtBox            .Height = 20            .Top = lbCtrl.Height            .Width = arrWidth(i)            .Left = iWidth            .BorderStyle = 1            .FontSize = 9            .FontName = "微软雅黑"            .ForeColor = RGB(50, 50, 255)            If i = Pxy(tbTitle, "金额") - 1 Or i = Pxy(tbTitle, "税额") - 1 _                 Or i = Pxy(tbTitle, "价税合计") - 1 Then                .TextAlign = fmTextAlignRight                .Text = 0            Else                .TextAlign = fmTextAlignLeft            End If            .ZOrder (0)        End With        clsTxB.ReceiveTextbox txtBox        '将 TextBoxEventHandler 对象添加到集合中        If textBoxes Is Nothing Then            Set textBoxes = New Collection        End If        textBoxes.Add clsTxB        Set clsTxB = Nothing    Next    With Me.FrmHeader        .Caption = ""        .Width = iWidth        .Height = 40        .Left = 1        .Top = 30        .Visible = True    End With    Set iCtr = Me.Controls("TopTb_" & Pxy(tbTitle, "价税合计") - 1)    With Me.LbTopAmount        .Caption = ""        .Top = iCtr.Top        .Left = iCtr.Left        .Height = iCtr.Height        .Width = iCtr.Width        .ZOrder 0    End WithEnd Sub

代码解析:

A)声明一个名为 clsTxB 的 TextBoxEventHandler 类的实例,用于处理文本框事件。

(B)声明一个集合变量 textBoxes,用于存储 TextBoxEventHandler 对象。

(C)tbTitle 数组,存放标签的标题。

(D)循环tbTitle 数组,添加标签、文本框并设置格式。

(E)调用 TextBoxEventHandler 类的 ReceiveTextbox 子过程,将当前文本框对象传递给它。将 clsTxB 添加到 textBoxes 集合中,用于后续引用。

(F)对FrmHeader 框架进行属性设置。

(G)对LbTopAmount标签进行设置,位置、大小与价税合计标签的对应的文本框相同,就是完全覆盖在其上,达到禁止修改价税合计的目的。

☆往期合集☆【2023年3月】【2023年4月】【2023年5月】【2023年6月】

☆猜你喜欢☆

Excel VBA 电子发票管理助手

Excel VBA 收费管理系统

Excel VBA 中医诊所收费系统

Excel VBA 文件批量改名

Excel VBA 酷炫的日期控件

Excel VBA 动态添加控件

Excel VBA 最简单的收发存登记系统

Excel 固定资产折旧计提表

Excel VBA 输入逐步提示

Excel 公式函数/查找函数之LOOKUP

☆我是安利达人☆

我的小店

自用产品,强烈推荐!

白茶牙膏

洗洁精

洗衣液

本文于2023年7月9日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

标签: #textbox1的值怎么调用 #怎么调用textbox里的值