excel - 如何在表格中添加复选框以显示付款日期?
问题描述
这就是我的付款表格中的内容。我使用组合框将用户信息拉入支付表单。我遇到的麻烦是它在付费列中一直显示 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```
解决方案
用户表单并非旨在或旨在控制工作表内容。将您的工作簿视为一个机场,其中旅客大厅位于中心,人行道通向带登机口的卫星。一个这样的卫星是您的付款表格,另一个是您的工作表。要将数据从一个移动到另一个,您需要通过集线器。这张图片中的 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
事件。
推荐阅读
- java - 尝试创建相同对象类型的两个实例,但最终有两个变量引用相同的对象
- mysql - ERROR 1451 (23000):无法删除或更新父行:外键约束失败
- php - RuntimeException:/vendor/emarref/jwt/src/Encryption/Asymmetric.php:35 在 crontab 执行期间,在 shell 中正常
- android - Android Kotlin:缺少 google_app_id。Firebase 分析已停用
- css - Div 悬停功能未按预期运行
- php - 控制器中的 Laravel 命令不适用于 AWS 队列
- python - 将 tf.dataset 转换为 4D 张量
- json - 将 JSON 对象的成员解析为 Bash 变量
- bixby - 语音输入选择
- python - Pandas 通过匹配上一年的基线来计算月流失率