Переместите курсор на одну и ту же строку, другой столбец при нажатии Enter, с другими указанными c требованиями - PullRequest
0 голосов
/ 01 апреля 2020

Я посмотрел и, хотя нашел несколько похожих тем (с различной степенью релевантности / полезности), ни одна из них не охватила мою точную ситуацию.

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

На моем листе есть "Номер позиции" "и столбец" Количество "с несколькими столбцами между ними.

Я пытаюсь достичь:

  • Введите данные в ячейку в" Номер элемента " столбец и нажмите Enter.
  • Курсор появляется в той же строке, в нескольких столбцах справа в столбце «Количество».

Я хочу, чтобы это происходило только при нажатии Enter после ввода данных в только пустые ячейки в столбце «Номер позиции». Нажатие Enter в любом другом столбце должно просто позволить курсору вести себя так, как в противном случае.

На данный момент у меня есть код

        Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Range("A100") = ActiveCell.Address

Cells(Application.ActiveCell.Row, 11).Select

End Sub

Первая строка (начинающаяся с «Range») позволяет увидеть активный адрес ячейки в ячейке A100. Это работает вместе с другим кодом, который позволяет мне закрасить активную ячейку на этом листе, чтобы я мог видеть вещи немного лучше, когда электронная таблица занята.

Вторая строка (начинающаяся с «Ячейки») - это код предполагается , чтобы курсор переместился к столбцу «Количество» после нажатия Enter в столбце «Номер элемента».

Теперь все это работает хорошо, за исключением одного существенного недостатка ..... При нажатии на ячейку в столбце «Номер элемента» курсор сразу перемещается в столбец «Счет», прежде чем я смогу ввести какие-либо данные, не говоря уже о нажатии Enter. ключ.

Что я делаю не так? и Как мне go обеспечить, чтобы это только происходило при нажатии Enter после ввода данных в пустая ячейка в столбце «Номер элемента»?

Надеюсь, это имеет смысл, так как чтение такого большого количества кода привело меня в замешательство. Приветствия

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Вы должны объединить события Worksheet_Change() и Worksheet_SelectionChange() и использовать переменную области видимости для проверки изменения пустых ячеек

Option Explicit

Dim emptyCell As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Then Exit Sub ' don't bother nulticell selections
    If Cells(1, Target.Column).Value <> "Item Number" Then Exit Sub ' don't bother selections outside "Item Number" column
    If emptyCell And Not IsEmpty(Target.Value) Then Cells(Target.Row, Range("A1", Cells(1, Columns.Count).End(xlToLeft)).Find(what:="Count", LookIn:=xlValues, lookat:=xlWhole).Column).Select ' if current cell was empty and now it is not then skip to "Count" column same row
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    emptyCell = IsEmpty(Target.Value) ' store the info about current selection being empty
End Sub
0 голосов
/ 01 апреля 2020

Пожалуйста, попробуйте событие Изменить . Код ниже должен делать то, что вы хотите. Его можно расширить, чтобы реагировать (иначе) на изменения в других столбцах.

Private Sub Worksheet_Change(ByVal Target As Range)

    Const TriggerColumn As Long = 3             ' modify as required
    Const NextColumn As Long = 11               ' modify as required

    Dim Rng As Range

    ' don't take action if more than 1 cell was changed
    If Target.Cells.CountLarge > 1 Then Exit Sub

    ' don't include the caption row in ther ange
    ' find the last used row in a column filled BEFORE Triggercolumn
    Set Rng = Range(Cells(2, TriggerColumn), Cells(Rows.Count, "A").End(xlUp))

    ' take action only if the changed cell is within Rng
    If Not Application.Intersect(Target, Rng) Is Nothing Then
        ' skip if the change resulted in a blank cell
        With Target
            If Len(.Value) Then
                Cells(.Row, NextColumn).Select
            Else
                ' prevent the next action from triggering this function
                Application.EnableEvents = False
                ' delete contents of the next cell
                Cells(.Row, NextColumn).ClearContents
                Application.EnableEvents = True
            End If
        End With
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...