[[20180306160854]] 『セル内で自動で文字サイズ変更(縦幅)』(こり) ページの最後に飛ぶ

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

 

『セル内で自動で文字サイズ変更(縦幅)』(こり)

一つのセル内で折り返して表示をしているのですが、データが多いとそれに伴い下に下にと伸びていきますよね。
横の幅が超えたらではなく、縦の幅が既存のセル高さより超えたら自動で入りきるように文字サイズを調整してくれるようなことをすることは可能なのでしょうか。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


例えば、縦2行分と決めたら、文字入力に応じて、セル幅が伸びていく感じですよね? Excelでは無理だと思いますよ。
(???) 2018/03/06(火) 16:57

 折り返して全体を表示するを折り返した状態で行いたいのではないか?
 対処方法はちょっと思い浮かばないが。
(ねむねむ) 2018/03/06(火) 17:08

打ってる間にねむねむさんと編集かぶったけど、そのまま投稿。

>文字入力に応じて、セル幅が伸びていく感じですよね?
わたしは、質問者さんが「文字サイズを調整」と言ってるのでそうじゃないような気がします。

以下、ついでのコメントです。
私もVBA学習中なので、偉そうなことは言えないですけど、幅にしろ、高さにしろ、オートフィットしたいだけなら、VBAでChangeイベントでも見てやれば比較的簡単にできると思います。
しかし、今回の質問では「文字サイズ」を変えたいと仰っているので、それには入力した内容に改行コードがいくつ含まれているか、セルの幅・高さはいくつなのか、フォントは等角フォントなのかプロポーションフォントなのか、等々を踏まえた上で、文字を何ポイントにすれば収まるかっていう計算が必要になりそうなので、仕掛けが大がかりになるわりには、利が少ないようにおもうんで、質問掲示板で聞くくらいならおすすめしないなぁと・・・個人的には思いました。

VBAの学習としてやるというなら面白いテーマだとは思いますが・・・

なお、マクロは希望してなくて、関数などの一般機能でやる方法は私には思いつきません。
(もこな2) 2018/03/06(火) 17:27


そうか、縦のときと違い、セルサイズはそのままで、フォントサイズで調整ですね。 それでも、問題無く動かすのは難しいですねぇ。

実現案を考えると、文字列が長くなれば文字サイズも小さくしていく。しかし、高さを変えないのだから、1行目と2行目の境である改行位置を、全体の文字数の半分(2行と仮定した場合)くらいに移動していくのですかね? しかも、文字が小さくなって3行入りきるようになったら、改行2つ入れないと…。 マクロがどう頑張っても、最終的にはExcelに表示してもらわないといけないので、この文字列をこのサイズで、という感じですね。

で、もの凄く難しいと考えるのが、フォントサイズを得ても、2進数誤差が大きくて、ぴったり収まらない事が多い点です。プロポーショナルフォントだともっとずれます。テストではうまくいっても、他の文字列だと…という感じになって、大変そう…。

2行の元データを、改行前後で2セルに分けて、セルの書式設定で「縮小して全体を表示」を使う、消極策が良いように思います。
(???) 2018/03/06(火) 17:50


ふと、作業シートというか作業セル使えばできるかも。

(1)Changeイベントで変更のあったセルを掴む

(2)作業セルの幅、高さを掴んだセルと同じにして、セルの高さを覚えておく
掴んだセルの内容を作業セルに入れて、書式を「折り返して全体を表示に変更」「フォント」の種類、サイズも掴んだセルのものに変更。

(3)ターゲットセルと作業セルの高さを比較して、一致する場合、ターゲットセルの書式を「折り返して全体を表示に変更」するだけ。

(4)一致しない場合、作業セルのフォントを1ポイントずつ下げて、ターゲットセルの高さ未満になるポイントを探るのをループで処理する。

って感じでいけるかもしれません。(思いつきの範囲を出ませんが・・・)

(もこな2) 2018/03/06(火) 18:23


出来ているような気がします。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim newVal
    Dim vHigh
    Dim rr As Range
    Dim fSize

    With Target
        If .Count > 1 Then Exit Sub
        If .WrapText = False Then Exit Sub  '折り返し表示されているセルのみを対象
        vHigh = .EntireRow.Columns("AA").Value      'AA列の値で高さ指定をする場合
        If vHigh = 0 Then
            Application.EnableEvents = False    '高さ指定がない場合はAutoFit対応する
            Set rr = Selection
            newVal = .Value
            Application.Undo
            vHigh = .RowHeight      'これは元の縦高さです。
            .Value = newVal
            rr.Select
            Application.EnableEvents = True
        End If
        .EntireRow.AutoFit
        If .RowHeight > vHigh Then                  '文字数が多くなった時
            Do Until .RowHeight <= vHigh
                .Font.Size = .Font.Size / 1.1
                If .Font.Size < 1.1 Then Exit Do    '最小フォントになる前に抜ける
            Loop
        ElseIf .RowHeight <= vHigh Then             '文字数が減った時
            Do Until .RowHeight > vHigh
                .Font.Size = .Font.Size * 1.1
            Loop
            If .RowHeight > vHigh Then
                .Font.Size = .Font.Size / 1.1
            End If
        End If
        .RowHeight = vHigh
        ' ↓ はフォントサイズの最大値を決めています。たぶん規定値であろうシートのラストセルと
        '      していますが、maxサイズとしてくださって結構です。
        fSize = Cells(Rows.Count, Columns.Count).Font.Size
        If .Font.Size > fSize Then .Font.Size = fSize
    End With
End Sub
2018/3/7 9:33 編集
(kazuo) 2018/03/06(火) 23:23

コメント返信:

[ 一覧(最新更新順) ]


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