• ベストアンサー

エクセルで結合したセルの高さの自動調整方法?

エクセル2000、Win2000です。 いくつかのセルを横に結合し、セル内で「折り返して全体を表示する」にしています。 セルを結合してない場合は、入力文字数が多くなっても行の高さを自動調整にすれば、ちゃんと折り返して全部表示されますが、結合したセルの場合は、自動調整がきかず、 いちいち手動で調整しなくてはいけません。 1.結合セルでも自動調整する方法はないですか? 2.ない場合、VBAで行の高さを変えてみようと思いますが、セル内で折り返しているかどうか、および何行に折り返されているかはどう判別すればいいでしょうか?

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

  • ベストアンサー
回答No.1

自前のコードを書くしかないようです。 一例ですが、参考までに・・・。 '定数定義 Option Explicit Public Const vbShiftMask As Integer = 1 'キーコードマスク定数。(システム定数にないため、ユーザー定義) Public Const vbCtrlMask As Integer = 2 ' 〃 '↓実行時エラーコード。 Public Const pErrOutOfIndex As Long = 9 'インデックスが有効範囲にありません。 Public Const pErrFileNotFnd As Long = 53 'ファイルが見つかりません。 Public Const pErrCreateObj As Long = 429 'CreateObject | GetObject (インスタンスの生成) に失敗。 Public Const pErrPrinterNotAvailable As Long = 2212 'プリンタが無効です。 Public Const pErrReadMdl As Long = 2601 'モジュールの読み取り権限がない。 Public Const pErrUseObj As Long = 3033 'オブジェクト <オブジェクト名> を使用する権限がありません。 Public Const pErrReadObj As Long = 3110 'テーブルまたはクエリー <名前> の定義を読み取る権限がないため、定義を読み取ることができませんでした。 Public Const pErrPrpNotFnd As Long = 3270 'プロパティが見つかりません。 Public Const pErrCantReadJetDb As Long = 3343 'データベースを認識できません。 Public Const pErrMdlNotFnd As Long = &H8007007E '指定されたモジュールが見つかりません。 Public Const xlsMaxColumns As Long = &H100& 'Excelシートで利用可能な最大列数。 Public Const xlsMaxRows As Long = &H10000 ' 〃 最大行数。 'Excel列座標変換ユーティリティ Option Explicit Public Function GetXlsPosYStr(ByVal lngPos As Long) As String 'Excelの横座標数値(1~256)を文字列("A" ~ "IV")に変換。 Select Case lngPos Case 1 To 26 GetXlsPosYStr = Chr$(lngPos + 64) Case 27 To xlsMaxColumns GetXlsPosYStr = Chr$((lngPos - 1) \ 26 + 64) & Chr$((lngPos - 1) Mod 26 + 65) Case Else Err.Raise pErrOutOfIndex End Select End Function Public Function GetXlsPosYLong(ByVal strPos As String) As Long 'Excelの横座標文字列("A" ~ "IV")を数値(1~256)に変換。 Dim lngPos As Long strPos = UCase$(Trim$(strPos)) Select Case Len(strPos) Case 1 lngPos = Asc(strPos) - 64 Case 2 lngPos = (Asc(Left$(strPos, 1)) - 64) * 26 + Asc(Right$(strPos, 1)) - 64 If lngPos > xlsMaxColumns Then Err.Raise pErrOutOfIndex End If Case Else Err.Raise pErrOutOfIndex End Select GetXlsPosYLong = lngPos End Function 'AutoFitの拡張版。(結合セルに対応) Option Explicit Public Enum AutoFitDirection enmColumn '列 enmRow '行 End Enum Public Function AutoFitEx( _ ByRef wksht As Excel.Worksheet, _ ByRef rngTarget As Excel.Range, _ Optional ByVal Direction As AutoFitDirection = enmRow, _ Optional ByVal keepDefault As Boolean = True) Dim hAlign As Excel.Constants Dim vAlign As Excel.Constants Dim strAddress As String Dim strTmp As String Dim strStClmn As String Dim strEdClmn As String Dim lngStClmn As Long Dim lngEdClmn As Long Dim lngStRow As Long Dim lngEdRow As Long Dim lngPos As Long Dim i As Long Dim clmnWdthSum As Double Dim StClmnWdth As Double Dim orgClmnWdth As Double Dim RowHghtSum As Double Dim StRowHght As Double Dim orgRowHght As Double hAlign = rngTarget.HorizontalAlignment vAlign = rngTarget.VerticalAlignment strAddress = rngTarget.MergeArea.Address(ReferenceStyle:=xlA1) strStClmn = Mid$(strAddress, 2) strTmp = Mid$(strStClmn, InStr(strStClmn, "$") + 1) lngPos = InStr(strTmp, ":") If lngPos <> 0 Then lngStRow = CLng(Left$(strTmp, lngPos - 1)) lngEdRow = CLng(Mid$(strAddress, InStrRev(strAddress, "$") + 1)) Else lngStRow = CLng(Mid$(strStClmn, InStr(strStClmn, "$") + 1)) lngEdRow = lngStRow End If strStClmn = Left$(strStClmn, InStr(strStClmn, "$") - 1) strEdClmn = Mid$(strAddress, InStr(strAddress, ":") + 2) strEdClmn = Left$(strEdClmn, InStr(strEdClmn, "$") - 1) lngStClmn = GetXlsPosYLong(strStClmn) lngEdClmn = GetXlsPosYLong(strEdClmn) rngTarget.UnMerge With wksht If Direction = enmRow Then '高さの自動調整 StClmnWdth = .Columns(lngStClmn).ColumnWidth clmnWdthSum = 0 For i = lngStClmn To lngEdClmn clmnWdthSum = clmnWdthSum + .Columns(i).ColumnWidth Next i .Columns(lngStClmn).ColumnWidth = clmnWdthSum orgRowHght = .Rows(lngStRow).RowHeight .Rows(lngStRow).AutoFit If keepDefault Then If .Rows(lngStRow).RowHeight < orgRowHght Then .Rows(lngStRow).RowHeight = orgRowHght End If End If .Columns(lngStClmn).ColumnWidth = StClmnWdth Else '幅の自動調整 StRowHght = .Rows(lngStRow).RowHeight RowHghtSum = 0 For i = lngStRow To lngEdRow RowHghtSum = RowHghtSum + .Rows(i).RowHeight Next i .Rows(lngStRow).RowHeight = RowHghtSum orgClmnWdth = .Columns(lngStClmn).ColumnWidth .Columns(lngStClmn).AutoFit If keepDefault Then If .Columns(lngStClmn).ColumnWidth < orgClmnWdth Then .Columns(lngStClmn).ColumnWidth = orgClmnWdth End If End If .Rows(lngStRow).RowHeight = StRowHght End If With .Range(strAddress) .Merge .HorizontalAlignment = hAlign .VerticalAlignment = vAlign End With End With End Function

