web-dev-qa-db-ja.com

Visual BasicのPrintステートメントで余分な「キャリッジリターン」を回避しますか?

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

1つのテストプログラムでは、ほぼ同じコードで「^ 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"

ただし、Webブラウザに貼り付けてコンテンツを保持できるかどうかはわかりません。 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は何の違いもありませんでした。

さらにご協力いただきありがとうございます。

ゆう

9
Yu Shen

将来、他の人々を助けるために、ここに私の問題と解決策の要約があります。印刷ステートメントの最後にセミコロンがある場合でも、各行の余分なキャリッジリターンは、実際には、印刷ステートメントの1つでスペースの文字列とそれに続く改行(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として表示できるエディターでは、キャリッジリターンは存在しません。

ただし、2番目の「#outFileを閉じる」の後、同じファイルのコンテンツと追加のコンテンツを次に示します。

#+AUTHOR:    Yu Shen^M

^M 

注:2つのキャリッジリターンが表示されます。それらは意図されていません。特に、最初の行では、printステートメントが実行されており、前のcloseステートメントでは、キャリッジリターンなしで検出されました。 (キャリッジリターンを説明するために、ここのWebページに^ 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

それでも迷惑なキャリッジリターンはありません!

これは、printステートメントの最後に改行の後にセミコロンを使用することはすべての行でのキャリッジリターンの問題の解決策ではないことを示しています!実際の解決策は印刷コンテンツでスペースの文字列の後に改行が続くのを避けるため。

ゆう

2
Yu Shen

末尾のセミコロンを使用して、改行を抑制します。

_Print #outFile, "#+TITLE:     Weekly Report";
                                            ^
                                            ^
_

VBステートメントを間違えると、エディターはセミコロンを追加することがよくあります。これにより、改行が出力される場合と出力されない場合があります。

新しい診断ルーチン

問題を引き起こしているセルA1内の文字を知る必要があります。

次のサブルーチンをモジュールの1つに配置します。

_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's Immediate window)に移動し、次のテキストをReturnで入力します。

_DsplInHex(Sheets("Sheet1").range("A1"))
_

この行の下に、_54 65 73 74 31_のようなものが表示されます。これは、セル内の各文字のコード値のリストです。リストの最後に、改行のコードであるA、またはキャリッジリターンのコードであるDが表示されると思います。

セルA1にカーソルを置きます。 _F2_をクリックして編集を選択し、次にBackspaceをクリックして非表示の末尾文字を削除し、次にReturnをクリックして編集を終了します。イミディエイトウィンドウに戻り、カーソルをDsplInHex(Sheets("Sheet1").range("A1"))の末尾に置き、Returnをクリックします。末尾の文字は消えているはずです。

それを試して、報告してください。幸運を。

19
Tony Dallimore