Получить два текстовых поля VBA для прокрутки вместе - PullRequest
0 голосов
/ 02 февраля 2019

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

Я хочу сделать так, чтобы, если пользователь прокручивал вниз, оба текстовых поля прокручивались вместе (т.е. строки оставались синхронизированными).

1 Ответ

0 голосов
/ 02 февраля 2019

После долгих раскопок и экспериментов я понял это!Добавив ScrollBar, я смог использовать событие ScrollBar_Change() для настройки текстовых полей.На моей форме теперь есть два TextBox и объект ScrollBar.Тогда у меня есть несколько необходимых подпрограмм в коде пользовательской формы:

'This constant affects whether the ScrollBar appears or _
   not, as well as some of the movement graphics of the _
   ScrollBar.
'This MUST be reset if the TextBoxes are resized
'I made it a UserForm-level Const because I use it _
   elsewhere, but it could also live in SetUpScrollBar
Private Const TEXTBOX_MAX_LINES_IN_VIEW as Long = 21

Private Sub SetUpScrollBar()
'I call this whenever I show my Userform (happens after a _
   separate macro determines what to put in the TextBoxes). _
   It determines whether the ScrollBar should be shown, and _
   if so, sets the .Max property so it scrolls in accordance _
   to the number of lines in the TextBoxes.

    Dim linesInTextBox as Long

    With Me.TextBox1
        .SetFocus
        linesInTextBox = .LineCount - 1 
        'Need to subtract 1 or you'll get an error _
           when dragging the scroll bar all the way down.
    End With

    'If there are fewer lines than the max viewing area, hide the scroll bar.
    Select Case linesInTextBox > TEXTBOX_MAX_LINES_IN_VIEW
    Case is = True
        ShowScrollBar True
        With Me.ScrollBox
            .Min = 0 'I believe this is the default, but I set it just in case
            .Max = maxLinesInTextBox
            .Value = 0
        End With
    Case is = False
        ShowScrollBar False
    End Select
End Sub

Private Sub ShowScrollBar(show As Boolean)
'A simple way of showing or hiding the scrollbar
    With Me.ScrollBar1
        .Enabled = show
        .Visible = show
    End With
End Sub

Private Sub ScrollBar1_Change()
'When the scrollbar position changes (either by dragging _
   the slider or by clicking it), set the CurLine property _
   of each TextBox to the current ScrollBar value.

    With Me.TextBox1
        'Need to set focus to the box to get or adjust the CurLine property
        .SetFocus
        .CurLine = Me.ScrollBar1.value
    End With

    With Me.TextBox2
        'Need to set focus to the box to get or adjust the CurLine property
        .SetFocus
        .CurLine = Me.ScrollBar1.value
    End With 
End Sub



Это, кажется, работает довольно хорошо для моих целей.Это позволяет мне сохранить преимущества выбора текста / копирования при использовании TextBoxes при одновременной синхронизации данных.

Некоторые проблемы, которые мне еще предстоит решить:

  • Прокрутка работает нормально,но если вы попытаетесь щелкнуть по стрелке (в частности, чтобы перейти в направлении, которое вы только что прокрутили), вы должны нажимать, пока курсор не достигнет верхней части текстовых полей.Для меня это 21 клик.Немного раздражает, но я уверен, что есть обходной путь.
  • Прокрутка не жива как с обычной полосой прокрутки.Это означает, что вы можете перетащить полосу прокрутки, но она не будет обновлять текстовые поля до тех пор, пока вы не отпустите.
  • Если пользователь щелкает текстовый блок и начинает навигацию с помощью клавиш со стрелками, эти два поля исчезнут.синхронизации.Они будут синхронизироваться в следующий раз, когда пользователь щелкнет ScrollBar.Это очень проблематично, если пользователь пытается выделить больше строк, чем видно в окне: один TextBox будет прокручиваться при перетаскивании своего выделения, а другой TextBox остается на месте
...