Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удержание активной ячейки в пределах некоторого расстояния до краёв. / 1 сообщений из 1, страница 1 из 1
23.01.2008, 14:33:21
    #35081984
tolikt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удержание активной ячейки в пределах некоторого расстояния до краёв.
Читая тему Управляемый скролинг , вспомнилось нечто похожее

Украдено с другого форума.

*****************************************************************************

Работая непосредственно с книгой xls, при перемещении по листу иногда нужно, чтобы было видно несколько строк и (или) столбцов до границы окна книги.
Т. к. с ходу сделать подобный макрос не получилось и пришлось некоторое время повозиться, то выкладываю получившийся код здесь.
Может быть, кому-нибудь пригодится.

В модуль листа в Worksheet_SelectionChange поместить следующий код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Dim OldTarget As Range 'предыдущее значение выделенной области или ячейки

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
' макрос для удержания активной ячейки в пределах некоторого расстояния до краёв
Dim FixR
Dim TopR, BotR, TarR

FixR =  4  'количество строк до краёв
MaxR =  65536   ' последняя строка (кроме Excel 2007)

' если сдвига по строке не было, то макрос не срабатывает
If Not OldTarget Is Nothing Then
If OldTarget.Row = Target.Row Then Exit Sub
End If

' макрос срабатывает, если выделена только одна необъединённая ячейка, иначе тут нужен дополнительный обработчик
If Target.Count >  1  Then GoTo LFixEnd

TarR = Target.Row
TopR = ActiveWindow.ScrollRow
BotR = ActiveWindow.ScrollRow + ActiveWindow.VisibleRange.Rows.Count -  1 

' при небольшом размере окна или больших высотах у строк кол-во строк до краёв пополамим
If ActiveWindow.VisibleRange.Rows.Count < FixR *  2  Then
FixR = ActiveWindow.VisibleRange.Rows.Count \  2  -  1 
TarR = Target.Row
End If

' далее сама подгонка
If TarR - TopR < FixR Then
    If TopR <= FixR Then Exit Sub ' для самых первых строк
    ActiveWindow.ScrollRow = TarR - FixR
    If Target.Row > ActiveWindow.ScrollRow + ActiveWindow.VisibleRange.Rows.Count -  1  Then
    ActiveWindow.ScrollRow = TopR  ' для случая переходов высокая-низкая ячейка
    End If
ElseIf BotR - FixR < TarR Then
    If BotR = MaxR Then Exit Sub ' для самых последних строк
    ActiveWindow.ScrollRow = TopR + FixR - BotR + TarR
End If

LFixEnd:
Set OldTarget = Target
End
Макрос для строк. Переделать/добавить для столбцов труда не составит.
Некоторое неудобство (как бы «ненужные» скачки вверх-вниз) возникает при переходе активной ячейки с высоких строк на низкие и наоборот, либо около границ таких ячеек, особенно при небольшом размере окна приложения.

По ходу дела возник вопрос. Не совсем в тему.
Например, область C3:E10 объединена. Делаем активной ячейку A6. И стрелкой вправо сдвигаем активную ячейку сначала на B6, потом ещё правее. Получаем выделенную объединённую ячейку C3:E10. Затем опять жмём стрелку вправо. И выделяется ячейка F6, а не например, F3 – как бы с верхней строки объединённой предыдущей ячейки. Т. е. как-то Excel запоминает пред-предыдущее значение номера строки. Как и откуда взять это значение, не используя переменные, например, на уровне модуля?

****************************************************************************

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

Конечно же, код не является оптимальным. Наверняка можно сделать лучше.
Про нужность и удобство в работе пусть каждый сам решает.

Предыдущий макрос работает в зависимости от нужного количества видимых строк до краёв окна.
Следующий пример макроса работает в зависимости от расстояния до краёв в пунктах (points).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
TarR = Target.Row ' номер строки активной ячейки
TopR = ActiveWindow.ScrollRow ' номер верхней строки окна
BotR = ActiveWindow.ScrollRow + ActiveWindow.VisibleRange.Rows.Count -  1  ' номер нижней строки окна
TarH = Target.Height ' размер активной ячейки  в пойнтах
TarT = (Range(Cells(ActiveWindow.ScrollRow,  1 ), Target).Height - Target.Height) _
* Sgn(Target.Row - ActiveWindow.ScrollRow) ' расстояние в пойнтах от активной ячейки до верха окна
WinH = ActiveWindow.Height - MinH ' текущий размер окна
RwsH = ActiveWindow.VisibleRange.Height - Cells(ActiveWindow.ScrollRow + _
ActiveWindow.VisibleRange.Rows.Count -  1 ,  1 ).Height ' расстояние от нижней видимой строки до верха окна
TarB = WinH - TarT - Target.Height ' расстояние в пойнтах от активной ячейки до низа окна

'MsgBox "WinH=" & WinH & Chr(10) & "RwsH=" & RwsH & Chr(10) & _
"TarH=" & TarH & Chr( 10 ) & "TarT=" & TarT & Chr( 10 ) & "TarB=" & TarB & Chr( 10 )

If TarH + FixH *  2  > RwsH Then 'если размер ячейка+края меньше размеров окна
If RwsH > TarH Then FixH = (RwsH - TarH) \  2  Else Exit Sub
End If

' подгонка
If TarT <= FixH Then
    i =  0 
    Do
    If TopR - i >  1  Then i = i +  1  Else Exit Do
    TarT = TarT + Rows(TopR - i).Height
    Loop While TarT <= FixH
    If TopR - i >  0  Then ActiveWindow.ScrollRow = TopR - i
ElseIf TarB < FixH Then
    i =  0 
    Do
    TarB = TarB + Rows(TopR + i).Height
    i = i +  1 
    Loop While TarB < FixH
    ActiveWindow.ScrollRow = TopR + i
End If

End Sub

Расстояние до краёв устанавливается переменной FixH (здесь FixH = 51, что равно 18 мм).
MinH - это минимальный размер окна. Проверил так: свернул окно до самого не хочу и посмотрел его высоту. У меня в Excel 97 при моих параметрах окна это значение получилось 45.75
Так же, как и в первом примере, макрос для строк. Для столбцов можно переделать легко.
В отличие от первого макроса, второй работает также и с выделенной областью.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удержание активной ячейки в пределах некоторого расстояния до краёв. / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]