セル内の行数で行の高さを変更する方法を教えてください

このQ&Aのポイント
  • Excel VBAを使用して、セル内のテキストの行数に応じて行の高さを自動的に変更する方法を教えてください。
  • 指定したセルのテキストを改行文字で分割し、行数をカウントします。
  • 行数に応じて、セルの行の高さを設定するVBAコードの例をご紹介します。
回答を見る
  • ベストアンサー

セル内の行数で行の高さを変更

セルA1を調べてその行の高さを変更するように下記のとおり 記述したのですが、これを複数行(例えば1~10行)繰り返すようにする(調べるセルは各行のA列)にはどのように記述すればよいでしょうか? ご教示どうぞよろしくお願いします。 Sub 行高変更() Dim TextA As Variant TextA = Range("A1").Text TextA = Split(TextA, vbLf, , vbBinaryCompare) RowA = UBound(TextA) + 1 If RowA = 1 Then Rows(1).RowHeight = 20 ElseIf RowA = 2 Then Rows(1).RowHeight = 30 ElseIf RowA = 3 Then Rows(1).RowHeight = 40 ElseIf RowA = 4 Then Rows(1).RowHeight = 50 ElseIf RowA = 5 Then Rows(1).RowHeight = 60 End If End Sub

  • OGN
  • お礼率100% (17/17)

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

>のところですが、「B2~B10」と限定したい場合は >For~Nextで出来ますでしょうか? 前述したように、 『タテ方向の結合がなく、ヨコ方向の結合列数が同じ』 この条件ならLoop処理しなくても良いです。 >..「B2~B10」と限定.. 結合範囲も含めると、例えば『B2:D10』と限定するという意味でしょうか? Sub test2()   With ActiveSheet.Range("B2:D10")     .UnMerge     .VerticalAlignment = xlTop     .HorizontalAlignment = xlCenterAcrossSelection     .WrapText = True     .EntireRow.AutoFit     .Merge across:=True     .HorizontalAlignment = xlLeft   End With End Sub ヨコ方向の結合列の数が、それぞれの行で違う場合はLoop処理になります。 Sub test3()   Dim r As Range   Application.ScreenUpdating = False   For Each r In ActiveSheet.Range("B2:B10")     With r.MergeArea       .UnMerge       .VerticalAlignment = xlTop       .HorizontalAlignment = xlCenterAcrossSelection       .WrapText = True       .EntireRow.AutoFit       .Merge across:=True       .HorizontalAlignment = xlLeft     End With   Next   Application.ScreenUpdating = True End Sub

OGN
質問者

お礼

ご回答ありがとうございます。 >結合範囲も含めると、例えば『B2:D10』と限定するという意味でしょうか? はい、そういう意味です。 test3は試していませんが、test2で動作確認出来ました。 ただ、結合セルを解除した時点で、セル内文字が折り返し状態になっていると その高さで調整してから、結合になるので、1行でも行の高さが高くなる時があります。 なるときと、ならない時があるので原因がよくわからないのですが。。。 とりあえずtest2を使用したいと思います。 ありがとうございました。

その他の回答 (3)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

規則正しく結合された範囲の場合。 例えば ・タテ方向の結合がなく、複数列のヨコ方向の結合。 ・結合範囲の各行の結合列数は同じ。 こういう条件だったら簡易的に以下のコードでもいけます。 セル内改行なしの「折り返して全体を表示」に対応します。 'B:D列の結合で、1行目からB列最終行まで。 Sub test()   With ActiveSheet     With .Range("D1", .Cells(.Rows.Count, "B").End(xlUp))       .UnMerge       .VerticalAlignment = xlTop       .HorizontalAlignment = xlCenterAcrossSelection       .WrapText = True       .EntireRow.AutoFit       .Merge across:=True       .HorizontalAlignment = xlLeft     End With   End With End Sub

OGN
質問者

お礼

ありがとうございました。

OGN
質問者

補足

ご回答ありがとうございます。 一度結合を解除するんですね。 なるほど! 勉強になります。 ちなみに 「With .Range("D1", .Cells(.Rows.Count, "B").End(xlUp))」 のところですが、「B2~B10」と限定したい場合は For~Nextで出来ますでしょうか?

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 Sub sample() For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) <> "" Then texta = UBound(Split(Cells(i, 1), vbLf)) + 1 Rows(i).RowHeight = 10 * texta + 10 End If Next End Sub

OGN
質問者

お礼

