首页 > 解决方案 > 如何编辑我的用户表单代码以允许更改更新

问题描述

我正在处理一个 Excel 用户表单,并且所有代码都可以工作,除了一个。我将附上下面的代码,但我希望这是一个简单的修复。正如您在我的代码中看到的那样,当用户输入出发时间和到达时间时,数据将进入我的数据库并执行计算,然后将其发送回我的用户表单复选框。虽然这是根据需要工作的,但我发现如果用户在离开用户表单之前进行了一次更改,则信息会在我的数据库中适当更新,但用户表单复选框没有更新。有人可以告诉我我需要做什么(如果有的话)以使这些实时工作并随我的数据库文档发生变化吗?

Private Sub txtDepartTime_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'When time is entered, time transfers immediately to spreadsheet time calculations datafield.

Dim TargetRow As Long
TargetRow = Sheets("Codes").Range("D43").Value + 1

If Not txtDepartTime Like "##:## [ap]m" Then
  MsgBox "Time entered is not valid.  Please enter time as hh:mm am/pm.", vbExclamation
  Cancel = True
  Exit Sub
End If

With Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 25)
 .Value = TimeValue(txtDepartTime)
 .NumberFormat = "hh:mm" 'departure time for checkbox calculation

 End With

End Sub

Private Sub txtArrivalTime_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'When time is entered, time transfers immediately to spreadsheet datafield and sends back to userform which meals are allowed.

Dim TargetRow As Long
TargetRow = Sheets("Codes").Range("D43").Value + 1

If Not txtArrivalTime Like "##:## [ap]m" Then
  MsgBox "Time entered is not valid.  Please enter time as hh:mm am/pm.", vbExclamation
  Cancel = True
  Exit Sub
End If

With Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 26)
 .Value = TimeValue(txtArrivalTime)
 .NumberFormat = "hh:mm" 'arrival time for checkbox calculation
End With

'''MEALS ALLOWED PER SPREADSHEET TO USERFORM'''
With Me.chkMorning
    If Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 28).Value = "T" Then
        .Value = Checked
    Else
        .Value = Unchecked
        .Enabled = False
    End If
End With

With Me.chkMidday
    If Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 30).Value = "T" Then
        .Value = Checked
    Else
        .Value = Unchecked
        .Enabled = False
    End If
End With

With Me.chkEvening
    If Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 32).Value = "T" Then
        .Value = Checked
    Else
        .Value = Unchecked
        .Enabled = False
    End If
End With
'''END MOVEMENT OF MEALS ALLOWED TO USERFORM'''

End Sub

标签: excelvbauserform

解决方案


您的代码禁用了复选框,但没有重新启用它们。一旦禁用,它们的值就不能被重置。我建议使用此代码而不是您拥有的代码。

Dim Check As Boolean

Check = (Sheets("Travel Expense Voucher").Range("Data_Start").Offset(TargetRow, 28).Value = "T")
With chkMorning
    .Enabled = vbTrue
    .Value = Abs(Check)
    .Enabled = .Value
End With

现在,引用工作表中的特定单元格通过哪种方法接收值“T”,或者没有,我无法判断。我已经建议研究测序。鉴于对时间所做的更改会影响正在测试复选框的单元格,因此只有当 Excel 在 VBA 运行您的用户窗体时重新计算工作表时,该更改才会生效。这个我不知道。因此我不会建立在它之上。

基本方案是——或者应该是——在表单打开(初始化)时将数据读入表单,在用户查看表单时添加、修改或操作这些数据,并将附加、修改或操作的数据交还给用户完成后的工作表(使用表单)。您的概念不遵循此方案。因此,它会产生您不应该面对的问题。


推荐阅读