Избегайте дополнительного "возврата каретки" в инструкции Print с Visual Basic?
С Visual Basic я смущен тем, что поведение оператора Print в том, что иногда следующее утверждение: вызовет дополнительный возврат каретки "^M " в конце строки, но иногда это не так. Интересно, почему?
filePath = "d:tmpFAE-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:tmpdemoCarriageReturn.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 не имел никакого значения.
Спасибо за вашу дальнейшую помощь!
ю
2 ответов
используйте точку с запятой, чтобы завершить новую строку:
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
. Трейлинг-символ должен был уйти.
попробуйте и доложите. Удача.
чтобы помочь другим людям в будущем, вот краткое изложение моей проблемы и решения. Дополнительный возврат каретки в каждой строке даже с запятой в конце оператора печати был фактически вызван строкой пространства, за которой следует новая строка(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
после первого "закрыть #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
это показывает, что строка сочетание пробелов, а затем linefeed вызвал ошибку, и удаление linefeed может избежать ошибки.
следующий код дополнительно демонстрирует, что если нет оскорбительной строки, даже без новой строки и запятой в конце инструкции 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
по-прежнему нет раздражающего возврата кареты!
это показывает, что использование новой строки, за которой следует двоеточие в конце инструкции print, не является решением проблемы возврата каретки в каждой строке! реальное решение-избегать любых строка пробела, перевода строки в печати материалам.
ю