4

データ行のドロップダウンからの入力に基づいて、特定の範囲のセルをロックすることは可能ですか?

たとえば、私のスプレッドシートの各行は患者を表し、最初のセルは「はい」または「いいえ」の回答が必要な質問をします (ドロップダウンで選択/入力します)。

編集

「はい/いいえ」のセルは、実際には 2 つのセル (G13 と H13) を結合したものです。これを反映するように例を更新しました。

編集終了

ユーザーが「いいえ」を選択した場合、ここにデータを入力する必要がないため、残りの質問範囲 (G13-H13:AB13) をロックします。ただし、ユーザーが「はい」を選択した場合、残りのセルはデータを入力できる状態のままになります。

各範囲内のすべてのセルには、ドロップダウンのみから入力されたデータがあります。

これが私が達成したいと思っていることです:

If "No"
    Then lock range G13-H13:AB13
Else If "Yes"
    Then do nothing

i.e.

 G13-H13  I13-J13  K13-L13   ....     ....     AB13
|  NO   |  ----  |  ----  |  ----  |  ----  |  ----  |  (Locked Cells)

OR

 G13-H13  I13-J13  K13-L13   ....     ....     AB13
|  YES  |        |        |        |        |        |  (Unlocked Cells)

繰り返しますが、すべてのデータはドロップダウン メニューから入力され、手動で入力する必要はないことを強調したいと思います。G13-H13 = "No"の場合、ドロップダウンがある範囲内の残りのセルが、それぞれのドロップダウンから選択された詳細情報をブロックまたはロックされるようにしたいと思います。

G13-H13 の値は「はい」または「いいえ」のいずれかであることに注意してください。

これは VBA を使用して実現できますか。

どうもありがとう。

4

3 に答える 3

5

編集:VBAなしでこれを行うことができます。私はこれを別の答えに基づいています: https://stackoverflow.com/a/11954076/138938

列 G には、はいまたはいいえのドロップダウンがあります。

セル H13 で、次のようにデータ検証を設定します。

  1. データ --> データ検証
  2. [許可]ドロップダウンで[リスト] を選択します。
  3. [ソース] フィールドに次の式を入力します。=IF($G13="Yes", MyList, FALSE)
  4. セル H13 をコピーし、検証を貼り付けます (貼り付け --> 特殊な貼り付け --> 検証) をセル I13:AB13 に貼り付けます。
  5. MyList数式を、ユーザーが各列から選択できるようにするリストに置き換えます。検証を設定するには、患者の回答を「はい」に設定する必要があることに注意してください。設定したら、削除するか、いいえに設定できます。
  6. 行 13 の検証を設定したら、検証をコピーして必要なすべての行に貼り付けます。

VBA を使用する場合は、次を使用し、worksheet_change イベントまたはその他のメカニズムを使用して LockOrUnlockPatientCells をトリガーします。worksheet_change を使用するのは好きではありませんが、この場合は理にかなっています。

セルをロックするには、セルをロックしてからシートを保護する必要があります。以下のコードはそれを行います。作業中の患者の行を渡す必要があります。

Sub LockOrUnlockPatientCells(PatientRow As Long)
    Dim ws As Worksheet
    Dim YesOrNo As String

    Set ws = ActiveSheet
    YesOrNo = ws.Range("g" & PatientRow).Value

    ' unprotect the sheet so that we can modify locked settings
    ws.Unprotect
    ws.Range("a:g").Cells.Locked = False

    ' lock row
    Range("h" & PatientRow & ":AB" & PatientRow).Cells.Locked = True

    ' unlock the row depending on answer
    If YesOrNo = "Yes" Then
        Range("h" & PatientRow & ":AB" & PatientRow).Cells.Locked = False
    End If

    ' protect the sheet again to activate the locked cells
    ws.Protect

End Sub

以下を使用して、患者行の値を手動で調整することにより、機能をテストできます。希望どおりに動作するようになったら、ユーザーの入力から行を取得します。

Sub testLockedCells()
    Dim AnswerRow As Long

    AnswerRow = 9

    LockOrUnlockPatientCells AnswerRow
End Sub
于 2012-08-10T13:16:05.507 に答える
3

このコードで作業を開始できます。特定のニーズに合わせて微調整する必要があるかもしれませんが、元の投稿の詳細に基づいてロジックを作成しました.

モジュールを VBE のそれぞれのワークシート オブジェクトに配置します。

Private Sub Worksheet_Change(ByVal Target As Range)


'assumes cell changed in column G and first row of data entry is 13
If Target.Column = 7 And Target.Row > 12 Then 'change to If Intersect(Target, Range("G13")) Then if all you care about is G13


    Application.EnableEvents = False 'stop events from processing

    Dim blnLock As Boolean
    Dim r As Integer

    Select Case Target.Value
        Case Is = "No"
            blnLock = True
            r = 191
        Case Is = "Yes"
            blnLock = False
            r = 255
    End Select

    Unprotect Password:="myPassword"

    With Range("H" & Target.Row & ":AB" & Target.Row)

        'just a suggestion, fill the cells grey before locking them, or turn them back to no fill if it's unlocked
        .Interior.Color = RGB(r, r, r)
        .Locked = blnLock

    End With

    .Protect Password:="myPassword"

    Application.EnableEvents = True

End If


End Sub
于 2012-08-10T13:48:43.957 に答える
0

これを試して : -

ループを適用して確認する

「いいえ」の場合

ws.get_Range(StartCell, EndCell).Locked = true;

// ws はワークシート オブジェクト

それ以外の場合は「はい」

継続する;

于 2012-08-10T13:03:21.107 に答える