---topics:印刷時の文字切れ、inputbox---

VBA編其ノ10 行の高さを印刷用に調節する

ハイ。 VBA編もようやく第10回まで来ました。
今回は、VBA編導入でちょこっと触れた、印刷時の文字切れ。 これの対策をするマクロを扱いたいと思います。
でもね、がむしゃらに手を動かす前に…。

文字切れ対策マクロの考え方

まずはイメージ作りから。
マクロを作るときは、事前に「どんなプログラムにするか」というのをイメージできていると、実際プログラムを書く段になって悩むことが少なくなります。 事前の段取りが重要、というのは、どこの世界も同じですね。 もちろん、「こういうことがしたいんだけど、どういう命令を書いて良いかわからない」ということは普通にあります。 僕もたくさんあります。 だけど、事前イメージがないと、そもそも「こういうことがしたいんだけど」という壁の存在にさえ気づけないワケで。 わからないことは調べれば良いけど、そもそも「どこがわからないかもわからない」状態だと、もうお手上げです。 なので、おおまかで良いので概要を思い描いておくことは、とても重要です。

ということで、現状認識からスタートしましょう。
行の高さをダブルクリックで自動調節すると、Excelの画面上はきっちり収まってるんだけど、印刷すると文字切れする、というのが問題点でしたね。 で、自動調節した高さプラス1行分くらいあれば、印刷しても大丈夫な高さになる、ということでした。 もしすべての行の高さが同じで良い(一律「100」とか)なら話はカンタンなのだけど、もちろんそうなふうにはいかないワケで。 それぞれ必要な行の高さはちがうし、しかもその要求される行の高さが「自動調節プラス1行分」というロジックになっている※1

印刷時文字切れ対策マクロのイメージ
※1 印刷時文字切れ対策マクロのイメージ

だから、処理としては、
 1. 行の高さの自動調節を実行
 2. 自動調節した高さを記憶
 3. その高さに、プラス1行分する
という操作を、おしりの行までやれば良いのでは。 こんなふうにイメージすることができます。

もちろん、わたしは今のところ(Excel四十八手の中で)、「行の高さを自動調節する」命令を紹介していません。 だけど、こうやって事前にイメージを作っておくと、「自分がわからないのは行の高さを自動調節する仕方だな…」ってわかるじゃないですか。 であれば、そこをピンポイントで調べれば良いワケで。
前もって見取図を作っておくメリットは、こういうところにあるのです。

文字切れ対策マクロだけのブックを作る

では、マクロを書いていこうかと思うのですが、その前に。 マクロを書くファイルについて。
これまでは、「マクロ練習.xls」というファイルに練習用マクロを書いていましたね。 でも今回は、この「印刷用に行の高さを自動調節するマクロ」専用のブックを作っちゃいましょう! というのも、印刷時の文字切れに悩まされる事態って、いろいろな仕事・いろいろな案件で発生し得ると思うんです。 つまり、いろんな仕事で使いたくなるケースが想定される。 だけど、…みなさん後々たくさんマクロを書いていくと思うんですが、実は、たくさんマクロを書いていると、どこに何のマクロを書いたのか忘れちゃったりするんですよ。 だから、そういうことにならないように、どこに何のマクロがあるのか整理する意味で専用のブックにしておくと、探す手間が省けるよ、ということなのです。 僕の場合はこんなふう↓に※2、マクロを整理しています。

1ブック1マクロ
※2 1ブック1マクロ

基本は1ブック1マクロです。 ひとつのブックの中にひとつのマクロしか書いていません。 それぞれのブックを開くと、マクロの使い方を書いてあったりします※3

例:同一フォルダ内のエクセルを合体するマクロのマニュアル
※3 例:同一フォルダ内のエクセルを合体するマクロのマニュアル

まあ、これはあくまでもワタシの整理の仕方のハナシ、なのですが、とりあえず今回は、専用マクロブックを作る、ということにしましょうか。 なので、新しいブックを作って、適当な名前を付けていただいて、で、VBEから標準モジュールを追加※4してください。 ここにマクロを書きますよ。

標準モジュールの追加の仕方、覚えてますよね?
※4 標準モジュールの追加の仕方、覚えてますよね?

と、いうことで、マクロをこんな感じ↓に書いてみました。

動かすと、こんな感じ↓になります※5 ※6 ※7

例えばこんなサンプルデータに使ってみると…
※5 例えばこんなサンプルデータに使ってみると…
事前に「折り返して表示」にしているか聞いてきて…
※6 事前に「折り返して表示」にしているか聞いてきて…
行の高さが「自動調節+15」に設定される
※7 行の高さが「自動調節+15」に設定される

では、いくつかポイントがあるので、解説。

1. 例によって例のごとく、セル(1, 1)から表が始まっていることが前提となっています。 なので、ループ処理は2行目から始まっています。 また、「1列目に空白が登場するまで処理を続ける」というプログラムになっているので、最左列が埋まっているかをメッセージボックスで確認するようにしました。 なので、「俺が使っている表はセル(2, 2)から始まってるよ」という方は、この辺り各自適宜調節願いたく。

2. 自動調節するメソッドはautofitです。 これで、高さ調節にダブルクリックしたのと同じ効果になります。 今回は、「Rows(i).AutoFit」で自動調節を実行した後、その高さをいったん変数RHautofitに記憶させました。 そうしておいて、その行の高さに「+15」しています。
「+15」としたのは…、Excel2007って初期設定のフォントサイズが11なんだけど、そのフォントサイズ11が収まる高さって(MS Pゴシックで)13.2くらいなんですよね。 なので、少しバッファを見て、「+15」としました。 この辺りも、各自適宜調節願いたく。
で、この処理を、1列目に空白が登場するまでループさせています。

