• ベストアンサー

Excelのセルのフォントサイズを自動調整

Excel97VBAの質問です。 セルの値が長すぎて表示しきれない場合は、フォントサイズを調整したい。 Sub Macro1() With Sheet1 .Columns("A").ColumnWidth = 1 .Range("A1").Value = 1 .Range("A2").Value = 12 .Range("A3").Value = 123 .Range("A4").Value = 1234 End With End Sub この場合、A2~A4の表示が潰れます。 フォントサイズを例えば、 Sub Macro2() .Range("A2").Font.Size = 7 .Range("A3").Font.Size = 5 .Range("A4").Font.Size = 3 End Sub と設定すれば潰れずに値が表示されます。 このようなフォントサイズの最適値を自動的に設定したい。 よろしくご指導お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 2002pon
  • ベストアンサー率48% (42/87)
回答No.1

こんにちは マクロではないのですが、 「セルの書式設定-配置-縮小して全体を表示する」 ではだめなのでしょうか?

その他の回答 (4)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

セルの値は『数値』としています。 そのため、まず、NumberFormatLocal で数値の書式を指定し、指数表示にならなようにしています。 後は、フォントサイズを操作しています。 オーバーフロー?して『#』を含んだ表示ならフォントサイズを小さくしています。 その時のフォントサイズの減少幅は『1』としています。 AutoFitで列幅をいじったり、ShrinkToFitで見せかけの変更ではフォントを操作できないので、 下のマクロでは『Font.Size』のみを使っています。 質問にあるA1~A4を選択状態にして下のマクロを実行してみました。(Excel2000です) フォントや数値によって、質問にあるA2、A3、A4の7、5、3は7、5、4になったりもするようです。 質問ではA1のフォントサイズについて触れられていませんが、A2、A3、A4とは違って、逆にフォントを大きくしていく必要はないでしょうか。この点については質問に触れられていないので操作していません。対応は簡単でしょう。 Sub FontFit()   Dim rg As Range 'セル   For Each rg In Selection     With rg       .NumberFormatLocal = "0"       While Left(.Text, 1) = "#" And .Font.Size > 0         .Font.Size = .Font.Size - 1       Wend     End With   Next End Sub

todo36
質問者

お礼

ありがとうございます。 すばらしいロジックです。 しかし、1行で解決する方法がありました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#2で解答を入れた者です。#1の2002ponさんのご解答を「.WrapText = True」と誤解しました。ご解答者とご質問者にお詫びいたします。また方法がないとしましたが誤りです。 結論は「.ShrinkToFit = True」があるが正解のようです。今後とも勉強します。 ただ半角英字ではフォントサイズが小さくなり過ぎて、使えるのかなと心配しました。

  • 2002pon
  • ベストアンサー率48% (42/87)
回答No.3

#1のものです。補足です。 「セルの書式設定-配置-縮小して全体を表示する」 は、 .ShrinkToFit = True でして、2行には折り返しません。 .WrapText = True は、 「セルの書式設定-配置-折り返して全体を表示する」 です。

todo36
質問者

お礼

ありがとうございます。 .ShrinkToFit = True でOKです。 MergeCellsしても希望どうり動いてくれました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

ご質問と逆のColumnWidthを広げるAutoFitはありますが、 FontSizeを拡大縮小するメソッドはないと思います。 文字数を取得して、Case文などで文字数の段階で何段階かのフォントをセットするより他の方法はないのでは。RangeオブジェクトにAutoFormatメソッドがあるが、書式を自動的に設定 するが、自動の意味が違う。#1の方の解答は、2行以上に おり返すが、Fontの大きさは縮めない。.WrapText = True に当たります。

