【问题标题】:How to edit my userform code to allow for changes to update如何编辑我的用户表单代码以允许更改更新
【发布时间】:2020-01-23 02:39:58
【问题描述】:

我正在开发一个 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

【问题讨论】:

标签: excel vba userform


【解决方案1】:

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

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 运行您的用户窗体时重新计算工作表时,该更改才会生效。这个我不知道。因此,我不会在此基础上进行构建。

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

【讨论】:

  • 必须不同意 - 当控件被禁用时,可以在代码中更改复选框值。将禁用复选框添加到带有命令按钮的表单 - 将 Me.CheckBox1.Value = Not Me.CheckBox1.Value 添加到按钮单击事件中,当您单击按钮时,禁用复选框值将发生变化。
  • 我也是这样做的。禁用的复选框显示为灰色,没有价值并且无法通过代码访问(Excel 2010,也许是 2013)。但是,我认为这是一个附带问题。问题是从工作表中获得的值是否正确更新,只有在正确的情况下才能用于更新表单上的复选框(如果该框的状态允许)。正在使用的 Excel 版本也可能起到一定的作用。
  • 真的,我在 365 上。
  • Variatus,你的假设是正确的。如果我的数据库中的信息返回 False,我需要该框变灰。我不希望用户能够更改这些灰显的字段。但是,如果他们意识到他们输入了错误的时间,我需要时间字段是可编辑的,并且数据库需要与用户表单对话并让它知道复选框需要更改。这甚至可能吗?
  • 您的代码不允许重新启用已禁用的复选框。我提供的代码在设置之前启用了复选框。请将此代码应用于所有三个复选框。如果这不能解决问题,请从表单而不是工作表中获取重新设置复选框的条件。
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 2020-03-28
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多