Чтобы помочь другим людям в будущем, вот краткое изложение моей проблемы и решения.Дополнительный возврат каретки в каждой строке, даже с точкой с запятой в конце оператора print, фактически был вызван строкой пробела, за которой следует символ новой строки (Chr $ (A)) в одном из операторов печати, после того, как такая строка напечатана, затем всепредыдущий и последующий печатный контент будут иметь дополнительный возврат каретки!
Кажется, ошибка в VBA 6 (с Excel 2007), неприятная!
Мой обходной путь должен был заменить новую строкупробелом
Спасибо за неоднократную помощь Тони, которая позволила мне наконец-то разобраться в этом деле.
Вот код, демонстрирующий проблему:
Sub DemoCarriageReturnWillAppearOnAllLines()
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 = " " & Chr$(10)
Print #outFile, offendingText & vbNewLine;
Close #outFile 'Now, every line end has carriage return.
'It must be caused by the offending at the above print out content.
End Sub
После первого «Close #outFile» здесь находится содержимое файла demoCarriageReturn.org:
#+AUTHOR: Yu Shen
Примечание: с редактором, способным показывать возврат каретки как видимый ^ M, возврат каретки отсутствует.
Однако после второго «Close #outFile» здесь находится содержимое того же файла с дополнительным содержимым:
#+AUTHOR: Yu Shen^M
^M
Примечание. Появляются два возврата каретки.Они не предназначены.В частности, в первой строке оператор print был выполнен, а в предыдущем операторе close он был найден без возврата каретки.(Чтобы проиллюстрировать возврат каретки, мне нужно набрать ^ M на веб-странице здесь. Но это в файле распечатки.)
Вот почему я думаю, что это ошибка, поскольку возврат каретки непредназначена.Это нежелательный сюрприз.
Следующий код показывает, что если я отфильтрую символ перевода строки, проблема исчезнет.
Sub DemoCarriageReturnWillNotAppearAtAll()
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 = " " & Chr$(10)
Print #outFile, Replace(offendingText, Chr$(10), "") & vbNewLine;
Close #outFile 'Now, no more carriage return.
'The only change is removing the linefeed character in the second print statement
End Sub
После полного выполнения вышеупомянутой программы действительно нет возврата каретки!
#+AUTHOR: Yu Shen
Это показывает, что комбинация строк пробела, сопровождаемая переводом строки, вызвала ошибку, и удаление перевода строкиможно избежать ошибки
Следующий код дополнительно демонстрирует, что если в конце оператора print нет ошибочной строки, даже без новой строки и точки с запятой, не будет нежелательного возврата каретки!
Sub DemoCarriageReturnWillNotAppearAtAllEvenWithoutNewLineFollowedBySemiColon()
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"
Close #outFile 'At this moment, there is no carriage return
Open filePath For Append As outFile
offendingText = " " & Chr$(10)
Print #outFile, Replace(offendingText, Chr$(10), "")
Close #outFile 'Now, no more carriage return.
'The real change is removing the linefeed character in the second print statement
End Sub
Также в результате вывода:
#+AUTHOR: Yu Shen
Все еще нет раздражающего возврата каретки!
Это показывает, что с использованием символа новой строки, за которым следует точка с запятой в конце оператора печати, не являетсярешение проблемы возврата каретки в каждой строке! Реальное решение состоит в том, чтобы избежать какой-либо строки пробела, за которой следует перевод строки в распечатанном содержимом.
Yu * 1046 *