関連するQ&A

  • エクセルVBAで列幅設定

    A列の幅を、C~F列の幅(同一ではありません)に設定しようと思いました。 ところが Columns("A").ColumnWidth = Range("C1:F1").Width とすると、ColumnWidthとWidthの単位がまったく違うのでエラーになります。 同じ単位で設定するには Columns("A").ColumnWidth = Columns("C").ColumnWidth + Columns("D").ColumnWidth + Columns("E").ColumnWidth + Columns("F").ColumnWidth とするか、 Sub test02() Dim c As Range Dim x As Single For Each c In Range("C1:F1") x = x + c.ColumnWidth Next Columns("A").ColumnWidth = x End Sub などのように手の込んだことをするしか思いつきません。 もっと簡単な方法はないでしょうか?

  • セルには何も入ってないのに、数値型になる理由は?

    セルに何も入ってない状態で Sub Macro() If IsNumeric(Range("a1").Value) = True Then MsgBox "A1には数値が入ってます" End If End Sub を実行すると、 "A1には数値が入ってます" が表示されます。 なぜでしょうか? Sub Macro2() MsgBox TypeName(Range("a1").Value) End Sub を実行すると、stringが返ってきます。

  • Excel VBA 実行時エラー'1004':

     どちらの処理がより高速であるのかを調べるため、以下の2つのVBAを試作致しました。 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub  処が、これらのVBAを実際に動作させ様としますと、どちらの場合においても「Microsoft Visual Basic」ダイアログボックスが開いて 「実行時エラー'1004': 'Range'メソッドは失敗しました:'_Global'オブジェクト」 と表示されてしまいます。  さりとて、 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select ActiveSheet.Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub 或いは Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range(Cells(i, 1)).Value = Rnd Next i Range("B1").Select End Sub 等としましても、今度は 「実行時エラー'1004': アプリケーション定義またはオブジェクト定義のエラーです。」 となってしまいます。  どの部分がどの様に悪いのでしょうか?  そして、どの様に修正すれば良いのでしょうか?  尚、使用しておりますExcelのバージョンはExcel2010です。

  • セルA1からA10の値を表示ができない

    自分の無能さに腹が立ちます。 セルA1からA10の値を表示したいのですがうまくいきません。 Sub Macro6() MsgBox Range("A1:A10").Value End Sub 「型が一致しません」とエラーが出ます。 なぜでしょう?

  • VBA 11行おきにセルの値を1づつ増やす

    セルの値を最終行まで、11行おきに1増やしていく方法をお教えください。 現在1800行あります。 下記の構文を延々と続けるのは、気が遠くなります。 何卒よろしくお願いします。 Private Sub CommandButton1_Click() With Worksheets("○○○”) .Range("A1").Value = "1" .Range("A12").Value = .Range("A1").Value + 1 .Range("A23").Value = .Range("A12").Value + 1 .Range("A34").Value = .Range("A23").Value + 1 .Range("A45").Value = .Range("A34").Value + 1 ・・・・・・・ ・・・・・・・・ End With End Sub

  • エクセルのコメントで自動サイズ調整

    Excel2000です。 ワークシート、 Sheets("Comment")上のデータにもとづき、自動でセルにコメントを挿入するマクロを書きました。 以下で、正常に作動します。 問題は、TextFrameの自動サイズ調整の部分です。 このままだと、文字列の長さに応じて横にだけ長くなってしまうのです。 かといって、文字列の長さはバラバラなのでサイズを固定するわけにもいきません。 コメントの横幅は一定で、縦の長さだけ文字数に応じて自動で変わるような設定はできないものでしょうか? Sheets("Comment")上のデータをAlt+Enterでセル内改行させることにより対応はできますが、もっといい方法がないか質問させていただきました。 Lenで文字数を調べ、これに応じて対応させるのは、全角半角が入り混じったデータなので無理そうです。 宜しくお願い申し上げます。 Sub Comment挿入() Dim sa As String, ad As String, tx As String With Sheets("Comment") For i = 2 To 42 sn = .Cells(i, "A").Value 'シート名 ad = .Cells(i, "B").Value 'セルアドレス tx = .Cells(i, "C").Value 'テキスト With Sheets(sn).Range(ad) .AddComment With .Comment .Visible = False .Text Text:=tx .Shape.Shadow.Visible = msoFalse '影無し .Shape.Fill.ForeColor.SchemeColor = 42 '背景を水色 .Shape.Line.ForeColor.SchemeColor = 10 '枠線を赤 .Shape.TextFrame.Characters.Font.Name = "MS UI Gothic" 'フォント指定 .Shape.TextFrame.Characters.Font.ColorIndex = 3 'フォント色を赤 .Shape.TextFrame.AutoSize = True '自動サイズ調整 End With End With Next i End With End Sub

  • Excelにて、列の幅をマクロで変えるには?

    今、提出用の資料作成にて、 従業員の稼動実績を記載した表部分を隠して A3にかたち良く収まるように印刷できるよう列の調整をしようと マクロの記録を行い、下記のようなプログラムを得ました。 ところが、実行すると("U:AD")の部分は隠れているのですが、 それ以外は全て、列の幅が"20"になってしまいます。 一体どのようにすれば列の幅を記載通りに調整できるのでしょうか? お教え下さい。宜しくお願いします。 * * * * * * * * * * * * * * * * * Sub 稼動実績を隠す() ' ' 稼動実績を隠す Macro ' マクロ記録日 : 2007/9/27 ユーザー名 : ######## ' ' Columns("A:M").Select Range("A2").Activate Selection.ColumnWidth = 8 Columns("N:O").Select Selection.ColumnWidth = 16 Columns("P:P").Select Selection.ColumnWidth = 20 Columns("R:T").Select Selection.ColumnWidth = 20 Columns("U:AD").Select Selection.ColumnWidth = 0 Columns("AE:AF").Select Selection.ColumnWidth = 20 Columns("AG:AG").Select Selection.ColumnWidth = 8 Columns("AH:AH").Select Selection.ColumnWidth = 54 Columns("AI:AP").Select Selection.ColumnWidth = 20 Columns("AQ:AQ").Select Selection.ColumnWidth = 8 Columns("AR:AS").Select Selection.ColumnWidth = 20 Range("A2").Select End Sub

  • 離れた列をvbaで数値で選択するには?

    Sub Macro1() Range("a:c,e:g").Select End Sub を数値にしたいのですが、 Sub Macro2() Range(Columns(1), Columns(3) & ":" & Columns(5), Columns(7)).Select End Sub だと、rangeでコンパイルエラーになります。 http://okwave.jp/qa/q7329478.html を見たのですが、 どうすればいいのかわからないので教えてください。

  • エクセル マクロで値の貼り付けは?

    A1をB1にコピーする場合、 Sub Macro1() ' Macro1 Macro Range("A1").Copy Range("B1") End Sub となりますが、これを貼り付ける時に「値のみ貼り付け」はどうすればよいのでしょうか。

  • EXCELでセルの値が変化したときだけにマクロ実行

    教えてください。 EXCELのA1セルの値が1→0に変化したときにMacro1を実行、0→1に変化したときにMacro2を実行したいと思い、以下のマクロを「シート名タブ右クリック」→「コードの表示」で開く画面に打ちました。 そうしたところキーボードからA1セルに1や0を打ち込むとMacro1・Macro2を実行するのですが。A1セルに関数式を入れ自動で1→0・0→1に変化してもMacro1・Macro2が実行されません。この場合どう修正すればMacroが実行されるようになりますか? ※ちなみにA1セルの関数式はある条件を満たしたら1、そうでない時0という式です。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" And Target.Value = 0 Then Macro1 End If If Target.Address = "$A$1" And Target.Value = 1 Then Macro2 End If End Sub

専門家に質問してみよう