それわVBA案件ですね

エクセルVBAネタを書いています

ID文書の翻訳ツールをつくる4 (改行処理コードの修正でハマったおハナシ)

花粉症の薬をもらいに病院行こうと思た土曜日。
祭日で病院がお休みだったと気が付いたら、急に目がかゆくなってきました。


こんちくわ 壁|ω・)ノ


今回の記事は、
さぁ役者はそろった‼ いざ実行・・・・・したら、
まさかの改行処理部分に不具合があって、ハマってしまった。。なおハナシです。




でわいきます ̄▽ ̄)ノ





Contents





前回の記事では・・・

VBAIEを操作してアクセスしたDeepLサイトに翻訳した文字列情報を投げるコードを紹介しました。
コーディングのポイントは以下の通りでした。

  • 下準備として、参照設定 Microsoft Internet Controls, Microsoft Internet Controls を有効にする
  • InternetExplororクラスメンバー を使ってDeepLサイトにアクセスする
  • Edgeの開発者ツールを使ってDeepLサイトの 翻訳元データを書き込む範囲に該当するHTMLコードを特定(lmt_textarea lmt_source_textarea lmt__textarea_base_style クラスで書かれている機能単位(?))
  • HTMLHeaderElementクラスメンバー .GetElemensByClassName()メソッドでそのクラスユニットに翻訳したい文字列情報を代入する(理解不足だけどうまくいった)
  • SendKeysメソッドを使って "Enter" ボタンをクリックする


これで、コピー → クリップボードの中身を取り出し → 改行処理 → DeepLサイトに投げる の機能単位がそろって当初想定していた処理が可能になった・・・・ハズでした。



コピペすると文章の途中に改行が挿入される

このシリーズの最初の記事でも触れましたが、英文PDF文書をコピペすると、文章の途中に改行が挿入されるケースがあります。

 
f:id:FukuCyndiP:20210320193156p:plain

(フリーアクセスジャーナルの一部を利用させていただきました。Plants 2021, 10, 586.)



で、エクセルにペーストすると、

f:id:FukuCyndiP:20210320193232p:plain


の、ようにPDF元文書の改行位置に合わせて、文章の途中に改行コードが挿入された状態でペーストされてきます。
その結果翻訳結果も微妙になるため、この改行コードを半角スペースに変換する以下のコードを最初に作成ました。

Sub 改行をスペースに変換()
  '選択されたセルの文字列にある改行コードを半角スペースに変更する
    Selection.Value = Replace(Selection.Value, Chr(10), " ")  
    'Chr(10)は vbLFでもおK
End Sub


f:id:FukuCyndiP:20210221002705g:plain
(ワークシート上で動作確認:ちゃんと目的通りの結果となる)




ところが・・

そこで必要な機能単位がおおむねそろったところで、以下のようなプロセスで翻訳処理を実行したところ、


PDF文字列をコピー(手作業)
  ↓クリップボード情報を変数に代入
  ↓改行を半角スペースに削除
  ↓処理後の文字列をDeepLサイトの所定の場所に導入
  ↓翻訳を開始




なぜかDeepLサイトに挿入された文書には改行が残っている (・3・)アルエー???

f:id:FukuCyndiP:20210320193351p:plain

と、いうわけでハマりました -ω-)



結局どういうことだったのか

では、何がいけなかったのか。

改行処理コード作成時、コピーした文字列をワークシートにペーストしながら動作確認をしていたのですが、ペースト後のセル文字列とクリップボードの中では改行コードが異なっていたため、動作確認結果が実操作では反映されなかったということでいた。

まず、VBAで利用できる改行コードは以下の通りです。

組み込み定数 Chr No 説明
vbCr Chr(13) キャリッジリターン
vbLf Chr(10) ラインフィード
vbCrLf Chr(13)+Chr(10) キャリッジリターンとラインフィードの組み合わせ
vbNewLine Chr(13) + Chr(10) または Macintosh では Chr(13) プラットフォーム毎で指定された改改行文字



でわ、ワークシートにペースト後と、クリップボードの中身ではどの改行コードが使われていたのか検証すると、


f:id:FukuCyndiP:20210320194230p:plain




<ワークシートにペーストされたもの> ⇒ Chr(10) : vbLf

f:id:FukuCyndiP:20210320194348p:plain




クリップボードの中身> ⇒ Chr(13)とChr(10) : vbCrLf/vbNewline
(先の記事で紹介した Function ClipBordContents() を使いました)



f:id:FukuCyndiP:20210320194310p:plain




このようにクリップボードに格納されているとき採用されていたのはChr(10)とChr(13) の両方(vrCrLf)だったのですね。なので、Chr(10)のみの変更では足りなかったということだったのです。
さらにワークシートのセルに#コピッペすると、なぜか Chr(13) がなくなるという挙動が事をややこしくしたのでした。

というわけで、改行処理コードは以下のように修正して、無事意図した処理を実現できたのでした。

Sub 改行をスペースに変換()
  '選択されたセルの文字列にある改行コードを半角スペースに変更する
    Selection.Value = Replace(Selection.Value, vbCrLf, " ")  
    'vbNewLineでもおk
End Sub 




まとめ

今回の記事では改行コードが挿入されている文字列情報では、それをどのように処理するかによって利用されている改行コードが変化することがあるということを書きました。

改行処理コードを書く際、改行コードが悪さをしているのか最初に探る訳ですが、いくつかあるものの中から vbLf(Chr(10)) が有効だということを確認したうえでのコーディングでした(その時点で vbCrLf は不採用)。

エクセルですから、VBAですから、当然動作確認はワークシート上でやっていたわけですが、まさかセルにペーストすると改行コードが変わるとは夢にも思っていなくってハマる結果となりました。結果的には文字コードを見直すことで事なきを得ましたが、いい経験値を積むことができました。

ワード文書に移した場合やその他の処理でどうなるかは検証できていませんが、そういうことがあるということは頭の隅に置いておいて損はなさそうです。





でわまた~  ̄▽ ̄)ノシ





因みに

vbCrLf は Chr(10)と Chr(13)の組み合わせと書きましたが、修正コードの vbCrLf 部分は以下のように Chr() で置き換えても目的の処理をすることはできませんでした。

  • Chr(10) & Chr(13)
  • Chr(10) & " " & Chr(13)
  • Chr(10) + Chr(13)

イミディエイトに ?ASC(vbCrLf) と聞くと、 13 ダヨー と返ってくるのですが、Chr(13)単独でも同じくダメでした。vbCrLfは vbCrLfでしか表現できないような感じですが、どうなんでしょうね・ω・)