获取两个VBA文本框以一起滚动

时间:2019-02-01 21:33:44

标签: excel vba textbox scrollbar userform

我有一个宏,该宏产生两个相关数据的多行TextBox(有时长数百行)。这些框始终具有相同数量的文本行,每一行对应于另一个TextBox中的相邻行。我研究了使用两列的ListBox,但决定使用TextBoxes,以便可以根据用户的需要将数据复制/突出显示/选择。

我想这样做,以便如果用户向下滚动,则两个TextBox一起滚动(即,各行保持同步)。

1 个答案:

答案 0 :(得分:1)

经过大量的探索和实验,我发现了!通过增加一个滚动条,我能够使用ScrollBar_Change()事件来调整文本框。在表单上,​​我现在有两个TextBoxes和一个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次点击。有点烦人,但我确定有解决方法。
  • 滚动无法像普通滚动条一样进行。这意味着您可以拖动滚动条,但是直到您放开它才会更新TextBoxes。
  • 如果用户单击TextBox并开始使用箭头键进行导航,则这两个框将不同步。他们将在用户下次单击ScrollBar时重新同步。这是非常有问题的,如果用户尝试选择更多的线比窗口是可见的:因为他们拖他们选择了一个TextBox会滚动,但其他文本框停留在地方