Избегать лишнего «возврата каретки» в операторе Print с помощью Visual Basic? - PullRequest
9 голосов
/ 25 февраля 2012

В 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 возврата каретки или новой строки, так как я обнаружил, что, как только я вручную удалил все, что вызвало изменение другой строки, проблема исчезнет. Но вызов Replace для замены vbNewline, Chr $ (13)или vbCrLf не имеет никакого значения.

Спасибо за вашу помощь!

Yu * ​​1039 *

Ответы [ 2 ]

19 голосов
/ 25 февраля 2012

Используйте завершающую точку с запятой для закрытия новой строки:

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

Редактор VB часто добавляет точку с запятой, если вы допустили ошибку в утверждении, которое могло бы объяснить, почему иногда выводится новая строка, а иногдане.

Новая диагностическая процедура

Нам необходимо знать символ в ячейке A1, который вызывает проблему.

Поместите следующую подпрограмму в одну из вашихmodules.

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 Editor и введите следующий текст, следующий за Return:

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

Под этой строкой вы должны увидеть что-то вроде 54 65 73 74 31,Это список значений кода каждого символа в ячейке.Я ожидаю, что мы увидим A, код перевода строки, или D, код возврата каретки, в конце списка.

Поместите курсор в ячейку A1.Нажмите F2, чтобы выбрать редактирование, затем Backspace, чтобы удалить невидимый завершающий символ, затем Return, чтобы завершить редактирование.Вернитесь в Immediate Window, поместите курсор в конец DsplInHex(Sheets("Sheet1").range("A1")) и нажмите Return.Замыкающий персонаж должен был уйти.

Попробуйте и доложите.Удачи.

2 голосов
/ 04 марта 2012

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

...