merlionXX
質問者

お礼

さっそくありがとうございます。 ものすごい大仕掛けが必要になりますねえ!!! 目が回りそうです(笑) 勉強させていただきます。 ありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

merlionX さん、こんにちは。 ちょっと考えてみました。 以下のプロシージャは単独で動くものですが、この下にある、Selection を、Target[正しくは、With Target.Cells(1) ] にして、イベント(Worksheet_Change())に入れてみたらいかがでしょうか?一応、これは、フォント9~12 の書式スタイルで検証してみました。 ただ、確か、Excelでは、印刷する場合に、調整高が連続した行にあると、セルの中の最後の行が隠れてしまうという現象がありますので、「縦の調整」に、数字を入れて調整してみてください。だいたい、調整高の余分として、そのフォントの高さの1~1.5倍(例:フォント11で、13.5) ぐらいを入れてみてください。 'フォントの高さの定数 Private Const Font12Ht = 14.25 Private Const Font11Ht = 13.5 Private Const Font10Ht = 12 Private Const font9Ht = 11.25 Sub MergeCells_Alignment()  Dim myStr As String  Dim myStrLength As Long  Dim lineHeight As Double  Dim ea As Variant  Dim i As Long  Dim lineStrNum As Long  Dim wdth As Long  '幅の調整  Const WidthAdjustment As Double = 1.5  '縦の調整  Const HightAdjustment As Double = 0 'フォント高×1.0~1.5  '  With Selection.Cells(1)  If .MergeCells = False Then Exit Sub   For i = 1 To .MergeArea.Count    wdth = wdth + Int(.Offset(, i - 1).ColumnWidth + WidthAdjustment)   Next i   For Each ea In .MergeArea.Value    myStr = myStr & ea   Next   myStrLength = LenB(StrConv(myStr, vbFromUnicode))   lineStrNum = myStrLength / wdth   Select Case .Font.Size    Case 12     lineHeight = Font12Ht    Case 11     lineHeight = Font11Ht    Case 10     lineHeight = Font10Ht    Case 9     lineHeight = font9Ht   End Select   .RowHeight = lineHeight * Int(lineStrNum) + HightAdjustment   .HorizontalAlignment = xlLeft   .VerticalAlignment = xlTop   .WrapText = True  End With End Sub

merlionXX
質問者

お礼

いつもありがとうございます。 かなりの大仕掛けが必要になりますねえ。 勉強させていただきます。 ありがとうございました。

