excel - Excel VBA 复选框 - 运行单击代码时自行检查和取消选中
问题描述
我在 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
解决方案
我创建了一个全新的复选框,并用它替换了其他一个复选框。我之前从我创建的第一个复选框中复制了所有复选框,然后将它们重命名。我认为这把他们搞砸了。创建一个新的似乎可以很好地运行代码,而无需重新选中/取消选中该复选框。
推荐阅读
- spring-boot - 使用 Spring BOOT 创建访问网页的角色要求
- java - 如何制作总和为 n(n-1)/2 的数字列表
- visual-studio-code - VSCode对vim的ci的快捷命令是什么
VSCode 有办法在标签之间进行选择吗?而且我的意思不仅仅是折叠和取消折叠,我的意思是选择开始标签和结束标签之间的所有内容。
- android - 自定义 TextInputLayout 在后按时设置错误的值
- bash - 如何将多行输出存储在单独的变量中?
- python - for/else 块中的错误打印输出错误触发
- python - 字典/json 赋值 - python
- javascript - 我怎样才能等到 Reactjs 中的函数完成?
- chart.js - 勾选 - 没有负面
- android - 我可以使用 ?attr/ 值作为字符串数组中的项目值吗?