首页 > 解决方案 > 如何在表格中添加复选框以显示付款日期?

问题描述

这就是我的付款表格中的内容。我使用组合框将用户信息拉入支付表单。我遇到的麻烦是它在付费列中一直显示 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```

标签: excelformscheckbox

解决方案


用户表单并非旨在或旨在控制工作表内容。将您的工作簿视为一个机场,其中旅客大厅位于中心,人行道通向带登机口的卫星。一个这样的卫星是您的付款表格,另一个是您的工作表。要将数据从一个移动到另一个,您需要通过集线器。这张图片中的 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,我建议使用 Form 的Tag属性将信号发送回调用过程。如果为 1,则应处理数据,否则不做任何事情。在 CommandOK 过程中设置标记值。如果用户取消,该属性将为空并Val(.Tag)返回 0。

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

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

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


推荐阅读