[[20170220201317]] 『改行と縮小を行うマクロ』(ぽんとりん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『改行と縮小を行うマクロ』(ぽんとりん)

セルの書式設定にて折り返して全体を表示するに設定しています。
セルの高さは64ピクセルで固定です。
セル内の文字列は0行〜4行の範囲で様々です。
また、1行の長さも決まっていません。
この条件で、
1.字のサイズは、なるべく大きく表示をしたい。
2.字のサイズを大きくすることで改行しないようにする。
3.字のサイズを大きくすることで、高さ64ピクセルからはみ出ないようにする。

セルはC3からAA33の範囲です。

同様の質問から次のようなマクロを見つけましたが、うまくいきません。

Sub AutoFit()

 '1行の高さ(値は端の行と行の間をクリックしたときに出るピクセルじゃない方の値)
Const cstHeight As Single = 64

 '変数宣言
Dim i As Long

 '折り返して表示 有効化
ActiveCell.WrapText = True

 '指定の高さになるまでフォントサイズを小さくする
For i = ActiveCell.Font.Size To 2 Step -1

 '行の高さを自動調整
ActiveCell.EntireRow.AutoFit

 '行の高さが指定値以下ならループエンド
If ActiveCell.RowHeight <= h Then
 Exit For
 End If

 'フォントサイズを1ポイント小さくする
ActiveCell.Font.Size = i - 1

 Next

 '業の高さを自動調整したままだと微妙に
'ずれるかもしれないので、指定値に設定
ActiveCell.RowHeight = h

 End Sub

ご教授お願いします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 回答ではありません。コードはぱっと見ですけど、

 >セルの高さは64ピクセルで固定です。 

 ピクセル ですか? ポイントではないのですか?
 RowHeight や Font.Size は ポイント単位での指定ですけど?

 >うまくいきません。 

 どのように うまくいかないのか、具体的に説明してくださいね。
 アップされたコードが『本物』だとしたら、モジュール先頭に Option Explict が宣言されていないのでしょうね。
 なので、 If ActiveCell.RowHeight <= h Then といった 未定義の変数が記述されていても、コンパイルエラーにはならない。
 でも h って、Variant型の空白値ですから、比較すること自体が意味がないですね。
 ActiveCell.RowHeight = h に至っては、実行時エラーになるでしょうし。

 Const cstHeight As Single = 64 と宣言してますが、使われていませんね。

 h って、cstHeight のことでしょうか?

 >セル内の文字列は0行〜4行の範囲で様々です。

 この文章も難解です。
 0行というのは文字列が入っていない、つまり空白ということですか?
 また、4行というのは、セル内改行されているということですか?
 セル内改行されていたとしたら、改行コードを取り除いて1行にしたいということですか?
 それとも、改行されていれば、そのまま(改行のまま)文字を大きくしても、
 それによって、元々の改行以上に改行したくない ということですか?

 まぁ、おそらくは 未定義変数 h を使ってしまっていることが不具合の原因でしょう。
 こういった、うっかりミスで、悩むことを避けるためにも、モジュールの先頭に
 Option Explict を記述すべきです。
 VBE画面の ツール --> オプション の編集タブ で 変数の宣言を強制する(R) にチェックを入れておけば
 モジュールを挿入した段階で自動的に記述されます。 是非、是非。

( β) 2017/02/20(月) 20:44


ありがとうございます。
実行すると、字がどんどんと小さくなりセルの高さも小さくなってしまいます。
エラーとはなっていません。

セルの高さは48.00(64ピクセル)と表示されるので64ピクセルだと思っています。
コード内のhは、私も何だろうと思っています。
セル内の文字列は1行から4行でした。
セル内で改行しています。
改行したままで文字を大きくしても元々の改行以上改行したくないということです。

同様のことをしたい方がいて、その回答にあったコードなので、目的が達成されるようなマクロを考えています。

「1.字のサイズは、なるべく大きく表示をしたい。」
と書きましたが、最大文字サイズは14にしたいです。
セル内の文字列の行数をカウントして行数に応じてサイズを変える方法も考えましたが、
=LEN(C3)-LEN(SUBSTITUTE(C3,CHAR(10),))+1
文字を大きくすることで行数が増えてしまうことがあります。

(ぽんとりん) 2017/02/20(月) 21:03


ご指導ありがとうございました。
次のマクロで少し前進しました。
1行の文字が少ないときにはうまくいくのですが、長いときは改行されてしまいはみ出してしまいます。なぜでしょうか。行の自動調整がうまくいってない?

Option Explicit

Sub AutoFit()

 '1行の高さ(値は端の行と行の間をクリックしたときに出るピクセルじゃない方の値)
Const cstHeight As Single = 48

 '変数宣言
Dim i As Long

 '折り返して表示 有効化
ActiveCell.WrapText = True

 '指定の高さになるまでフォントサイズを小さくする
For i = ActiveCell.Font.Size To 2 Step -1

 '行の高さを自動調整
ActiveCell.EntireRow.AutoFit

 '行の高さが指定値以下ならループエンド
If ActiveCell.RowHeight <= cstHeight Then
 Exit For
 End If

 'フォントサイズを1ポイント小さくする
ActiveCell.Font.Size = i - 1

 Next

 '業の高さを自動調整したままだと微妙に
'ずれるかもしれないので、指定値に設定
ActiveCell.RowHeight = cstHeight

 End Sub

(ぽんとりん) 2017/02/20(月) 21:18


うまくいかないセルですが、セルに4行の文字列があります。セル内にカーソルを表示させると4行で表示されますが、ほかのセルをクリックすると改行されて5行になってしまいます。これが原因だと思いますが、回避策はあるでしょうか。画面倍率を変えると4行に収まっているように見える時もありますが、印刷すると6行になっていました。
(ぽんとりん) 2017/02/20(月) 21:27

 こちらで、適当に長い文字列にして再掲されたコードをそのまま動かしましたが、美しく(?)結果が出ます。
 そちらで、最初にセルに入っている状態の文字フォントサイズはいくつにしてありますか?
 また、そちらでうまくいかなかったセル内の文字列は、どんなものだったんでしょうか?

 ただ、場合によっては、うまくいかないことは ありうるのかなと思っています。
 エクセルはあくまで表計算ソフトで、文字列の長さに関する扱いは、きわめて、いいかげん(?)だということは
 定評(?)があります。

 仮に、画面上うまくいったとしても 印刷すると、飛び出すとか かけてしまうなんてことは日常茶飯事ですし。

 完璧に対処するのは難しいかもしれませんよ。

 このような要件を処理するならエクセルではなく、文字操作の専門家であるワードを使うといったことを
 検討されるべきでは?

( β) 2017/02/20(月) 21:40


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.