在Excel VBscript / VBA中插入换行符

3

使用Excel v16

我正在尝试通过替换字符(如波浪符~)来格式化单元格中的文本,使最终结果成为多行。如下所示,这实际上是多行和多列的合并单元格。

这是输入 enter image description here

这是期望的输出 enter image description here

这是我在宏中使用的脚本

Sub FindReplaceAll()
    Sheets("Template").Select
    Range("A34").Select

    iStr = ActiveCell.Value

    For i = 1 To Len(iStr)
        If Mid(iStr, i, 1) = "~" Then
            rtStr = rtStr + vbCr
    Else
        rtStr = rtStr + Mid(iStr, i, 1)
    End If

    Next i

    ActiveCell.Value = rtStr

End Sub

很遗憾,我得到的只是同一行文字,但波浪线被删除了。该单元格使用换行文本格式进行格式化。不确定下一步该怎么做。

3
你的子程序完全可以用一行代码替代:Sheets("template").Range("A34").Value = Replacc(Sheets("template").Range("A34").value, "~", chr(10)) 这将把该单元格的值设置为其本身,并用换行符替换波浪线。如下面的答案中所提到的,你可以使用 vbcrlf 代表回车和换行,如果你想分隔出更细的空间,也可以使用 chr(10) & chr(11) - JNevill
哇,好的。将其作为答案发布,以便我可以选择它作为最佳回复。 - Claus
2个回答

6
你的子程序可以完全用一行代码替换:
sub findReplaceAll()
    Sheets("template").Range("A34").Value = Replace(Sheets("template").Range("A34").value, "~", chr(13)) 
end sub

这将设置该单元格的值为自身,但用换行符替换波浪号。如 @johncoleman 的回答中提到的,您可以使用 vbcrlf 表示回车/换行,或者如果您想要苛刻一些,可以使用 chr(13) & chr(10)

这也可以在工作表公式中完成:

=SUBSTITUTE(A34, "~", CHAR(13))

你打错了,应该是Replace,回车符是chr(13) - Stuart
一个错别字我应该提到 = 替换你有双 cc - Claus
谢谢你们两位。已更新。我总是把那些chr()值搞反了。已更新答案,修复了REPLACC,将chr(10)与chr(13)交换,这样就是回车而不是换行符了。 - JNevill

4
通常在Windows中,如果要换行newlines,你需要使用vbCrLf而不是vbCr。可以使用vbCrLfvbLf将多行字符串写入Excel单元格。后者与使用Alt+Enter从用户界面输入该字符串时的情况相对应。但是,这样做可能会导致问题,如果您打算对该字符串进行其他操作,例如将其写入文本文件或将其复制到剪贴板并粘贴到不同的应用程序中,则无法实现预期的效果。例如,如果在单元格A1中键入a Alt+Enter b,则会直接在b上方显示a,但如果运行以下代码:
Sub test()
    Dim FSO As Object
    Dim f As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set f = FSO.CreateTextFile("C:/programs/test.txt")
    f.Write Range("A1").Value
    f.Close
End Sub

如果你想在记事本中检查文件,换行符不会显示。因此,在VBA中构建多行字符串时,我几乎总是使用vbCrLf

因此,如果你只想简单地显示字符串,请使用chr(10)vbLf,但如果你稍后可能要在其他地方使用这个字符串,请使用vbCrLf


错误的。在Excel单元格中,您需要使用vbLf(Chr(10)),这也是使用UI(Alt+Enter)插入的字符。 vbCrLf之所以有效,仅因为vbCr无效而vbLf正常工作。 - z32a7ul
@z32a7ul 这似乎是一个通用的VBA字符串与Excel单元格的问题。在VBA/VB6中使用普通字符串或者类似Access VBA等情况下,你需要使用 vbCrLf,但你说得对,在Excel单元格中只需要使用 vbLf 就可以了。这可能是一种空间优化。如果您想将这样的多行字符串从Excel文件复制到文本文件中,则似乎会导致复制问题,所以我想这部分取决于您的目的。 - John Coleman
顺便说一句,感谢您的纠正。我编辑了我的帖子以包含您的观点。 - John Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接