Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何将两个复选框链接到一个单元格,以便当两个复选框为false时,该单元格将被更改_Excel_Vba_If Statement_Checkbox - Fatal编程技术网

Excel 如何将两个复选框链接到一个单元格,以便当两个复选框为false时,该单元格将被更改

Excel 如何将两个复选框链接到一个单元格,以便当两个复选框为false时,该单元格将被更改,excel,vba,if-statement,checkbox,Excel,Vba,If Statement,Checkbox,我的第一个问题 我创建了一个工具,允许选择(通过复选框)医院提供的服务,并在所选服务中重新分配指定床位总数。例如,根据需求预测,在34个服务中分配1000张床位,取消选择任何服务将调整分布,以便每次单击复选框,服务的床位数都会发生变化。到目前为止,我对该工具及其宏的使用已经达到了一个相当好的程度-为服务选择全部和取消选择全部按钮,并在折叠时折叠列表和隐藏复选框。此外,每项服务都有两个床位号,用于医疗和外科 除了完全取消选择(取消选择?)服务之外,我还有一个“%to service”列,用户在其中

我的第一个问题

我创建了一个工具,允许选择(通过复选框)医院提供的服务,并在所选服务中重新分配指定床位总数。例如,根据需求预测,在34个服务中分配1000张床位,取消选择任何服务将调整分布,以便每次单击复选框,服务的床位数都会发生变化。到目前为止,我对该工具及其宏的使用已经达到了一个相当好的程度-为服务选择全部和取消选择全部按钮,并在折叠时折叠列表和隐藏复选框。此外,每项服务都有两个床位号,用于医疗和外科

除了完全取消选择(取消选择?)服务之外,我还有一个“%to service”列,用户在其中输入一个介于0和100之间的数字,这取决于医院应该服务的需求量。我有两个功能(复选框和%)分别工作,以影响床号列。如果%值>零,则这两个复选框必须为真。相反,只有当两个复选框都为false时,%值才应为零

因此,%是0到100,并且影响每个服务的两个列。而且,每列对每个服务都有一个复选框

我想知道我可以把if语句放在哪里,它们必须是双向的。我可以这样做,一个复选框的状态将使百分比为零,但是这个0%将删除医疗床和手术床的值。或者,如果我输入0%,复选框状态不能更改,如果它包含if cells.value>0命令

我还收集了一些代码想法,尝试检查2个复选框状态并更改单元格值(复选框1位于第31行,有34行和2列,因此复选框35位于复选框1的旁边):

我希望有足够的细节。对我来说,更简单的选择是在医疗和外科中有%列,并去掉复选框。这确实是一个演示功能,因为该功能可以单独正常工作,但用户需要单击两次框,“全选”不起作用

默认视图: 零%,复选框为真:


非常感谢您的帮助、指导和问题提示

将代码置于“计算”中的问题在于,您无法确定用户是否单击了复选框或编辑了单元格内容

为了解决这个问题,我建议您为每个事件使用不同的代码:

  • 如果用户单击复选框,您可以使用复选框####单击事件,并将检查代码放在那里。(您的复选框必须是ActiveX,而不是表单控件)

  • 如果用户更改工作表中的值,请使用“工作表\u计算”选中相应的复选框

您可以相信,Excel/VBA将始终以相同的顺序处理事件

现在,复选框有一个悲哀的地方:您可以通过工作表的OLEObjects集合(
ActiveSheet.OLEObjects(“CheckBox1”)
访问它们,但是您不能指定值。因此循环和使用间接寻址不起作用

For i = 1 to 34
    ActiveSheet.OLEOBjects("CheckBox" & i).Value = ...
Next i
为值赋值时出现运行时错误

因此,您的代码如下所示:

Option Explicit

Private Sub CheckBox1_Click()
    CheckChanges 1, CheckBox1, CheckBox35
End Sub

Private Sub CheckBox2_Click()
    CheckChanges 2, CheckBox2, CheckBox36
End Sub

'And so on ...

Private Sub CheckBox2_Click()
    CheckChanges 34, CheckBox34, CheckBox68
End Sub


Private Sub CheckChanges(ByVal nr As Long, box1 As MSForms.CheckBox, box2 As MSForms.CheckBox)

    If box1.Value = False And box2.Value = False Then
        Range("f" & nr + 30).Value = 0
    End If
End Sub

Private Sub Worksheet_Calculate()

    Call SetBoxes(Range("F31").Value, CheckBox1, CheckBox35)
    Call SetBoxes(Range("F32").Value, CheckBox2, CheckBox36)
    ' And so on ...
    Call SetBoxes(Range("F67").Value, CheckBox34, CheckBox68)

End Sub

Private Sub SetBoxes(ByVal cellValue As Boolean, box1 As MSForms.CheckBox, box2 As MSForms.CheckBox)
    box1.Value = cellValue
    box2.Value = cellValue
End Sub

非常感谢d-stroyer!谢谢!是的,我正在为复选框使用ActiveX控件。但是,nr+30无法识别复选框所在的行。我已尝试使用此控件并将其添加到子复选更改中,以获取复选框的行。Dim cb As Object Dim cell As Range If…Range(“k”&cell.row).Value=0…如果这为“范围”(“k”和cell.Row)提供了错误“对象变量或未设置块变量”。Value=0“将box.Value与cell.Value相等意味着什么?我打算将零改回1和100之间的任何数字。我得到“byref参数类型不匹配”对窗体控件的任一ActiveX运行CheckChanges时出错。@d-stroyer您为ActiveX复选框
ActiveSheet.OLEObjects(“CheckBox1”).Object.value=True
@mehow分配了一个值。谢谢您的链接。这很有价值(而且是未记录的afaik)。
Option Explicit

Private Sub CheckBox1_Click()
    CheckChanges 1, CheckBox1, CheckBox35
End Sub

Private Sub CheckBox2_Click()
    CheckChanges 2, CheckBox2, CheckBox36
End Sub

'And so on ...

Private Sub CheckBox2_Click()
    CheckChanges 34, CheckBox34, CheckBox68
End Sub


Private Sub CheckChanges(ByVal nr As Long, box1 As MSForms.CheckBox, box2 As MSForms.CheckBox)

    If box1.Value = False And box2.Value = False Then
        Range("f" & nr + 30).Value = 0
    End If
End Sub

Private Sub Worksheet_Calculate()

    Call SetBoxes(Range("F31").Value, CheckBox1, CheckBox35)
    Call SetBoxes(Range("F32").Value, CheckBox2, CheckBox36)
    ' And so on ...
    Call SetBoxes(Range("F67").Value, CheckBox34, CheckBox68)

End Sub

Private Sub SetBoxes(ByVal cellValue As Boolean, box1 As MSForms.CheckBox, box2 As MSForms.CheckBox)
    box1.Value = cellValue
    box2.Value = cellValue
End Sub