【问题标题】:How do I add check box in Form to show payment date?如何在表格中添加复选框以显示付款日期?
【发布时间】:2021-08-17 04:10:30
【问题描述】:

这是我的付款表格中的内容。我使用组合框将用户信息拉入付款表单。我遇到的麻烦是它在付费列中一直显示 TRUE。在“已付款”右侧的另一列中,显示下一次付款到期时还有 30 天。

我试过这段代码,但它把它放在列中的所有单元格中


If CheckBox1.Value = True Then
    Range("I:I").Value = Date
    Else: Range("I:I").Value = ""
End If

End Sub```



'Dim xRg As Range
'Updated by Extendoffice 2018/1/30
Private Sub Userform_Initialize()
    Set xRg = Worksheets("Customer").Range("A2:F8")
    ComboBox1.List = xRg.Columns(1).Value
End Sub
Private Sub ComboBox1_Change()
    TextBox1.Text = Application.WorksheetFunction.VLookup(ComboBox1.Value, xRg, 2, False)
    TextBox2.Text = Application.WorksheetFunction.VLookup(ComboBox1.Value, xRg, 3, False)
    TextBox3.Text = Application.WorksheetFunction.VLookup(ComboBox1.Value, xRg, 4, False)
    TextBox4.Text = Application.WorksheetFunction.VLookup(ComboBox1.Value, xRg, 5, False)
    TextBox5.Text = Application.WorksheetFunction.VLookup(ComboBox1.Value, xRg, 6, False)
End Sub
Private Sub cbCancel_Click()
    Unload Me
End Sub

Private Sub cbAdd_Click()

'dimmin Var
    Dim Data As Worksheet

'Setting Var
    Set Data = ThisWorkbook.Sheets("Payments")
    NextRow = Data.Cells(Rows.Count, 1).End(xlUp).Row + 1
    
    Data.Cells(NextRow, 1) = Me.ComboBox1.Value
    Data.Cells(NextRow, 2) = Me.TextBox1.Value
    Data.Cells(NextRow, 3) = Me.TextBox2.Value
    Data.Cells(NextRow, 4) = Me.TextBox3.Value
    Data.Cells(NextRow, 5) = Me.TextBox4.Value
    Data.Cells(NextRow, 7) = Me.CheckBox1.Value
    
    Me.TextBox1.Value = ""
    Me.TextBox2.Value = ""
    Me.TextBox3.Value = ""
    Me.TextBox4.Value = ""
    Me.ComboBox1.Value = ""
    Me.CheckBox1.Value = ""
    
End Sub

Private Sub CommandButton2_Click()
Dim ctl As Control
For Each ctl In Me.Controls
If TypeName(ctl) = “TextBox” Or TypeName(ctl) = “ComboBox” Then
ctl.Value = “”
End If
Next ctl
End Sub```

【问题讨论】:

    标签: excel forms checkbox


    【解决方案1】:

    用户表单并非旨在或旨在控制工作表内容。将您的工作簿视为一个机场,其中旅客大厅位于中心,人行道通向带登机口的卫星。一个这样的卫星是您的付款表格,另一个是您的工作表。要将数据从一个移动到另一个,您需要通过集线器。这张图片中的 hub 是一个标准的代码模块,它需要控制你的项目。使用下面的代码作为框架。将其粘贴到标准代码模块。

    Sub MakePayment()
    
        Dim FrmPayment      As New PaymentForm
        Dim xRg             As Range
        
        With FrmPayment
            Set xRg = Worksheets("Customer").Range("A2:F8")
            .ComboBox1.List = xRg.Columns(1).Value
            .Show
            
            If Val(.Tag) = 1 Then
                ' write to the sheet
            End If
        End With
        
        Unload FrmPayment
        Set FrmPayment = Nothing
    End Sub
    

    方案很简单。有一个名为PaymentForm 的用户表单(比“UserForm1”更好)。运行上述子程序时,会创建该表单的新实例,加载组合框并将控制权交给表单 (.Show)。当表单关闭时,代码执行在该点恢复,数据将从表单中删除并写入工作表。然后表单被卸载。

    要让这个工作,你不能在表单的代码模块中卸载表单。而是使用Me.Hide 我建议使用表单的Tag 属性将信号发送回调用过程。如果为 1,则应处理数据,否则不做任何事情。在 CommandOK 过程中设置标记值。如果用户取消,该属性将为空,Val(.Tag) 将返回 0。

    请注意,Initialize 事件过程在创建表单实例时运行,即在Dim FrmPayment As New PaymentForm。您的程序尝试直接访问远程卫星(工作表)。不好。就像我在上面的代码中所做的那样,最好在显示表单之前(但在初始化很久之后)加载 Cbx。此时,您可以访问表单的所有控件,还可以为“PAID”文本框赋予您选择的值。

    Me.Hide(在表单模块中)隐藏表单并将控制权交还给调用过程。此时,所有表单控件及其值都可以通过对象FrmPayment 访问,工作表也是如此。您可以在中心将数据从一颗卫星传输到另一颗卫星。

    我没有测试上面的代码,但它很简单,我希望它没有错误。但是,在您在项目中尝试之前,请确保在您的代码中禁用会干扰系统的事件过程,例如 Initialize 事件。

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2019-03-10
      • 2014-01-23
      • 1970-01-01
      • 2023-04-03
      • 2015-10-18
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多