プロが教えるわが家の防犯対策術!

先日教えて頂きましたマクロを少し改良して
Sub 行調整()
Dim r As Range
For Each r In Range("B26:B60,E26:E60")
If WorksheetFunction.CountIf(r.Resize(, 4), "<>") > 0 Then
r.Rows.AutoFit
Else
r.RowHeight = 27
End If
Next
End Sub
があります。
マクロを実行すると
B26:B60、E26:E60までの行を文字数により自動で調整でき、空白のセルは27間隔になります。
しかし、E45の部分が文字調整が出来ず、B45の文字数での調整になってしまいます。
解決方法を教えてください。
E45はE45とF45とG45とH45もセルが結合されております。
又、表はA46で終わっておりますが、場面によって行セルを挿入して増やしていく可能性があるため、
行セル60まで設定しております。
よろしくお願いいたします。

「エクセルのマクロについて教えてください。」の質問画像

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。
    おっしゃる通り、
    B列 & E列又はE列 & F列を連結させた際に空白であるか否かの判定をすればよいとおもうのですが
    上記のマクロコードをどのように変更したらよいかがわかりません。
    出来るだけ詳しくご指導をお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/01/06 11:44
  • うーん・・・

    結論ですが
    結合されている行セルB、C、Dと行セルEと結合されている行セルE、F、G、H
    の行が空白か否かを判断し、文字がある場合は自動調整、空白の場合はセル27間隔での設定を行セル60まで設定できる方法を教えてください。
    よろしくお願いいたします。

      補足日時:2023/01/06 11:46

A 回答 (2件)

こんにちは


確かB列からE列を含む結合セルの行で 空白ならば行の高さを27に
値が有ればAutoFitだったかと思います 
その為、ループを減らす意味でRange("B26:B60")をループして
列方向にResizeで範囲を広げてCountIfに与えていたかと・・
つまりは、Range("B26:B60")だったと記憶しています

このコードの実行条件としてフォントの大きさで高さに問題がある場合
セルの書式設定で折り返し設定がされ高さをAutoFitしたい場合に
E列を含む結合セルでも正しく機能すると思います

問題の原因
セル内でAlt+Enterで改行コードが挿入されている事が原因と推測します

書式設定と改行コードが両方設定されている場合、入力可能セルの幅に合わせた文字列操作と改行による操作をしなくてはならなくなると思われます
改行コードがない場合 セル巾に合わせフォントサイズにおける最大文字数を1行目として改行コードを入れるなど・・・入力文字校正が崩れる恐れがありますね(上手く説明できない)

Alt+Enterを使用しなければRange("B26:B60")としてそのまま使えると思いますがAlt+Enterを使用している場合は 列巾を留意して折り返しを使わない等が良いと思います

他のデータからセルにVBAなどで取得してセルを調整しているのなら
文字列操作を行って高さ設定のVBA処理をした方が良いかも知れません
 文字列操作はフォントサイズ、1行の最大数、改行の挿入シンボルなどを考える必要があると思います

折り返し設定に影響されていない場合に機能すると思います

Sub 行調整()
Dim r As Range
Dim tmp, n As Integer, i As Integer
For Each r In Range("B26:B60")
If WorksheetFunction.CountIf(r.Resize(, 4), "<>") > 0 Then
r.Rows.AutoFit '折り返し設定とフォントサイズ
For i = 0 To 3
If InStr(r.Offset(, i), vbLf) > 0 Then
If n < UBound(Split(r.Offset(, i), vbLf)) Then
n = UBound(Split(r.Offset(, i), vbLf)) + 1
End If
End If
Next
If n > 0 Then
tmp = r.RowHeight
r.RowHeight = tmp * n '改行コード Alt+Enter
n = 0
End If
Else
r.RowHeight = 27
End If
Next
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
いつも丁寧に教えて頂きましてありがとうございます。
全て解決いたしました。

お礼日時:2023/01/06 13:14

https://learn.microsoft.com/ja-jp/office/vba/api …

E列が結合セル内にあるか否かを判定すれば宜しいのでは?

それと、
>For Each r In Range("B26:B60,E26:E60")
B列・E列と分ける意味があるのでしょうか?
またB・C・D列の結合セルとF・G・H列の結合セルだけがE列と関わると言うなら、上記の条件式に加え、B列 & E列又はE列 & F列を連結させた際に空白であるか否かの判定をすれば宜しいのでは?
結合セルは左上のセル番地が値のアドレスなのでResizeする必要はないと思いますし、指定するのはE列の範囲だけで宜しいかと。

と、初級レベルなジジィは思ったのですが勘違いかもですね。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!