半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■結合セル行高調整

2008-03-31 22:30:00 | VBA Tips
結合セルは、VBAではあまり取り扱いたくないテーマですが、一応。
Excelの仕様で、結合セルでは列幅行高の自動調整はできません。それでも、結合セル範囲が限定されている場合は、比較的簡単なのですが...

Sub pre() 'サンプルシート作成
  Const s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  With Sheets.Add
    With .Range("A1:C5")
      .Columns(1).Formula = "=REPT(""" & s & """,ROW())"
      .Merge across:=True
      .WrapText = True
    End With
  End With
End Sub

(サンプルシート)


Sub try1() 'サンプルシートで実行
  Dim w As Single
  Dim n As Single
  Dim x As Single
  Dim i As Long

  With Range("A1:C5")
    w = .Width
    n = .Columns(1).ColumnWidth
    x = n
    For i = 2 To 3
      x = x + .Columns(i).ColumnWidth
    Next i
    .UnMerge
    With .Item(1)
      .ColumnWidth = x
      Do Until .Width >= w
        .ColumnWidth = .ColumnWidth + 0.1
      Loop
    End With
    .EntireRow.AutoFit
    .Merge across:=True
    .Columns(1).ColumnWidth = n
  End With
End Sub

考え方としては、
 1)微調整用に.MergeArea.Widthを w に記憶。
 2)A1セル幅を変数 n に記憶。
 3)結合範囲であるA1:C1までの幅をそれぞれ足していき変数 x に記憶。
 4)いったん、結合解除。
 5)A1セル幅を記憶しておいた x まで広げる。(結合セル幅にする)
 6)各列余白分でギャップが出るのでちょっと調整。
 7)AutoFit。
 8)再び横方向結合。
 9)A1セル幅を記憶しておいた n に戻す。
という流れでいいかと。

(結果)


結合セル範囲が限定的ではなく混在している場合は、結合セルをActiveにしてショートカットキーなどで任意に実行するようにすれば、手作業よりはラクかもしれません。

Sub try2() '"dummy"シートを作成して、結合セルをActiveにして実行。
  Dim r As Range
  Dim w As Single
  Dim x As Single
  Dim i As Long

  Set r = ActiveCell.MergeArea
  w = r.Width
  For i = 1 To r.Columns.Count
    x = x + r.Columns(i).ColumnWidth
  Next
  With Sheets("dummy").Range("A1")
    With .Font
      .Name = r.Item(1).Font.Name
      .Bold = r.Item(1).Font.Bold
      .Size = r.Item(1).Font.Size
    End With
    .WrapText = True
    .Value = r.Item(1).Value
    .ColumnWidth = x
    Do Until .Width >= w
      .ColumnWidth = .ColumnWidth + 0.1
    Loop
    .EntireRow.AutoFit
    r.RowHeight = .RowHeight / r.Rows.Count
  End With

  Set r = Nothing
End Sub

#(2008.10.09 追記)
#懺悔編あり:D

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■VBA.Replace vs RegExp.Replace | TOP | ■Application.DoubleClickメ... »
最新の画像もっと見る

Recent Entries | VBA Tips