関連するQ&A

  • 【エクセル】 結合セルで行の高さを自動調整する方法

    通常、セルに多数の文字を書き込んでも列幅を変更 したくないときには、セルの書式設定で 「折り返して全体を表示する」 としておけば、列幅を広くすることなく、行の高さ が自動調整されます。 これを、結合セルでやろうとするとどうしても 自動調整してくれません。 結合セルでも、行の自動調整機能が働く方法を 教えてください。 よろしくお願いします。

  • エクセル:結合したセルの高さ自動設定

    EXCEL2000で結合したセルの高さ自動設定がききません。 結合したセルは ・文字の配置 横位置:左詰 縦位置:上詰め ・文字の制御 折り返して全体を表示 セルを結合する になっています。 セルを5つ結合して、その結合したセルの横幅を文字列が 越えたら次の行にいって、かつその折り返し部分が見えるように したいんです。 結合していない単体のセルの場合は、折り返され、かつ 折り返し部分が見えるように高さが変わります。 結合したセルでの高さ自動設定はできないのでしょうか? 教えてください。よろしくお願いします。

  • EXCELで統合したセルの高さ自動調整ができない

    EXCELで質問です。 統合したセルに対して、セルの高さの自動調整がききません。 なぜでしょう。 再現方法 1)セルに大幅にはみだすくらい文字を入力します。 2)下のセルと統合します。 3)折り返して全体を表示するをチェックします。 4)書式>行>自動調整をしても、2行分しか表示されず、3行目以降は手動でセルを広げないと見えません。 3行分セルを統合すると3行まで、4行だと4行分までしか表示されません。 仕様でしょうか。

  • セルの結合と折り返し表示の操作を簡単に

    エクセルで横に並ぶセルを結合して、さらに入力してある文字を折り返し全体を表示する作業をよく使っています。この場合結合するセルを選択して右クリックで、セルの書式設定を選び、1折り返し全体を表示する、2セルを結合するの1と2のそれぞれにチェックを入れOKをクリックしています。またこの場合行の高さを調整することが必要なので行の番号のところでドラッグして調整しています。高さの調整だけはソフトによっては文字の入力済みの場合自動的に調整してくれるものもありますが現在使用中のものはそれが出来ません。この操作を結合するセルを選択した後もっと簡単にショートカットなどを使い操作する方法がないか教えて下さい。

  • Excelで結合されたセルの幅を自動調整したい

    セルを結合して、文章を入力し印刷しようとする 文章が1000字というような長い場合、途中から切れてします。 過去の質問にあったマクロを引用してみましたが、ある程度は自動調整してくれましたが、 全体を表示できません。 マクロ記述はわかりません。是非、知恵をお貸しください EXCELL2003を使用しています

  • excelで行の高さを自動調整したのですが・・・。

    こんにちは。mininiと申します。 早速ですが、上記質問のタイトルの件で困っています。 「折り返して全体を表示する」にしてから 自動調整したい行を選択して、書式→行→自動調整をしてみたのですが はみ出たままなのです(全体が画面に表示せれないのです)。 1列に2000行のデータを扱っており、1つ1つのセルの文字数はまちまちなので (妥協して)手動で調整するのもな~と、だらけておりました。。。 ちなみにバージョンはexcel97です。 皆様のお知恵をお借りしたいです。 よろしくお願いします。

  • エクセル 自動セル結合

    エクセルについての質問です。 1つのセルにずっと文章を打ち込んでいき、そのセルをこえる長さの文章になったとき、その文全てが表示されるよう自動的にセルを結合していくようにするには、どのような設定をすればいいのですか? いちいち「結合して中央揃え」をしなければならず、困っています。 ご教授よろしくお願いします。

  • 【エクセル】自動で、同じ内容のセルを結合させたい。

    ある縦1列に(A01が5行、A02が8行・・・ G32が4行といったように)規則的に 並んでいる複数の分類番号があるとして、 これら同じ分類番号を見やすくするために、 今は一つ一つ手動でセル結合しています。 もし、自動的に、同じ分類番号を一つのセルに 結合してくれるようなやり方があったら・・・ と思うのですが、何かお知恵を拝借できないでしょうか?

  • エクセルの長文が入った結合セルを自動調整する方法

    金額等を書いた見積書作成でエクセルを利用しています。 症状などの症状を記入している結合されたセルの部分があるのですが、かなりの長文が入っている場合に、一番左の行の自動調節目的で行と行の間の線をダブルクリックしても、その長文の頭の1行部分しか表示できません。 その下の長文部分もきれいに表示してくれるような機能はエクセルにありますでしょうか? どうぞ、ご教示の程よろしくお願いします。

  • エクセルで、行の高さの自動調整が出来ません

    セルの書式設定で、 折り返して表示させた場合や、 Alt+Enterキーで改行させた場合、 行の自動調整が出来ません。 正確に言えば出来る時と出来ない時があります。 セルの結合などは行っていなくてもそうなります。 OSはMeです。 ご存知の方、教えてくださいね。

専門家に質問してみよう