はじめに
エクセルでは結合したセルの行の高さを自動調整することができない。
そのため、VBAを使って自動調整を行う方法について考えたい。
作成したいマクロのイメージ
結合セルの列幅を取得する。
その列幅で、結合していないセルで自動調整した場合の行の高さを取得する。
取得した行の高さを結合セルに適用する。
この動作をなるべく簡潔なコードで実現したい。
作成したマクロの概要
模索した結果、テキストボックスを使用する方法で作成することにした。
セルとテキストボックスでは、自動調整時の高さに誤差があるが、許容範囲内と判断した。
動作手順
- テキストボックスを用意する
- 結合セルのデータをテキストボックスに入力する
- 結合セルのフォント、フォントサイズをテキストボックスに適用する
- テキストボックスのサイズをテキストに合わせて調整する
- 結合セルの高さとサイズを調整したテキストボックスの高さを比較する
- テキストボックスの高さより結合セルの高さが低い場合、セルの高さを調節する
作成時に考慮したこと
- テキストボックスの上下左右の余白を5で指定し、自動調整時の高さの誤差を少なくした
- 縦に結合しているセルがある場合、1行目以降のセルも調整する対応を考えた
- セルの高さの調整時、セルの高さの最大値(409.5)を超えた場合の対応を考えた
完成したマクロ
MergedCellsRowAutoFit
Public Sub MergedCellsRowAutoFit()
Dim obj As Shape
Dim TargetRange As Range
Dim iRange As Range
Dim AdjustHeight As Double
Application.ScreenUpdating = False
With ActiveSheet
Set obj = .Shapes.AddLabel(msoTextOrientationHorizontal, 100, 100, 100, 100)
Set TargetRange = .Range(.Range("A1"), .Range("A1").SpecialCells(xlCellTypeLastCell))
End With
obj.TextFrame2.MarginTop = 5
obj.TextFrame2.MarginBottom = 5
obj.TextFrame2.MarginLeft = 5
obj.TextFrame2.MarginRight = 5
TargetRange.EntireRow.AutoFit
For Each iRange In TargetRange
If iRange.MergeArea.Count = 1 Then
If iRange.Value <> "" Then
obj.TextFrame2.TextRange.Text = iRange.Value
End If
Else
If iRange.MergeArea.Value2(1, 1) <> "" Then
obj.TextFrame2.TextRange.Text = iRange.MergeArea.Value2(1, 1)
End If
End If
If obj.TextFrame2.TextRange.Text <> "" Then
obj.Width = iRange.MergeArea.Width
obj.TextFrame2.TextRange.Font.Name = iRange.Font.Name
obj.TextFrame2.TextRange.Font.NameFarEast = iRange.Font.Name
obj.TextFrame2.TextRange.Font.Size = iRange.Font.Size
obj.TextFrame2.AutoSize = msoAutoSizeShapeToFitText
If iRange.MergeArea.Height < obj.Height Then
AdjustHeight = iRange.RowHeight + obj.Height - iRange.MergeArea.Height
If AdjustHeight <= 409.5 Then
iRange.RowHeight = AdjustHeight
Else
iRange.RowHeight = 409.5
End If
End If
End If
obj.TextFrame2.TextRange.Text = ""
Next iRange
obj.Delete
Set obj = Nothing
Application.ScreenUpdating = True
End Sub
サンプルファイル保存先: