0

我的第一个问题!

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

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

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

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

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

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 zero% 并且复选框为真:http: //i.imgur.com/Ek5Mp15.gif

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

4

1 回答 1

0

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

为了摆脱这个问题,我建议您对每个事件都有不同的代码:

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

  • 如果用户更改工作表中的值,请使用“Worksheet_Calculate”选中相应的复选框。

您可以依赖 Excel/VBA 将始终以相同顺序处理事件的事实。

现在,关于 CheckBoxes 的一件可悲的事情是:您可以通过 Sheet 的 OLEObjects 集合访问它们(ActiveSheet.OLEOBjects("CheckBox1")但您不能分配值。因此循环和使用间接方法不起作用。

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
于 2013-08-09T07:29:42.487 回答