按行拆分多行文本框的字符串

时间:2018-02-16 01:01:36

标签: excel vba text split textbox

我想在特定数量的可见行之后拆分文本框的文本。

我发现了一些"允许#34;但他们所有的代码都考虑了" vbCrLf"参数,但我想使用多行文本框的可见行进行拆分。

为了更清楚地理解,请考虑使用以下文本的多行文本框:

"教科书的历史可以追溯到古代历史的文明。例如,古希腊人写了用于教育的文本。现代教科书的根源在于印刷机所实现的标准化。 Johannes Gutenberg本人可能会出版Ars Minor的印刷版,这是Aelius Donatus的拉丁语法教科书。教师和教师使用早期教科书,他们使用这些书作为教学辅助工具(例如,字母书),以及自学的人。"

当我使用Textbox.Linecount函数时,它返回数字6,因为文本框显示六行(这取决于控件的大小),但如果我使用像strText = Split(TextBox.Text, vbCrLf)这样的函数,它将返回1,因为只有一个vbCrLf。但是我需要考虑到控件的可见行,将文本拆分为两个文本框,就像在MS Word的分页符中发生的那样。

如需更好的视觉说明,请查看附图。

实施例 Example

1 个答案:

答案 0 :(得分:0)

首先,我不相信有一种强大而优雅的方法可以做到这一点,但实验很有趣,它可能对你有用。

以下内容会将TextBoxInput的内容拆分为TextBoxPage1TextBoxPage2,以打破PAGED_TEXT_BOX_LINES指定的行号。

它使用文本框本身来检测自然换行符,从而隐含地满足文本框,字体等的大小。

所需的行数被硬编码为常量 - 不这样做需要另外计算文本框的行高(需要根据字体度量和文本框的内部行前导大小进行计算)

它只处理两个"页面"。但是,这个概念可以简单地通过基于TextBoxPage2中最后的文本的剩余部分重复该过程来扩展。

Private Sub CommandButton1_Click()
    Const PAGED_TEXT_BOX_LINES As Integer = 5
    Dim text As String
    Dim i As Long
    Dim textLength As Long
    Dim curLine As Integer
    text = TextBoxInput.text
    textLength = Len(text)
    TextBoxPage1.SetFocus
    'add characters of the input string until the first page textbox
    ' exceeds maximum line count
    For i = 1 To textLength
        TextBoxPage1.text = Mid$(text, 1, i)
        If TextBoxPage1.LineCount > PAGED_TEXT_BOX_LINES Then
            'retreat cursor until we reach previous line, so we can
            ' detect the word that wrapped
            curLine = TextBoxPage1.curLine
            Do While TextBoxPage1.curLine = curLine
                TextBoxPage1.SelStart = TextBoxPage1.SelStart - 1
            Loop
            'the remaining text after the SelStart is what
            ' wrapped, so stop page 1 after SelStart
            TextBoxPage1.text = Mid$(text, 1, TextBoxPage1.SelStart)
            TextBoxPage2.text = Trim$(Mid$(text, TextBoxPage1.SelStart + 1))
            Exit For
        End If
    Next i
End Sub