gpt4 book ai didi

vba - 使用 Visual Basic 避免在 Print 语句中出现额外的 "carriage return"?

转载 作者:行者123 更新时间:2023-12-01 19:17:07 25 4
gpt4 key购买 nike

使用 Visual Basic,我对 Print 语句的行为感到困惑,因为有时以下语句:会在行尾导致额外的回车符“^M”,但有时却不会。我想知道为什么?

filePath = "d:\tmp\FAE-IMM-Report-2012-Week.org"
If Dir(filePath) <> "" Then
Kill filePath
End If
outFile = FreeFile()
Open filePath For Output As outFile
Print #outFile, "#+TITLE: Weekly Report"

会产生

#+TITLE:     Weekly Report^M

虽然我希望没有^M:

#+TITLE:     Weekly Report

在一个测试程序中,几乎相同的代码不会产生“^M”。

请帮忙!非常感谢。

经过进一步的实验,我发现以下建议使用 vbNewline 和“;”打印内容最后,仍然没有解决我的问题。

经过仔细隔离,我发现问题的原因是一个看起来像空格的字符,不完全是空格,后面跟着换行符和回车符。在打印包含有问题字符串的文本之前,没有回车符,但是一旦打印有问题的行,那么包括前一行在内的每一行都会有回车符。

我不确定有问题的字符串到底是什么,因为我的 VBA 技能还不太好。

以下是电子表格单元格中的违规文本的副本:

   "There is something invisible after this visible text 
After the invisible text, then there might be a carriage return $Chr(13) and/or newline"

不过,我不确定粘贴到网络浏览器是否会保留内容。通过粘贴到 emacs,我没有看到回车符,而 emacs 应该显示它,如果有的话。所以我猜想有问题的字符串中没有回车符。

下面是演示问题的程序:

    Sub DemoCarriageReturnWillAppear()
Dim filePath As String
Dim outFile
Dim offendingText
filePath = "d:\tmp\demoCarriageReturn.org"
If Dir(filePath) <> "" Then
Kill filePath
End If
outFile = FreeFile()
Open filePath For Output As outFile
Print #outFile, "#+AUTHOR: Yu Shen" & vbNewLine;
Close #outFile 'At this moment, there is no carriage return
Open filePath For Append As outFile
offendingText = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Print #outFile, offendingText & vbNewLine;
Close #outFile 'Now, every line end has carriage return.
'It must be caused by something offending at the above print out content.
End Sub

以下是上述过程的最终结果:

    #+AUTHOR:    Yu Shen^M

There is something invisible after this visible text
After the invisible text, then there might be a carriage return $Chr(13) or newline^M

注意上面的“^M”是我添加的,因为回车在浏览器中是不可见的。

如果您有兴趣,我可以向您发送包含违规内容的 Excel 文件。

我需要您的帮助来了解如何避免那些有问题的字符串或回车符。(我什至尝试对回车符或新行进行字符串替换,因为我发现一旦我手动删除了导致另一行更改的任何内容,问题就会消失。但是调用 Replace 来替换 vbNewline, Chr$(13),或 vbCrLf 没有任何区别。

感谢您的进一步帮助!

最佳答案

使用尾部分号来取消新行:

Print #outFile, "#+TITLE:     Weekly Report";
^
^

如果您在语句中犯了错误,VB 编辑器通常会添加一个分号,这可以解释为什么有时输出新行,有时不输出。

新的诊断程序

我们需要知道单元格 A1 中导致问题的字符。

将以下子例程放入您的模块之一中。

Public Sub DsplInHex(Stg As String)

Dim Pos As Long

For Pos = 1 To Len(Stg)
Debug.Print Hex(AscW(Mid(Stg, Pos, 1))) & " ";
Next
Debug.Print

End Sub

转到 VB 编辑器的立即窗口并输入以下文本,然后按 Return:

DsplInHex(Sheets("Sheet1").range("A1"))

在此行下方,您应该会看到类似于 54 65 73 74 31 的内容。这是单元格中每个字符的代码值的列表。我希望我们会在列表末尾看到 A(换行代码)或 D(回车代码)。

将光标定位在单元格 A1 中。单击F2 选择编辑,然后单击Backspace 删除不可见的尾随字符,然后单击Return 结束编辑。返回立即窗口,将光标定位到 DsplInHex(Sheets("Sheet1").range("A1")) 的末尾,然后单击 Return。尾随字符应该已经消失。

尝试一下并报告回来。祝你好运。

关于vba - 使用 Visual Basic 避免在 Print 语句中出现额外的 "carriage return"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9444887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com