Используйте код макроса только для одного определенного столбца

Я все еще новичок в программировании в Excel, и у меня возникают проблемы с внесением небольших изменений в мой код. Мой код позволяет пользователю выбрать ячейку, а затем использовать стрелки вверх и вниз для выбора определенного значения. Глядя на приведенный ниже код, я вызываю функции «UpOne» и «DownOne» на своем листе, а затем у меня есть сохраненные значения строк в модуле.

Код рабочего листа

Private Sub Worksheet_Open()
    Application.OnKey "{UP}", "UpOne"
    Application.OnKey "{DOWN}", "DownOne"
End Sub

Код модуля

Sub DownOne()
    Select Case ActiveCell.Value
    Case ""
        ActiveCell.Value = "PASS"
    Case "PASS"
        ActiveCell.Value = "FAIL"
    Case "FAIL"
        ActiveCell.Value = "Unknown"
 End Sub
 Sub UpOne()
    Select Case ActiveCell.Value
    Case "Unknown"
        ActiveCell.Value = "FAIL"
    Case "FAIL"
        ActiveCell.Value = "PASS"
    Case "PASS"
        ActiveCell.Value = ""
 End Sub

Мой вопрос: как заставить этот код работать только для всех ячеек в одном конкретном столбце? И как бы у меня были разные значения, когда пользователь выбирает другой столбец. Таким образом, если пользователь выбирает пустую ячейку в столбце «J», он/она может перемещаться с помощью клавиш со стрелками по таким значениям, как «A», «B», «C», но когда он/она выбирает пустую ячейку в столбце «N ", он может перемещаться по другому набору значений, таких как "E", "F", "G" и т. д. Спасибо за любую помощь!


person serge2487    schedule 29.11.2011    source источник


Ответы (2)


Вместо того, чтобы отключать/включать код каждый раз, когда вы выбираете ячейку (плюс вам нужно будет учитывать выбор нескольких ячеек), вам будет проще использовать проверку данных. Вы можете настроить списки, которые могут применяться к определенным ячейкам.

У Дебры Далглиш есть отличное обсуждение проверки данных на Contexturesвведите здесь описание изображения

person brettdj    schedule 29.11.2011
comment
Я понимаю. Количество ячеек, использующих эту проверку данных, будет очень большим. Это не сильно замедлит загрузку страницы? - person serge2487; 29.11.2011

Грубый код, основанный на вашем оригинальном подходе:

Sub DownOne()
   CycleValue Selection, -1
End Sub
Sub UpOne()
   CycleValue Selection, 1
End Sub

Sub CycleValue(rng As Range, GoDir As Integer)

    Dim arrA, arrB
    Dim arrVals, val
    Dim c As Range, m, indx As Integer
    Dim lb As Integer, ub As Integer
    Dim ProcessThis As Boolean

    arrA = Array("Fail", "Pass", "")
    arrB = Array("Eggs", "Bacon", "Toast", "Beans", "")

    For Each c In rng.Cells
        ProcessThis = True

        'what values are we cycling through?
        'based on column position
        If c.Column = 1 Then
            arrVals = arrA
        ElseIf c.Column = 5 Then
            arrVals = arrB
        Else
            ProcessThis = False 'not checking this column
        End If

        If ProcessThis Then
            lb = LBound(arrVals)
            ub = UBound(arrVals)
            val = Trim(c.Value)
            m = Application.Match(val, arrVals, 0)

            If IsError(m) Then
                indx = lb
            Else
                m = m - 1 '1-based
                indx = m + GoDir
                If indx < lb Then indx = ub
                If indx > ub Then indx = lb
            End If
            c.Value = arrVals(indx)
         End If
    Next c
End Sub
person Tim Williams    schedule 29.11.2011