Избегайте дополнительного "возврата каретки" в инструкции 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, не является решением проблемы возврата каретки в каждой строке! реальное решение-избегать любых строка пробела, перевода строки в печати материалам.

ю