0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Excel +(Access) VBA 1つのセルにメール用の改行のある文章を入力する

Last updated at Posted at 2022-06-06

改行をそのまま入力してもよいが。。。

A
  B
   Hello World!

日本のメールの文化は明らかに非効率でなぜかアドレス欄に宛先があるのに本文に相手方の肩書を入れるというケースがあります。
これは非効率ですが、相手の住所を確認するためにわざと入れている場合もあります。
もちろんセルで文字列を折り返すに設定して

image.png

としてもよいし、数が少ない場合は有効です。しかしこれはセルがやたら広がってしまい、一覧性にかけます。
また、折り返しを解除すると、改行が消えるときがあります。
そこで、VBAのように以下のように表示できないでしょうか?

"A" & chr(10) & "  B" & chr(10) & "   Hello World!"

この場合はセルで文字列を折り返すを解除してください。

式として評価するには?

Evaluateではない

Application.Evaluate メソッド (Excel)
じつはこれではエラー2029が出て使えません。

AccessのEval

Microsft Access Object Model (現在はVer16)を参照設定します。
次に、エラー判定を入れます。chr(10) で式かどうかを決めます。

Sub test2()
If ActiveCell.Value Like "*chr(10)*" Then ' chr(10)の有無で判定
Debug.Print Eval(ActiveCell.Value)
Else
Debug.Print ActiveCell.Value
End If
End Sub

##Eval EvaluateはIsErrorを使用できない
Application.Eval メソッド (Access)

引数 stringexpr は 、文字列に格納される式である必要があります。 数値式や関数名を含まない文字列だけを Eval 関数に渡すと、実行時エラーが発生します。 たとえば、 Eval("Smith") と指定すると、エラーになります。

このようなプロシージャを作ります。

Sub test3()
If ActiveCell.Value Like "*chr(10)*" Then 'エラーで止まらず、次の処理に進む
Debug.Print Evaluate(ActiveCell.Value)
Else
Debug.Print ActiveCell.Value
End If
If IsError(Evaluate(ActiveCell.Value)) Then 'イミディエイトウィンドウに エラー2015と表示される
Debug.Print Evaluate(ActiveCell.Value)
Else
Debug.Print ActiveCell.Value
End If
If IsError(Eval(ActiveCell.Value)) Then 'エラーメッセージ 2766 で止まる
Debug.Print Eval(ActiveCell.Value)
Else
Debug.Print ActiveCell.Value
End If
End Sub

image.png
という文字しか入っていないセルをアクティベート(単にそこのセルにフォーカス)すると
イミディエイトウィンドウに Hello World!と表示されたあとに
エラー2015が表示されあとの処理は表示されない。
エラーメッセージ2766が表示され中断する。
image.png
つまりIsErrorで文字列かどうかを判定するとあとの処理に進まない。

vbCrlfのような定数は使えない

"A" & vbCrlf & "  B" & chr(10) & "   Hello World!"

これをセルに入れて test3を実行します
image.png
image.png

エラー2029が2つ表示されます。
本来、Widndowsの文字列では改行vbCrlfとchr(10)は同じ意味ですが、Evalはエラーになります。

まとめ

Excelでメールの一部分をセルに入れるときは、そのまま入れても良いが、文字列を折り返して行が高くなる。
VBAのような表記にすると、一行で表示できる。
しかし、それを改行がある文章に変換するには、Accessが必要である。Accessがあれば参照設定してEvalが使える。
ただし、文字列と文字列式が混在しているときはIsError(EVAL())で判定してもエラーでとまる。このため実際の文字列に式があるか、別の方法で判定する。
Evalは、VBの定数は式として評価できないため、vbCrLfで改行を表記するとエラーになる。このため、Windowsの改行はChr(10)で表記する。
色々とややこしいが、これでメールの文章自体を1行にしてセルに入れることができる。
なお、Accessがない場合は改行コードを文字にして、Replaceで変換する方法も考えられる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?