改行
エクセルVBAではエクセルよりも操作対象が増加します。エクセルならばセル内の改行とテキストボックス内の改行ぐらいしか改行操作がなかったのですが、VBAともなると、プログラムを記述するコードウィンドウにユーザーとの対話を行うためのメッセージウィンドウなど、改行を行うこと対象が増加します。
さっそくそれぞれの改行方法を確認してみましょう。
VBEコードウィンドウでの改行
VBAは基本的に1ステートメントを1行で記述します。
ワードであれば文字を右端まで入力すれば自動的に文字が折り返され、1行下の左端から文字に文字が書かれていきます。それがVBAになると、どんなに文字を書き続けても折り返されることはなく、永遠と文字が右に続いていきます。永遠と右に文字が書かれていくと、画面が右にスクロールしていくので左の文字は見えなくなっていきます。
プロシージャ名(左端)が見えない
見にくい!
ので改行しますよね。Enterキーをポチポチと。
自動構文チェック機能によりエラーメッセージが表示されることがあります。
エラーが出なかったので、とりあえず実行してしまえ。えい。( ̄ー ̄)っポチッ!
ガーΣ(゚д゚lll)ーン
やや、よく見てみると文字列にダブルクォーテーションが付いていない。文字列を扱う時は「""」で囲まないとイケないんだったな。
修正中にエラーが出まくりましたが、強引に修正
行が変わる毎にエラー
何とか以下のプロシージャが完成しました。
Sub sample1()
MsgBox "本日行われたテスト結果を発表します。"
"国語50点"
"算数60点"
"英語40点"
"3教科の合計は150点"
"学年の平均は200点でした。"
"もっと頑張りましょう。 "
End Sub
「ようし、再度実行だ」。
リセットボタンをクリックし、再度実行ボタンをクリックすると
構文エラー・・・だと
まあ途中のエラー出まくりを無視し続けたのに、正しく動作するほうが異常です。
「1ステートメントを1行で記述」。2行にまたがるのは基本的にNGなんですね。
ただ、1行ではあまりにも見づらい。そこで。
改行する行の最後に「 _」←コレ(半角スペース+半角アンダーバー)を入力するのです。そして改行された下の行の頭には、上の行と連結するための「&」が必要です。
※「&」演算子の前後には半角スペースも必要です。
Sub sample2()
MsgBox "本日行われたテスト結果を発表します。" _
& "国語50点" _
& "算数60点" _
& "英語40点" _
& "3教科の合計は150点" _
& "学年の平均は200点でした。" _
& "もっと頑張りましょう。 "
End Sub
これで一段落。メニューバー[デバッグ]-[VBA Projectのコンパイル]をクリックして構文エラーが表示されないことを確認します。
ワードの「Shift + Enter」と同じ意味合いですね。段落を変えずに改行するという意味合いです。要は「下の行に続きますよ」とVBAに伝えることができるのです。
これでコードウィンドウ内のステートメントを改行することができます。
メッセージボックス内で改行
先程のsample2プロシージャに書かれていたのは、ユーザーにメッセージを伝えるウィンドウを表示できるメッセージボックス関数。プログラムを実行してみると、メッセージは如何でしょう。
改行されていない・・・画像に収まらないぞ
そうなんです。ステートメントを改行しても実行結果に影響はないんです。実行結果に反映させるためには、文字間に「改行せよ」という命令、もしくは「改行文字」を入れてやらないといけないのです。
方法その1:改行命令を使う
う〜ん。語弊がありますね。既に機能名として割り振られている機能を持った言葉、「予約語」というのを使います。EndとかSubとかがソレにあたります。
改行機能を持った予約語は「vbCrLf」です。(入力時は全て小文字でOK)
早速プロシージャを修正してみましょう。
Sub sample3()
MsgBox "本日行われたテスト結果を発表します。" & vbCrLf _
& "国語50点" & vbCrLf _
& "算数60点" & vbCrLf _
& "英語40点" & vbCrLf _
& "3教科の合計は150点" & vbCrLf _
& "学年の平均は200点でした。" & vbCrLf _
& "もっと頑張りましょう。 "
End Sub
予約語は通常の文字列ではないので、文字列を扱うダブルクォーテーションの外に記述し、さらに文字列と予約語を連結させる為に「&」演算子を使い文字列連結を行います。
これを実行すると。
vbCrLfで改行
Sub sample4()
MsgBox "本日行われたテスト結果を発表します。" & vbCrLf & "国語50点" & vbCrLf & "算数60点" & vbCrLf & "英語40点" & vbCrLf & "3教科の合計は150点" & vbCrLf & "学年の平均は200点でした。" & vbCrLf & "もっと頑張りましょう。 "
End Sub
※↑このようにステートメント内で改行せずに1行で書いても結果は同じです。
おぉ、出来た!この勢いでもう1つのお話もしてしまいましょう。
方法その2:改行文字を挿入
さっきの予約語の代わりに改行文字を挿入する方法です。「改行文字?ワードなら文末に変な記号が入るけど、エクセルにもあるの?」という感じですが、あるものはあるんです。
ただソレを見ることもステートメントに表記する事ができないので、Chr関数を使います。
構文:Chr(charcode)
関数名が「Chr」で、引数(括弧内に入力する内容)をキャラコードで指定せよ。という関数です。指定した文字コードに対応する文字を返してくれるそうです。
改行文字の文字コードは「10」です。先程「vbCrLf」としていたところを「Chr(10)」と修正してみましょう。
Sub sample5()
MsgBox "本日行われたテスト結果を発表します。" & Chr(10) _
& "国語50点" & Chr(10) _
& "算数60点" & Chr(10) _
& "英語40点" & Chr(10) _
& "3教科の合計は150点" & Chr(10) _
& "学年の平均は200点でした。" & Chr(10) _
& "もっと頑張りましょう。 "
End Sub
↑このように修正し、実行↓
Chr関数を実行
おぉ、出来ているじゃないか。めでたしめでたし(人´∀`).☆.。.:*・゚
Range.Valueで改行
VBAではワークシートと連携した操作が可能です。例えばセルに書かれた文字列を使い、プログラムの一部で利用するなんてことはよくある操作ですし、逆にVBAの演算結果をセルに出力することもよくあります。
さて、「メッセージボックス内での改行」と「セルに出力する改行」に違いがあるのでしょうか。早速以下のプロシージャを実行してみましょう。
Sub sample6()
Range("a1").Value = "abc" & vbCrLf & "def"
Range("a2").Value = "abc" & Chr(10) & "def"
End Sub
vbCrLfとChr(10)の出力
見た目は・・・何も変わりませんね。数式バーを見ても同じようです。
ということで、出力する時はドチラを使っても良いようです。
続いてはVBAに取り込んでみましょう。セルA1とA2のデータを使ってちょっとしたテストをしてみましょう。
Sub sample7()
Dim A1 As String, A2 As String
A1 = Len(Range("a1").Value)
A2 = Len(Range("a2").Value)
MsgBox "セルA1の文字数は" & A1 & vbCrLf & _
"セルA2の文字数は" & A2
End Sub
Len関数は引数の文字数を教えてくれる関数です。そして結果は
vbCrLfとChr(10)の入力
A1が8文字、A2が7文字です。わざわざこんなテストをしているくらいだから予想できていたかと思いますが、結果はイコールにはなりません。1つのセルには6文字しか見えませんが、「A2のセルはVBAからChr(10)を追加していたから、それが含まれた」と予想が立ちます。しかし「vbCrLfはなぜ8文字」に?
「タイプライター」をご存知でしょうか。キーを押すとカシャカシャと文字を印字してくれた昔なつかしの機械のことです。文字が打ち出される雰囲気は、テレビで「ルパン三世」を見たことがあれば分かるはずw。
実際の動作としては、印字箇所は固定されており、文字を打ったら紙を左に1文字分ズラして次の文字を打つ。という動作をしていたそうです。
ポイントは文字の印字箇所が固定されているということと、紙を動かしているということ。
紙の右端まで文字を打った後に、さて次の行を打つぞ。という時にしなくてはいけないことが2つあります。
印字箇所にある紙は、紙の右端です。ですので紙の左端が印字箇所に来るように紙を動かさないといけないのです。
ただこれだけではいけません。このまま打ち始めては、さっき印字した行に文字を打つことになります。そう、紙送り(上に紙を引っ張る)をしないと打ち出し行が変わらないのです。
さて上記2つの動作は「キャリッジ・リターン(carriage return):行頭復帰」と「ラインフィード(line feed):改行」と呼ばれます。長ったらしい英語が続くので、省略しちゃいましょうか。「cr」と「lf」。あれ?なんだかこの文字どこかで・・・
「vbCrlf」。これだ!vbはVBAの頭文字、そしてCrLfはキャリッジリターンとラインフィードを意味している。つまり「vbCrlf」で改行した場合に文字数が多いのは、「Chr(13)のCr」と「Chr(10)のLf」、2つの文字コードが挿入されたからなのです。
とは言っても運用次第でどちらを使っても問題はないと思います。いずれにせよシステムを作るとなった場合に「予約語かChr関数かで統一しておかないと、セルから文字を拾うのに苦労する」ことが読み取れればOKです。
ちなみにエクセルでセル内の改行を行う「Alt + Enter」は、「Chr(10)」が挿入されます。CrとLfを行う「vbCrLf」は強制改行と呼ばれ、区別して表現することがあります。
最後にもう1つサンプルコードを載せておきます。
今回のお話を検証する時に使用した、「簡易文字コード出力プログラム(半角文字のみ対応)」です。
セルA1のデータの文字コードを表示することができます。
Sub sample8()
Dim i As Integer
Dim moji As String, mCount As Integer
Dim buf As String
moji = Range("a1").Value
buf = "セルA1の文字数は" & Len(moji) & "です。" & vbCrLf & vbCrLf
If Len(moji) = 0 Then End
For mCount = 1 To Len(moji) '文字数ループ
For i = 1 To 256 '文字コードループ
If Chr(i) = Mid(moji, mCount, 1) Then
buf = buf & Mid(moji, mCount, 1) & "のキャラクターコードは[" _
& i & "]" & vbCrLf
Exit For
End If
Next i
Next mCount
MsgBox buf
End Sub
要望があればこんなプログラムを載せていきたいと思っています。