Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
結合セルに於ける行高さのオートフィットについて
投稿日時: 19/11/21 13:57:54
投稿者: バングッド

宜しくお願いいたします。
 
  どなたか、ご教授をお願いいたします。
 
  桁方向に結合したセルの全文字表示のための高さ調整がしたいのです。
 
  仮にX行目の行方向に、1から9桁目まで結合セルとしています。そのセルには文章データを入れます。
  文章データの文字数は任意で、文字数が多くなると、当然文字が隠れて全部表示されません。
  前記結合セルの桁幅は変えたくないのです。(ページ幅にあわせてありますので)
 
  そこで、全文字表示するために結合セルの行高さで調節したいということで、Rows(X)AutoFit試した
  のですがうまく行きませんでした。
 
   Rows(X).AutoFit は、結合しない一つのセルの場合は機能しますが、結合セルには機能しないよう
  です。また、Xの代わりにセルの範囲指定なども試みたのですが駄目でした。
 
  勿論、AutoFit 以外に目的を達成できれば、どんな方法でもいいのですが。 
    
   

回答
投稿日時: 19/11/21 16:22:29
投稿者: WinArrow
投稿者のウェブサイトに移動

↓確認
>仮にX行目の行方向に、1から9桁目まで結合セルとしています。
               ↑
               列ですよね?
 
ヒント
同じ行の空いているセルの列幅を1〜9列の合計列幅に設定し、
結合セルのデータをそのセルに複写する
対象行をAutoFitする
なんてロジックで
 
Dim w As Single, R As Range, x As Long
 
    w = 0
    x = 1
    For Each R In Cells(x, "A").MergeArea
        w = w + R.ColumnWidth
    Next
    With Cells(x, "A").MergeArea.Offset(, 1)
        .ColumnWidth = w
        .WrapText = True
        .Value = Cells(x, "A").Value
        .EntireRow.AutoFit
    End With
End Sub
 

回答
投稿日時: 19/11/21 17:30:49
投稿者: hatch315
メールを送信

ちょっと興味があったので考えてみました。
 
要は結合セルの書式情報を単独セルに移せればAutoFitが機能すると思うので、
あまりスマートではありませんが作成してみました。
F8で1stepずつ進めていくとわかると思います。
 
Public Sub test()
 
       Dim I As Long
       Dim X As Long
       Dim Y As Long
       Dim 幅 As Double
       Dim 高さ As Double
       Dim セル幅 As Double
        
       X = 10 'X行目 とりあえず10行目と仮定
       Y = 10 '10桁目(結合セルの隣のセル)
        
       幅 = 0
       高さ = 0
       セル幅 = ActiveSheet.Cells(X, Y).ColumnWidth
        
      '1から9桁目までの結合セル幅算出
       For I = 1 To 9
           幅 = 幅 + ActiveSheet.Cells(X, I).ColumnWidth
       Next I
 
      '幅セット
       ActiveSheet.Cells(X, Y).ColumnWidth = 幅
        
      '文字列コピー
       ActiveSheet.Cells(X, Y) = ActiveSheet.Cells(X, 1)
        
      '文字列折返し設定
       ActiveSheet.Cells(X, Y).WrapText = ActiveSheet.Cells(X, 1).WrapText
       
      '書式コピー(書式が混在している場合)
       For I = 1 To Len(ActiveSheet.Cells(X, 1))
        
           With ActiveSheet.Cells(X, 1).Characters(I, 1).Font
         
                ActiveSheet.Cells(X, Y).Characters(I, 1).Font.Name = .Name
                ActiveSheet.Cells(X, Y).Characters(I, 1).Font.FontStyle = .FontStyle
                ActiveSheet.Cells(X, Y).Characters(I, 1).Font.Size = .Size
           End With
       Next I
        
      '高さ取得
       ActiveSheet.Rows(X).AutoFit
       高さ = ActiveSheet.Rows(X).RowHeight
       
      'クリア
       ActiveSheet.Cells(X, Y).Clear
        
      'セル幅戻す
       ActiveSheet.Cells(X, Y).ColumnWidth = セル幅
 
      '高さ設定
       ActiveSheet.Rows(X).RowHeight = 高さ
End Sub

回答
投稿日時: 19/11/21 21:54:35
投稿者: simple

昔、このテーマを扱ったときには、見た目を重視していたので、
単純な列幅合計ではなく遊びを入れた微調整をしていた。
というのは、
(a)結合セルの実際の列幅と、
(b)結合セルを構成する各セルのColumnWidthの合計に等しいColumnWdthのセルの列幅
は大分違うんですね。
(a) > (b) となるのですね。
(ColumnWidthでなく、[A10:I10].Widthと[J10].Widthを比較すると分かります。)
これを調整して、見た目が正確になるようにしていました。
 
ただ、今回の話は、印刷したときの表示がどうなるかが判断の中心になるようなので、
印刷してみたら、一行におさまらずはみ出していたということが起きないよう、
保守的な結果をもたらしますから、皆さん提示のものが簡明でよいと思いました。
 
つまり、文字数がちょうど列幅に近いようなケースを考えると、
・表示上は1行で収まっているのに、2行の行高が確保されることがあっても
  それは大きな問題ではない、
・むしろ、印刷上は文字のはみ出しがなく、きれいに収まるのでOK
ということになるようです。

回答
投稿日時: 19/11/22 11:46:59
投稿者: hatch315
メールを送信

