我的第一个问题!
我创建了一个工具,允许在医院提供服务选择(通过复选框),并在所选服务中重新分配指定的床位总数。例如,根据需求预测,在34个服务中分配1000个床位,并取消选择任何服务调整分布,以便每次单击复选框时服务的床位数都在变化。到目前为止,我已经使用该工具及其宏达到了相当不错的选择 - 选择全部并取消选择服务的所有按钮并折叠列表并在折叠时隐藏复选框。此外,每项服务还有两个床位,用于医疗和手术。
除了完全取消选择(取消选择?)服务之外,我还有一个'%to service'列,用户根据医院应该服务的需求量来设置0到100之间的数字。我有这两个功能(复选框和%)单独工作,以影响床号列。如果%值>零,那么两个复选框必须为true。相反,只有当两个复选框都为假时,%值才应为零。
因此,%为0到100,并影响每个服务的两列。并且,每列都有一个服务复选框。
我想知道在哪里可以提出必须双向进行的if语句。我可以这样做,以便一个复选框的状态将百分比归零,但是这个0%将擦除医疗和手术床值。或者,如果我输入0%,如果复选框状态包含if cells.value> 0命令,则无法更改。
我还收集了一些代码提示来尝试检查2个复选框状态并更改单元格值(复选框1位于第31行,有34行和2列,因此复选框35位于checkbox1旁边):
Private Sub Worksheet_Calculate()
For i = 1 To 34
If Me.Objects("CheckBox" & i).Value = False And Me.Controls("CheckBox" & i + 34).Value = False Then
Range("f&i+30").Value = 0
End If
Next i
End Sub
我希望有足够的细节。对我来说,更容易的选择是使用%列进行医疗和手术,并取消选中复选框。这真的是一个介绍的东西,因为该功能单独正常工作,但用户需要单击两次框,“全选”不起作用。
默认视图:http://i.imgur.com/NSXdYKn.gif 零%且复选框为true:http://i.imgur.com/Ek5Mp15.gif
非常感谢任何帮助,指导和问题提示!
答案 0 :(得分:0)
在“计算”中使用代码的问题是,您无法确定用户是否单击了复选框或编辑了单元格内容。
为了解决这个问题,我建议你为每个事件都有不同的代码:
如果用户单击复选框,则可以使用Checkbox ## _ Click事件,并将检查代码放在那里。 (您的CheckBox需要是ActiveX而不是Form控件)
如果用户更改工作表中的值,请使用“Worksheet_Calculate”检查相应的复选框。
您可以依赖Excel / VBA始终以相同顺序处理事件的事实。
现在,关于CheckBoxes的一件令人遗憾的事情:你可以通过工作表的ActiveSheet.OLEOBjects("CheckBox1")
的OLEObjects集合来访问它们,但你不能分配一个值因此,循环和使用间接不起作用。
For i = 1 to 34
ActiveSheet.OLEOBjects("CheckBox" & i).Value = ...
Next i
执行赋值给Value的运行时错误。
所以你的代码看起来像这样:
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