- ベストアンサー
エクセル「折り返して全体を表示」での折り返しの行数取得方法
エクセル2000のVBAで質問します。 A1セルにVLOOKUP関数で文字列が表示されます。 セルの書式設定で「折り返して全体を表示する」にした場合、セル内で折り返されて全部で何行になっているのかを取得する方法はありますか?(VBAでも関数でも) 現在、セルの高さを3行分とっているのですが、関数で表示される文字列の長さによっては3行でおさまらない場合があり、何行になるかがわかれば行数に応じてフォントサイズを変更し、縮小して全体を表示させようと思っています。 当初、セルからはみ出るかどうかがわかれば出来るかと思い、 Sub test01() With Worksheets("Sheet1").Range("A1") h = .Height .Value = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" .WrapText = True .EntireRow.AutoFit h2 = .Height .EntireRow.RowHeight = h End With If h2 > h Then MsgBox "はみ出しちゃった!", , " \(≧▽≦)丿" End If End Sub というマクロを書いてみたのですが、行数がわからないと縮小する割合が求められないので質問いたしました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 最初は、"dummy"シートを使って行高を取得してあげれば、と考えて Sub try() Dim hs(1 To 10) As Single '10行分 Dim h As Single Dim h2 As Single Dim r As Range Dim i As Long Dim x On Error GoTo errHndlr Set r = Worksheets("Sheet1").Range("A1") With Sheets("dummy").Range("A1") '■"dummy"シートを用意 With .Font .Name = r.Font.Name .Size = r.Font.Size End With .ClearContents .EntireRow.AutoFit hs(1) = .RowHeight .WrapText = True For i = 1 To 9 .Value = String(i, vbLf) .EntireRow.AutoFit hs(i + 1) = .RowHeight Next .ClearContents .RowHeight = hs(1) End With With r h = .RowHeight .Value = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" .WrapText = True .EntireRow.AutoFit h2 = .RowHeight .RowHeight = h End With x = Application.Match(h2, hs) If h2 <> hs(x) Then x = x + 1 errHndlr: Set r = Nothing MsgBox CStr(x) End Sub ...なんてしたり、 Justifyメソッドを使って必要行数を出したりしてみましたけど、 最大行高が決まっているのなら、行数は必要なく、 Sub try2() Const h As Single = 36 Dim i As Long With ActiveCell .WrapText = True For i = .Font.Size To 2 Step -1 .EntireRow.AutoFit If .RowHeight <= h Then Exit For .Font.Size = i - 1 Next .RowHeight = h End With End Sub これでいいのでは。
その他の回答 (1)
- keirika
- ベストアンサー率42% (279/658)
回答にならないかも知れませんが・・・・ 改行の数ではなく、文字数で縮小率を決めてはどうでしょうか。
お礼
わたしも最初は文字数で行こうかと考えたのですが、文字列が日本語と英文が入り混じって全角も半角もあるため、断念しました。 ありがとうございました。
お礼
Sub try2 最高です \(*^▽^*)/ 行高は固定ですから何も計算で縮小率を求めなくともAutoFitした結果が行高以下になるまでFont.Sizeを下げていけばいいわけですね。 ありがとうございました!