simpleさんのおっしゃるとおりColumnWidthを同じにしても改ページプレビューで確認すると、
見た目が合わないですね。ただWidthの値の設定は出来ないようなので、ColumnWidthを調節して
Widthの値を近付ける方法しか思い浮かびませんでした。
 
今回もスマートではありませんが、、、、、
 
Public Sub test()
 
       Dim I As Double
       Dim X As Long
       Dim Y As Long
       Dim 幅 As Double
       Dim 高さ As Double
       Dim セル幅 As Double
       Dim 開始 As Double
       Dim 終了 As Double
       Dim 増分 As Double
        
       X = 10 'X行目 とりあえず10行目と仮定
       Y = 10 '10列目(結合セルの隣のセル)
        
       幅 = 0
       高さ = 0
       セル幅 = ActiveSheet.Cells(X, Y).ColumnWidth
        
      '1から9列目までの結合セル幅算出
       For I = 1 To 9
           幅 = 幅 + ActiveSheet.Cells(X, I).ColumnWidth
       Next I
 
      '幅セット
       ActiveSheet.Cells(X, Y).ColumnWidth = 幅
         
      '文字列コピー
       ActiveSheet.Cells(X, Y) = ActiveSheet.Cells(X, 1)
        
      '文字列折返し設定
       ActiveSheet.Cells(X, Y).WrapText = ActiveSheet.Cells(X, 1).WrapText
       
      '書式コピー(書式が混在している場合)
       For I = 1 To Len(ActiveSheet.Cells(X, 1))
        
           With ActiveSheet.Cells(X, 1).Characters(I, 1).Font
         
                ActiveSheet.Cells(X, Y).Characters(I, 1).Font.Name = .Name
                ActiveSheet.Cells(X, Y).Characters(I, 1).Font.FontStyle = .FontStyle
                ActiveSheet.Cells(X, Y).Characters(I, 1).Font.Size = .Size
           End With
       Next I
                     
      'Widht調整
       開始 = ActiveSheet.Cells(X, Y).Width
       終了 = ActiveSheet.Range(Cells(X, 1), Cells(X, 9)).Width
        
       If 開始 <= 終了 Then
           
          増分 = 0.1
          Do Until 開始 >= 終了
             ActiveSheet.Cells(X, Y).ColumnWidth = ActiveSheet.Cells(X, Y).ColumnWidth + 増分
             開始 = ActiveSheet.Cells(X, Y).Width
          Loop
       
       Else
           
          増分 = -0.1
          Do Until 開始 <= 終了
             ActiveSheet.Cells(X, Y).ColumnWidth = ActiveSheet.Cells(X, Y).ColumnWidth + 増分
             開始 = ActiveSheet.Cells(X, Y).Width
          Loop
      End If
        
      '高さ取得
       ActiveSheet.Rows(X).AutoFit
       高さ = ActiveSheet.Rows(X).RowHeight
       
      'クリア
       ActiveSheet.Cells(X, Y).Clear
        
      'セル幅戻す
       ActiveSheet.Cells(X, Y).ColumnWidth = セル幅
 
      '高さ設定
       ActiveSheet.Rows(X).RowHeight = 高さ
End Sub
 
質問者さんとは別人ですが、よりよい方法があれば、ご教授お願いします。

回答
投稿日時: 19/11/22 23:58:02
投稿者: simple

hatch315さんの手法は妥当なものだと思いました。
 
よりよいものは特にありません。
ご承知のとおり、Width / ColumnWidth の比率は固定値ではありません。
セルの幅の水準そのものに依存します。
そこで、
・ColumnWidthの単純合計の水準において、columnWidthを一定数値(例えば 2)増やしたときに
  Widthがどの程度増加するかを観察し、
・その関係で、目標のWidthにするのにどれだけColumnWidthにすればよいかを割り出した
ように記憶します。(もう10年以上前ですのでねえ。)
 
質問者さんへ:
繰り返しになりますけど質問者さんに向けたコメント。
Excelの表示と印刷の関係は、大分不確実性があります。
つまり、見た目と印刷したものが異なるというのは永遠の課題で、
これを精密にコントロールするのは至難の技です。
 
既に指摘したとおり、「印刷したもの」をベースに考えていると思いますので、
いくつかの案を試行錯誤して、ご自分で確認していくという姿勢が必要です。
できあがりの完璧なものというものはありませんので、それを求めるのではなく、
ご自分でトライして、印刷結果面、表示面で
どこまでなら割り切れるかという検証が不可欠である、とお考え下さい。
印刷精度について、Excelというのはそんな程度のものです。
 
くどくなりましたけど、以上です。私はこの辺で失礼します。

回答
投稿日時: 19/11/25 10:02:27
投稿者: チオチモリン

標準スタイルのフォントサイズが11 且つ ColumnWidth>1 の時
Width→ColumnWidth は
Function TestF(W As Long) As Single
    TestF = Round((1 / 8) * (W - 5), 4)
End Function
で良いかと思います。
 
参考までに

回答
投稿日時: 19/11/25 11:33:42
投稿者: チオチモリン

すいません。間違えました。
Width→ColumnWidth ではなく ピクセル→ColumnWidth でした。
列幅をマウスでドラッグする時にポップアップ表示される数値の関係です。

投稿日時: 19/11/25 14:40:40
投稿者: バングッド

バングッド です
 
 皆様、大変詳しいご回答を頂きまして、誠にありがとうございました。
 
 なるほど、いろいろな思考をされて解決されているのですね。私が発想すらできなかった考え方に
 触れることが出来ました。感動です。