Активировать диапазон ячеек в SelectionChange с помощью ввода с клавиатуры

Я активирую заданный диапазон ячеек на листе с помощью следующего кода excel-vba:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' msgbox("Change recognized")
If Sh.Name <> "Spielfeld" Then
    If ActiveCell.Column > 1 Then
        Dim UserSelection As Range
        Set UserSelection = Sh.Range(Cells(1, ActiveCell.Column), Cells(16, ActiveCell.Column))
        UserSelection.Activate
    End If
End If
End Sub

Код отлично работает при изменении столбца/ячейки с помощью мыши. Но если я просто нажму клавишу со стрелкой влево или вправо, Excel изменит активную ячейку/активный столбец без выбора определенного UserSelection! Тем не менее, сама подпрограмма всегда активируется при нажатии клавиш со стрелками (окно сообщения появится, даже если я изменяю ячейки с помощью клавиш со стрелками).
Может ли кто-нибудь сказать мне, почему мой выбор не обновляется автоматически при изменении столбца с помощью клавиш со стрелками? Как я могу это сделать?


person Axiom42    schedule 10.01.2015    source источник
comment
Стрелка вниз работает, но влево/вправо/вверх делает выбор по умолчанию для строки 1. Я также замечаю, что если вы нажмете на строку 1 в любом месте, она не работает.   -  person peege    schedule 10.01.2015
comment
Я заметил, что использование Shift + Arrow работает (большую часть времени и время имеет значение).   -  person peege    schedule 10.01.2015
comment
Это происходит по какой-то причине из-за того, что строка равна 1. Это очень странно, потому что я обрабатываю случай, когда это строка 1, а затем просто устанавливаю диапазон вручную, пытаясь использовать UserSelection и проверяя правильность его адреса. , но при попытке активировать этот диапазон, если он вообще пришел из Row1 Target, он не имеет его.   -  person peege    schedule 10.01.2015


Ответы (1)


Вы должны Выбрать, а не Активировать

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name <> "Spielfeld" Then
    If ActiveCell.Column > 1 Then
        Dim UserSelection As Range
        Set UserSelection = Sh.Range(Cells(1, ActiveCell.Column), Cells(16, ActiveCell.Column))
        Application.EnableEvents = False
            UserSelection.Select
        Application.EnableEvents = True
    End If
End If
End Sub
person Gary's Student    schedule 10.01.2015
comment
Почему он отклоняет входящие диапазоны, используя строку 1, включая нажатие на ячейку в строке 1? - person peege; 10.01.2015
comment
@p В моей системе Столбец 1 не затрагивается. Это верно. Клавиши со стрелками позволяют перемещать выбранный блок вправо или влево. Клавиши Enter и Tab позволяют изменить выделение внутри выбранного блока. - person Gary's Student; 10.01.2015
comment
Ваше решение идеально. В общем, я спрашивал, почему код OP работает во всех случаях, кроме случаев, когда ввод target.address происходит из строки 1. Клавиши со стрелками возьмут выбранный блок, поскольку он начинается, скажем, с $B$1:$B$16, а затем намного так как объединенная ячейка по умолчанию имеет самую нижнюю часть, адрес, если вы ПРАВИЛЬНО от B1: B16, перейдет к C1. Таким образом, входящий target.address — это строка 1, и тогда его код не будет работать. Я вижу разницу в выборе и активации и понимаю разницу, но этого недостаточно, чтобы понять, почему он работал для каждой строки, кроме строки 1. - person peege; 10.01.2015
comment
@peege Между Select и Activate есть очень тонкие различия. Признаюсь, я не полностью понимаю эти различия. При навигации внутри рабочего листа я всегда использую Выбрать, а не Активировать. - person Gary's Student; 10.01.2015