ご回答ありがとうございます。 「For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row」 の「To」のあとは数字でも出来ました。 行高は行数を10倍してそれに10を足すってことですね。 こういうやり方もあるんですね! 大変参考になりました! ありがとうございました。

  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

こういうことでしょうか。 A1~A50までの場合です。 ちなみに高さは自動調整にしています。 Sub test() Set sht = ActiveSheet Set rng = sht.Range("A1:A50") For Each cell In rng cell.EntireRow.AutoFit Next End Sub

OGN
質問者

お礼

「AutoFit」はやはり結合セルでは動作しないみたいでした。 できないことはないみたいですが、大量の記述が必要な様ですので 諦めて、end-uさんに回答いただいたものを参考にしてみます。 ありがとうございました!

OGN
質問者

補足

ご回答ありがとうございます。 うまく動作しました。 今は「A列」を指定していますが、これを「B列以降で結合セル」を指定 すると動作しませんでした。 「AutoFit」は結合セルでは動作しないというのをネットで見たのですが やっぱり無理なのでしょうか? 追加で質問してすいませんが、よろしくお願いします。

関連するQ&A

  • ExcelのVBAで高さの設定

    どなたか教えて下さい。 報告書のフォーマットの作成をしています。 A列からE列までは日付や名前等の内容が入力されています。 F列にはそれに関するコメントが入力されています。 コメントの文字数は、少なければ10字程度、多ければ320文字程度あります。 文字数に合わせて高さを変更させたいです。 その為、以下のような事を行いました。 (1)G列にLEN関数を用いて、文字数を表示 (2)G列の文字数によって高さを変更させるVBAを作成 Sub Macro1() For i = 2 To 100 If Cells(i, 6) < 72 Then Rows(i).RowHeight = 80 ElseIf 73 < Cells(i, 6) < 108 Then Rows(i).RowHeight = 120 ElseIf 109 < Cells(i, 6) < 144 Then Rows(i).RowHeight = 160 ElseIf 145 < Cells(i, 6) < 180 Then Rows(i).RowHeight = 200 ElseIf 181 < Cells(i, 6) < 216 Then Rows(i).RowHeight = 240 ElseIf 217 < Cells(i, 6) < 252 Then Rows(i).RowHeight = 280 ElseIf 253 < Cells(i, 6) < 288 Then Rows(i).RowHeight = 320 ElseIf 289 < Cells(i, 6) < 324 Then Rows(i).RowHeight = 360 End If Next End Sub このVBAに記述間違いがあるようで、 「文字数が72文字以内であれば、高さを80に変更。 文字数が73文字以上で108文字未満であれば、高さは120」 までは認識し・高さの設定を行ってくれますが、108文字以上あっても高さは120になってしまいます。 どなたか教えて下さい。 よろしくお願い致します。

  • エクセルで行を非表示にするとアクティブなセルが・・・

    エクセルで行を非表示にするとアクティブなセル?行?がどこかわからなくなり、マクロでアクティブなセルを移動するときにエラーが出ます。 Sub example() ActiveSheet.Range("D3").Select Do Until ActiveCell = 23 If ActiveCell <> "" Then ActiveCell.Offset(1, 0).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -3).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -6).Select Else: ActiveCell.EntireRow.Select Selection.EntireRow.Hidden = True ActiveCell.Offset(0, -6).Select End If Loop End Sub 一番下のActiveCell.Offset(0, -6).Select にエラーが出るのですが、どうすればセルを移動できるでしょうか?

  • 最終行がわからない場合

    エクセルです。 ・最終行は毎回違ってくるので Cells(Rows.Count, "A").End(xlUp).Row で取得したいです。 ・今は最終行が51行という前提で作業をしています。 ・1行目にはタイトルが入っています。 ・2行目以降には文字が入っています。  今回はテストのため数字を入れました。 最終行が51の場合は ************************************************ Sub test1() Dim i As Long Dim cnt As Long For i = 1 To 10 Call test2 Next End Sub -------------------- Sub test2() Dim str As String If cnt = 0 Or cnt = 42 Then cnt = 2 ElseIf cnt = 2 Then cnt = cnt + 10 ElseIf cnt = 12 Then cnt = cnt + 10 ElseIf cnt = 22 Then cnt = cnt + 10 ElseIf cnt = 32 Then cnt = cnt + 10 End If With Sheets("Sheet1") For myRow = cnt To cnt + 9 str = str & "," & .Cells(myRow, 1) Next myRow End With Debug.Print str End Sub ************************************************ このような方法で、str に10個ずつセルの値を格納できるのですが 最終行が不明の場合はどうすればいいのでしょうか? イミディエイトウインドウに表示される値は ,1,2,3,4,5,6,7,8,9,10 ,11,12,13,14,15,16,17,18,19,20 ,21,22,23,24,25,26,27,28,29,30 ,31,32,33,34,35,36,37,38,39,40 ,41,42,43,44,45,46,47,48,49,50 ,1,2,3,4,5,6,7,8,9,10 ,11,12,13,14,15,16,17,18,19,20 ,21,22,23,24,25,26,27,28,29,30 ,31,32,33,34,35,36,37,38,39,40 ,41,42,43,44,45,46,47,48,49,50 です。 最終行まで来たらまた2行目から取得しなおします。 なのでIf cnt = 0 Or cnt = 42 Thenにしました。 最終行が60だったり65だったりした場合は、strに10個格納できないですが、少ない分には問題ないです。 これで、最終行が100でも200でも対応できるコードを作りたいのですが わかりません。 お知恵を拝借願います。

  • セルが何行なのかをVBAで取得したい

    セルが何行なのかをVBAで取得したいのですが どういうコードにすればいいですか? 例えば、A1セルに a b c と入ってる場合、3行ですが それをVBAで取得するにはどうすればいいですか? Sub test() Dim r As Range Set r = Cells(1, 1) If r.Value Like "*" & Chr(10) & "*" Then MsgBox "改行があります" End If End Sub というコードで改行が有ることは取得できたのですが 何行かまでは取得する方法がわかりません。

  • マクロ 行の高さの変更を繰り返す

    2行目から134行目までの「行の高さ」を1行おきに「4」にしたいのですが 「マクロの記録ボタン」の「相対参照」で2行分を作って、繰り返してみると 結合しているセルが有るせいか、2~134行目全てが「4」になってしまいます 仕方ないので、ネットで調べて書いてみたのですが、 Sub Macro1() Dim i As Integer For i = 2 To 134 Step 2 Rows("i:i").RowHeight = 4 Next i End Sub こんな感じで作ったらエラーが出ました マクロは、かなり久しぶりなので、どう書いたらいいのか教えてやって下さいませ

  • RowHeightで設定できる行の高さは最高いくつ

    エクセルなのですが Sub Macro() Rows(1).RowHeight = 401 End Sub のように RowHeightで設定できる行の高さは最高いくつなのでしょうか? ある一定の数値以上になるとエラーになりますが それがいくつなのかわかりません。

  • 複数のセルでの方法

    現在下記のようなマクロを組んであるのですが、これだと5列目が「0」のときの実行マクロです。 '5列目(工数)が「0」のとき該当する行の高さを「0」にする。 For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1 If Cells(i, 5).Value = "0" Then Rows(i).RowHeight = 0 End If Next 私はこれではなくて、5列目と7列目の同じ行にあるセルに「0」がはいっていたら行の高さを「0」にしたいのです。 そこで私は If Cells(i, 5).Value = "0" Then これを If Cells(i, 5).Value = "0" And Cells(i, 7).Value = "0" Then にしたところエラーが発生しました。 良い方法があればお教えください。 よろしくお願いします。

  • Excel VBAを簡素化したいのですが動きません

    お世話になります。VBA初心者です。 下記TESTは動くのですが、『If myINT= Then』が永遠に続くので簡素化したく 『Rows("myINT : myINT").Select』これを入れてみたのですが全く動きません。 簡素化した記述を教えて下さい。宜しくお願い致します。 Sub TEST() Dim myINT As Integer myINT = ActiveSheet.Cells.SpecialCells(xlLastCell).Row   If myINT = 1 Then    Rows("1:1").Select    ElseIf myINT = 2 Then    Rows("2:2").Select   ElseIf myINT = 3 Then    Rows("3:3").Select   Else MsgBox "TEST" End If End Sub

  • 色のないセルの行削除

    任意の色で塗りつぶされたセルがあって、塗りつぶされたセルが存在する行を削除するマクロ。 Sub 行削除() Dim r As Integer Dim c As Integer For c = ActiveSheet.UsedRange.Columns.Count To 1 Step -1   For r = ActiveSheet.UsedRange.Rows.Count To 1 Step -1     If Cells(r, c).Interior.ColorIndex <> xlNone Then        Rows(r).Delete     End If   Next Next End Sub この逆のことがしたいのですが、わかりません。 ちなみにこのプログラムはそのままC&Pです。 内容もあまり理解できていません。(^_^;) 添付画像の逆に色のついた行だけ残したいです。 よろしくお願いします

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

専門家に質問してみよう