【问题标题】:ActiveX Command Button that unhides next to a Cell if a value is entered, and hides if the cell is emptyActiveX 命令按钮,如果输入值,则在单元格旁边取消隐藏,如果单元格为空,则隐藏
【发布时间】:2019-05-30 22:44:18
【问题描述】:

我有 80 行,用户可以在 Ward 列下输入预定值。这将取消隐藏它旁边的按钮。单击它后,它会清空相邻的值并根据原始值在另一张表中增加 (+1) 特定单元格。

目前,我在 Ward 单元格旁边有 80 个 ActiveX 按钮,这些按钮根据 Ward 单元格的值隐藏/取消隐藏。我注意到添加更多按钮会减慢电子表格的速度,因为我有大量的 If Then 语句。

If Range("F8").Value = 0 Then
  Sheets("Admissions").EDAdmit1.Visible = False
Else
  Sheets("Admissions").EDAdmit1.Visible = True
End If

If Range("L8").Value = 0 Then
  Sheets("Admissions").ElecAdmit1.Visible = False
Else
  Sheets("Admissions").ElecAdmit1.Visible = True
End If

If Range("F9").Value = 0 Then
  Sheets("Admissions").EDAdmit2.Visible = False
Else
  Sheets("Admissions").EDAdmit2.Visible = True
End If

If Range("L9").Value = 0 Then
  Sheets("Admissions").ElecAdmit2.Visible = False
Else
  Sheets("Admissions").ElecAdmit2.Visible = True
End If

..等等。

更不用说每次单击按钮时我都有的 If Then 语句。

Private Sub EDAdmit1_Click()
If Range("F8") = "ICU" Then
    Worksheets("Overview").Range("AD11").Value = Worksheets("Overview").Range("AD11") + 1
ElseIf Range("F8") = "HDU" Then
    Worksheets("Overview").Range("AF11").Value = Worksheets("Overview").Range("AF11") + 1
ElseIf Range("F8") = "DPU" Or Range("F8") = "Other" Then
Else
    Col = WorksheetFunction.VLookup(Range("F8"), Range("U1:V27"), 2)
    Worksheets("Overview").Range(Col).Value = Worksheets("Overview").Range(Col).Value + 1
End If
Range("F8").ClearContents
End Sub

有没有更有效的方法?

录取名单:

【问题讨论】:

  • 不要重复 IF 语句,而是将您的范围声明为 Dim rng As Range: Set rng = Range("xx:xx") 然后循环遍历您的范围...

标签: excel vba


【解决方案1】:

您可以考虑在病房选择旁边的单元格中使用“承认”超链接:这样您只需要一个处理程序(工作表模块中的 Worksheet_FollowHyperlink)。请注意,您需要在此处使用 Insert >> Hyperlink 而不是 HYPERLINK() 公式类型的链接(因为基于公式的链接不会触发 FollowHyperlink 事件)。

您可以放弃隐藏/显示代码,而是使用条件格式来更改链接字体颜色以在未选择任何病房时隐藏链接。如果用户点击其中一个隐藏链接,那么您什么也做不了。

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

    Dim rngSrc As Range, addr, ward

    Set rngSrc = Target.Range        '<< the cell with the link
    ward = rngSrc.Offset(0, 1).Value '<< cell with Ward

    'only do anything if a ward is selected
    If Len(ward) > 0 Then
        'find the cell to update
        Select Case ward
            Case "ICU"
                addr = "AD11"
            Case "HDU"
                addr = "AF11"
            Case "DPU", "Other"
                addr = ""
            Case Else
                addr = Application.VLookup(ward, Me.Range("U1:V27"), 2, False)
        End Select

        'if we have a cell to update then
        If Len(addr) > 0 Then
            With Worksheets("Overview").Range(addr)
                .Value = .Value + 1
            End With
        End If
        rngSrc.Offset(0, 1).ClearContents
    End If

    rngSrc.Select '<< select the clicked-on link cell
                  '   (in case the link points elsewhere)

End Sub

【讨论】:

  • 整洁!这简直就是天才!现在我还有一个“转移”按钮,我在原来的帖子中没有提到。在“转移”按钮/链接出现之前,它需要两个病房输入。单击时,它会从第一个病房带走-1,从第二个病房带走+1。我在原始帖子中添加了第二个屏幕截图来说明这一点。
  • 我暂时离开了 - 如果您还需要帮助,可以下周看看
  • 一切都好。我可以通过添加额外的病房补偿来做到这一点。现在,显然我需要防止最终用户删除这些超链接。因此,我尝试锁定整个工作表,但链接不起作用,除非我允许用户选择锁定的单元格。我希望用户能够单击超链接但不能选择单元格。
【解决方案2】:

在你的代码的开头放这行:

Application.ScreenUpdating = False

这将禁用所有屏幕更新。让您的代码进行更改,然后启用屏幕更新,您的所有更改都会出现。

Application.ScreenUpdating = True

禁用屏幕更新通常会使代码的执行速度更快。

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2012-02-18
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多