Excel VBA Macro Help - Обязательные ячейки - PullRequest
0 голосов
/ 13 марта 2020

Новый пользователь был направлен на ваш полезный веб-сайт дружественным членом команды.

Проблема: Попытка заставить пользователя в excel заполнить ячейку в столбце (столбец O) перед заполнением ячейки в колонках ил. Проблема заключается в том, что не каждая ячейка в столбцах должна быть заполнена. Я нашел код VBA, который несколько помог, но проблема в том, что всплывающее окно все равно будет появляться, если столбец О заполнен до того, как в одном из них появится текст. ячеек в столбце IL (и, следовательно, ошибка возникает, если не заполнены все 4 ячейки в строке). Как уже упоминалось, цель состоит в том, чтобы (например) сначала заполнить O264 до того, как будут заполнены какие-либо ячейки в столбце I, J, K или L264.

Дальнейшее усугубление этой проблемы заключается в наличии множества Строки, к которым мне нужно применить это, поверьте, это то, где диапазон подходит. Однако, игра с линией диапазона в Excel не работает так, как я пытался.

Код ниже:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("I:L")) Is Nothing Then
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
If Target.Offset(, -1).Value = "" Then
MsgBox "You must first enter feedback in column ""O"""
Target.Value = ""
Target.Offset(, -1).Select
End If
End If
End Sub

1 Ответ

0 голосов
/ 14 марта 2020

Это может быть случай, когда вам может понадобиться немного помочь пользователю. Вы могли бы сделать это, скрывая зависимые ячейки, блокируя их, выполняя их, и т.д. c. Мне кажется, что отображение окна сообщения всякий раз, когда пользователь вводит данные в неправильном порядке, слишком реактивно.

В приведенном ниже примере целевые ячейки заблокированы и окрашены в серый цвет до тех пор, пока что-то не будет введено в столбец «O». , Вам также необходимо создать список целевых строк, если у вас их больше одного.

В вашем коде за соответствующим листом приведенный ниже скелетный код должен помочь вам начать работу. Я включил несколько вспомогательных функций, чтобы сделать код немного более понятным для вас:

Option Explicit

Private Const SHEET_PASSWORD As String = "xyz" 'whatever password you choose.
Private Const TARGET_ROWS As String = "2,4,6" 'your target rows, separated by commas.
Private Const TARGET_COLUMN As String = "O"
Private Const DEPENDENT_COLUMNS As String = "I:L"

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range, cell As Range

    Set rng = Intersect(Target, Me.Columns(TARGET_COLUMN))
    'Exit routine if we're not in the target column.
    If rng Is Nothing Then Exit Sub

    'Process the target column cells.
    For Each cell In rng.Cells
        If IsTargetRow(cell.Row) Then
            SetDependentStates cell
        End If
    Next
End Sub

Private Sub SetDependentStates(cell As Range)
    Dim DependentRange As Range

    'Define the Dependent range based on passed cell row.
    Set DependentRange = Intersect( _
        cell.EntireRow, _
        Me.Range(DEPENDENT_COLUMNS) _
    )

    'Lock/unlock and paint Dependent rows, based on
    'contents of passed cell.
    Application.EnableEvents = False 'prevent capture of change event.
    Me.Unprotect SHEET_PASSWORD
    With DependentRange.Cells
        If Len(cell.Value) = 0 Then
            .ClearContents
            .Locked = True
            With .Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorDark1
                .TintAndShade = -0.249977111117893
                .PatternTintAndShade = 0
            End With
        Else
            .Locked = False
            With .Interior
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
        End If
    End With
    Me.Protect SHEET_PASSWORD
    Me.EnableSelection = xlUnlockedCells
    Application.EnableEvents = True
End Sub

Private Function IsTargetRow(rowNum As Long) As Boolean
    Dim v As Variant

    'Tests if the pass row number is in the target row list.
    For Each v In Split(TARGET_ROWS, ",")
        If CLng(v) = rowNum Then
            IsTargetRow = True
            Exit Function
        End If
    Next
End Function

Public Sub InitialiseDependentStates()
    Dim v As Variant
    Dim cell As Range

    'Define your unlocked cells.
    'This is a simple example, adjust as you wish.
    With Me
        .Unprotect SHEET_PASSWORD
        .Cells.Locked = False
        .Protect SHEET_PASSWORD
        .EnableSelection = xlUnlockedCells
    End With

    For Each v In Split(TARGET_ROWS, ",")
        Set cell = Me.Range(TARGET_COLUMN & v)
        SetDependentStates cell
    Next
End Sub

Вы, вероятно, захотите инициализировать зависимые состояния при открытии рабочей книги. Сделайте это в коде рабочей книги:

Private Sub Workbook_Open()
    Sheet1.InitialiseDependentStates 'use whichever sheet you're using.
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...