【问题标题】:Excel VBA Checkbox - Checking and Unchecking By Itself When Running Click CodeExcel VBA 复选框 - 运行单击代码时自行检查和取消选中
【发布时间】:2021-07-10 19:43:41
【问题描述】:

我在 Q 列的受保护工作表中的每一行都有一个复选框。选中或取消选中此复选框将运行以下代码。

当我选中我想要的复选框时

  • 取消保护工作表
  • 解锁 R 列中的单元格(复选框旁边)
  • 将单元格背景颜色更改为白色
  • 保持单元格值
  • 清除公式
  • 保护工作表

当我取消选中我想要的复选框时

  • 取消保护工作表
  • 将单元格背景颜色更改为灰色
  • 在单元格中输入公式
  • 锁定单元格
  • 保护工作表

由于某种原因,当我选中复选框(未选中)时,代码运行,并且由于某种原因复选框恢复为未选中状态。如果复选框最初被选中并且我取消选中它,代码运行并且由于某种原因复选框恢复为选中状态,则会发生相反的情况。我的代码没有取消选中或选中复选框。

有人可以帮我弄清楚为什么在我选中或取消选中复选框后它会发生变化吗?

Sub PartQuantitiesCheckBox_Click()

    Dim sCheckboxName, sCheckboxValue, sCheckboxChecked, sDS1BuildRange As String
    Dim iCurrentRow As Integer

    sCheckboxName = Application.Caller

    ' If this returns 1 then the checkbox was checked and we clicked it to uncheck it.
    sCheckboxValue = ActiveSheet.Shapes(sCheckboxName).ControlFormat.Value

    If sCheckboxValue = "1" Then
        sCheckboxChecked = "False"
        MsgBox ("sCheckboxChecked = False")
    Else
        sCheckboxChecked = "True"
        MsgBox ("sCheckboxChecked = True")
    End If

    ' The checkbox name is prefaced with "cbPartQtyNeeded" followed by the row number (eg. cbPartQtyNeeded4).
    ' Strip the row number out of the checkbox name.
    iCurrentRow = Mid(sCheckboxName, 16, Len(sCheckboxName) - 15)
    sDS1BuildRange = "R" & iCurrentRow

    ActiveSheet.Unprotect

    If sCheckboxChecked = "False" Then
     
        Range(sDS1BuildRange).Select
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorDark1
            .TintAndShade = -0.149998474074526
            .PatternTintAndShade = 0
        End With
    
        Range(sDS1BuildRange).Formula = "=IFERROR(IF($P" & iCurrentRow & "*'Cover Sheet'!$M$8=0,"""",$P" & iCurrentRow & "*'Cover Sheet'!$M$8),"""")"
        Range(sDS1BuildRange).Locked = True

    Else

        Range(sDS1BuildRange).Locked = False
        Range(sDS1BuildRange).Select
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorDark1
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With

        sValue = Range(sDS1BuildRange).Value
        Range(sDS1BuildRange).Formula = ""
        Range(sDS1BuildRange).Value = sValue
         
    End If

    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

End Sub

【问题讨论】:

  • 你有没有为WorksheetChange事件运行的代码?
  • 不,@PeterT,我不这么认为。我从来没有把代码放在那里。
  • 我建议将Debug.Print 语句放在代码顶部附近,然后单击复选框一次以查看代码被调用的次数。显然,它应该只有一次,但我见过更奇怪的事情。
  • @PeterT,我想我找到了解决办法。我创建了一个全新的复选框并用它替换了其他复选框之一。我之前从我创建的第一个复选框中复制了所有复选框,然后将它们重命名。我认为这把他们搞砸了。创建一个新的似乎可以很好地运行代码,而无需重新选中/取消选中该复选框。奇怪。

标签: excel vba checkbox


【解决方案1】:

我创建了一个全新的复选框并用它替换了其他一个复选框。我之前从我创建的第一个复选框中复制了所有复选框,然后将它们重命名。我认为这把他们搞砸了。创建一个新的似乎可以很好地运行代码,而无需重新选中/取消选中复选框。

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多