0

私の最初の質問!

病院で提供されるサービスを (チェックボックスを介して) 選択できるツールを作成し、指定されたベッドの合計を選択したサービス全体に再分配します。たとえば、需要予測に従って 1000 のベッドが 34 のサービスに分散され、サービスの選択を解除すると、チェックボックスをクリックするたびにサービスのベッド数が変化するように分散が調整されます。これまでのところ、ツールとそのマクロでかなり良い点に到達しました。サービスのすべてを選択してすべての選択を解除し、リストを折りたたんで、折りたたんだときにチェックボックスを非表示にします。また、各サービスには、医療用と外科用の 2 つのベッド番号があります。

サービスの完全な選択解除 (選択解除?) に加えて、病院が提供する必要がある需要の量に応じて、ユーザーが 0 から 100 までの数値を入力する「サービスに対する割合」列があります。ベッド番号の列に影響を与えるために、これらの機能 (チェックボックスと %) の両方を別々に動作させています。% 値 > ゼロの場合、2 つのチェックボックスは true でなければなりません。逆に、両方のチェックボックスが false の場合のみ、% 値はゼロになります。

したがって、% は 0 から 100 で、サービスごとに両方の列に影響します。また、各列にはサービスごとにチェックボックスがあります。

双方向に行かなければならないifステートメントをどこに置くことができるか知りたいです。1 つのチェックボックスの状態でパーセンテージがゼロになるようにすることはできますが、この 0% によって医療ベッドと手術ベッドの両方の値が消去されます。または、0% を入力すると、if cells.value >0 コマンドが含まれている場合、チェックボックスの状態は変更できません。

また、2 つのチェックボックスの状態をチェックしてセルの値を変更するためのコードのアイデアもいくつか集めました (チェックボックス 1 は行 31 にあり、チェックボックス 35 がチェックボックス 1 の隣にあるように、34 行と 2 列があります)。

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

十分な詳細があることを願っています。私にとってより簡単なオプションは、医療用と外科用の % 列を用意し、チェックボックスを廃止することです。関数は個別に適切に機能するため、これは実際にはプレゼンテーションの問題ですが、ユーザーはボックスを 2 回クリックする必要があり、「すべて選択」は機能しません。

デフォルト ビュー: http://i.imgur.com/NSXdYKn.gif ゼロ%、チェックボックスは true: http://i.imgur.com/Ek5Mp15.gif

ヘルプ、ガイダンス、質問のヒントをありがとう!

4

1 に答える 1

0

コードが「計算」にある場合の問題は、ユーザーがチェックボックスをクリックしたのか、セルの内容を編集したのかを判断できないことです。

この問題を解決するには、イベントごとに個別のコードを用意することをお勧めします。

  • ユーザーがチェックボックスをクリックすると、Checkbox##_Click イベントを使用して、そこにチェック コードを配置できます。(CheckBox は Form コントロールではなく ActiveX である必要があります)

  • ユーザーがワークシートの値を変更した場合は、「Worksheet_Calculate」を使用して対応するチェックボックスをオンにします。

Excel/VBA は常に同じ順序でイベントを処理するという事実に頼ることができます。

ここで、CheckBoxes に関する悲しい点が 1 つあります。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 に答える