3. 今回、「折り返して表示する」は手動でやることにしました。 というのも、表によっては、折り返して表示したくない列もあるだろうから、です。 なので、その旨はメッセージボックスでアラートを立てることにし、事前に折り返して表示に設定してもらうよう促すことにしました。
もしここもVBAでやりたい、という方は、ループ処理の前にCells.WrapText = Trueを付け加えてください。 「wrap」は…、台所にある「ラップ」、思い出してください。 「くるむ」とか「巻く」とか、そんな意味です。

ということで、こんな感じでマクロを作ってみました。 プログラムの性質上、どう見たって1行で収まるところも問答無用で2行になっちゃうんだけど、まあ、いいじゃない(笑)。 「印刷のときに文字切れをしない」ということに、ワタシは重点を置いたので。 ワタシも仕事でこのマクロよく使うんですが、今のところ、ほとんど文字切れしてないです。 なので、みなさんの方も、もしご自身の仕事に利用できるようであれば、ご検討してみてください。

追加する高さを自分で設定できるようにする

さて。 このままでも良いのですが、ちょっと自由度が低いように思うので、もうちょっと改良してみましょう。 改良ポイントは、上のマクロの「+15」のところ。 ここを好きに設定できると良いな、と思いまして。 なので、インプットボックスというのを使うことにしました。

改良版では、行の高さをいくつ増やすかを聞いてきます※8

行の高さをいくつ増やすか、自分で入力できる
※8 行の高さをいくつ増やすか、自分で入力できる

試しに、「+30」にしてみました※9

30と入力してみた ※7と比較してみよう
※9 30と入力してみた ※7と比較してみよう

ハイ、では解説です。
inputboxを使い、そこで入力された値を変数RHplusに格納する、というのが主な改変点です。 inputboxの使い方は、上にあるとおり、Application.InputBox~というかたちになります。 コイツには引数がいくつかありまして、順に説明しますね。
まずprompt:=、これはインプットボックスの説明文で、必須の引数です。 これ以外の(以下に紹介する)引数は省略可能です。
次のTitle:=は、インプットボックスのタイトルです。
Default:=は、デフォルトの値、つまりある値を最初から入力された状態にしておきたいときに使います。 もちろん、この値を消して、自分の好きな値を入力することができます(てゆうか、そのためのインプットボックスです)。
最後に、Type:=は、インプットボックスに入力可能なデータの型を指定します。 今回は「1」を指定していますが、これは「数値」を意味します。 これはつまり、「このインプットボックスに入力できるのは、数値だけです」ということになります。
Type:=に指定できる値を、まとめておきましょう。

Type:=解説
0 数式
1 数値
2 文字列
4 論理値(True/False)
8 セル参照(Rangeオブジェクト)
16 #N/Aなどのエラー値
64 数値配列

なので、「Type:=1」を指定している今回のケースで文字列を入力しようとすると、怒られます※10

「あああ」と入力しようとしても、できない
※10 「あああ」と入力しようとしても、できない

インプットボックスを使うと、かなり柔軟なマクロが書けるようになるので、使い方、覚えておいてください。

<この機会にちょっとお話>
余談ですが、このインプットボックスで「キャンセル」を選ぶと、変数RHplus=0として進行します。 実は、「キャンセル」を選択すると本来論理値Falseが返るのですが、Type:=1、つまり数値型を指定していることで、最終的に「0」が返るようです。 …「ようです」とあるように、ちょっと自信ないのですが…、たぶん。

インプットボックスの解説はこの辺にしておこうと思うのですが…、あと1コ。 地味な改変点なのですが、最初のマクロで使っていた変数RHautofitを使わないで、Rows(i).RowHeight = Rows(i).RowHeight + RHplusという書き方にしました。 この辺りの書き方は、i = i + 1と同じですね。

最低の行の高さを設定する

もう一点だけ。
このマクロを使っていると、2行のところがあったり7行のところがあったりと、行の高さがバラバラになっちゃいます。 このマクロで処理したExcelを上から順に眺めていくと、突然行の高さがグワッ!と広がっているところが出てきちゃって、「…みっともない」と思う方もいらっしゃるかもしれません。 もちろん、「印刷に耐える行の高さにする」というのが至上命題なのですが、それでも、見た目上、ある程度高さがそろっていると良いなということもあるかもしれません。 なので、「これ以上行の高さが低くならない、ベースとなる高さ」ってのを設定できるようにしてみました。

こちらでは、基本となる行の高さとして例えば「45」(約3行分)を指定すると、それ以下の高さにはならなくなります※11 ※12

2回インプットボックスが出る 最初のインプットボックスに「45」を指定すると…
※11 2回インプットボックスが出る 最初のインプットボックスに「45」を指定すると…
行の高さ「45」以下にならない
※12 行の高さ「45」以下にならない

ちなみに、デフォルト値は「0」にしました。 「0」なら、従来同様「自動調節プラスRHplus」の値になりますので。

 ・
 ・
今回はこのぐらいにしましょうか。
あ、でもね、最後にもう1コ。 マニュアル作っといてほしいんですよ。 空いているシートを利用して※13

マニュアル
※13 マニュアル

こういうのを作っておくと、自分のためにもなるし、また誰か他の人にマクロを使ってもらうときの指針にもなります。 なので、…けっこうマニュアル作りってめんどうだったりするんですが、それでも、親切心を出しておくと、後で良いことがあるかもしれません。
というわけで、今日はこの辺で。

Copyright(C)森田表計算