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は何の違いもありませんでした。
さらにご協力いただきありがとうございます。
ゆう
将来、他の人々を助けるために、ここに私の問題と解決策の要約があります。印刷ステートメントの最後にセミコロンがある場合でも、各行の余分なキャリッジリターンは、実際には、印刷ステートメントの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ステートメントの最後に改行の後にセミコロンを使用することはすべての行でのキャリッジリターンの問題の解決策ではないことを示しています!実際の解決策は印刷コンテンツでスペースの文字列の後に改行が続くのを避けるため。
ゆう
末尾のセミコロンを使用して、改行を抑制します。
_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
をクリックします。末尾の文字は消えているはずです。
それを試して、報告してください。幸運を。