В 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 не имело никакого значения.
Спасибо за дополнительную помощь!
Yu