By トムホワイトジュニア 08年2017月XNUMX日日曜日
投稿: Excel
返信 0
いいね 0
ビュー 3.1K
投票 0
ブック内に 400 行、8 列、160 個以上の結合された範囲を含むワークシートがあり、その外観がめちゃくちゃになってしまいました。 インターネットで VBA Autofit Merged Cells を検索しました。 どの URL もあまり役に立ちません。 この Web サイトのマクロは正しい軌道に乗っていますが、次のとおりです。
1) 結合された 160 個の範囲を手動で特定して入力する必要があります。
結合されたセル範囲の検索を追加しました。
2) 行 1 を使用して、結合されたセルの計算 (セル ZZ1) を実行します。 セル AXNUMX (タイトル) で非常に大きなフォントを使用しているため、マージされた自動調整に必要な高さの計算でエラーが発生します。
データの 1 列右、1 行下のセルを使用します。 (Ctrl+Shift+End、このセルは見つかりません)
3) 結合されたすべてのセルが再計算されるため、結合されたセルと通常のセルの両方を含む XNUMX 行の高さが減り、通常のセルが読み取れなくなります。
必要な結合された高さが既存の高さを超える場合にのみ、行の高さを変更します。
4) 結合範囲内のデータをセル ZZ1 にコピーする方法が正しくありません。結合範囲内のテキストのみに基づいており、結合されたさまざまなセル内のフォント サイズの違いが考慮されていません。
コピー方法を修正しました。
5) マクロが遅い: 私のワークシートでは約 15 秒以上かかります。
画面の更新をオフにして、マクロの終了時に再びオンにすると、これは 2 秒に短縮されます。

別の腹立たしい欠点を見つけることができました。 (マージされた範囲を修正する前に) ワークシートを自動調整すると、いくつかの行が歪んでしまいました。 折り返すように設定されている一部の「標準」セルは、高さが増加し、テキストの下に空白行がある XNUMX 行 (または XNUMX 行) のテキストとして表示されていました。 インターネットで検索すると、Excel がプリンターのフォントに合わせて表示を変更することが原因であることがわかりました。 「回避策」を見つけたので、マクロに追加しました。
列の幅をわずかな割合で増やします。
ワークシート上のすべての行を自動調整します。
結合された範囲に合わせて行の高さを修正します。
列幅を元のサイズに戻します。
これで問題は修正され、空白行は表示されなくなりました。

これですべてが正しくなったと思いましたが、さらに問題が見つかりました。 ワークブックを閉じて再度開くと、空白の行が再び表示されます。 ファイル/オプションを見て、ワークブックを閉じたり開いたりしたときに画面表示が更新されないようにする方法をインターネットで検索しましたが、成功しませんでした。 ワークブックを開いたときにマクロを実行する呼び出しを含む Private Sub Workbook_Open() を「ThisWorkbook」タブに追加する必要がありました。


Option Explicit

Sub Look4Merged()
Dim WSN As String 'ワークシート名
Dim sht As Worksheet '「セット」で使用
Dim LastRow As Long 'データを含むすべての列の最後の行
Dim LastRowCC As Long 'データのある現在の列の最後の行
Dim LastColumn As Integer 'データを含むすべての行の最後の列の数
Dim CurrCol As Integer '現在の列の番号
Dim Letter As String 'CurrCol 数値を文字列に変換します
Dim ILetter As String '最後の列の XNUMX つ右のインデックス列
Dim ICell As String ' frpm データ領域の XNUMX 列右と XNUMX 行下のセル。 必要な結合高さを計算するために使用されます
Dim CRow As Long '現在の行番号
Dim TwN As Long 'エラー処理
Dim TwD As String 'エラー処理
Dim Mgd As Boolean 'セルが結合されているかどうかを True/False テストします
Dim MgdCellAddr As String '結合された範囲を文字列として含みます
Dim MgdCellStart As String '結合されたセル範囲の開始文字。たとえば、列 B で結合されたセルを検査するときに使用されます。列 A で始まり列 B に及ぶ結合されたセルは無視されます (すでに評価されています)。
Dim MgdCellStart1 As String ' MgdCellStart の計算に使用されます
Dim MgdCellStart2 As String ' MgdCellStart の計算に使用されます
Dim OldHeight As Single '結合された範囲内のすべての行の既存の高さ
Dim P1 As Integer 'ループ数/ポインタ
Dim OldWidth As Single '結合された範囲内のセルの既存の幅
Dim NewHeight As Single '結合された範囲内のすべての行の必須の高さ。 OldHeight を超える場合は、個々の行を比例して更新します。
Dim C1 As Integer 'ループ列数
Dim R1 As Long 'ループ行数/ポインター
Dim Tweak As Single '空白行の問題を解決するために列幅を少し増加
範囲としての薄暗いオレンジ
エラー時 GoTo TomsHandler

Application.ScreenUpdating = False '画面の更新が 15 秒だけオフになった場合、2 秒ほど速くなります。
Tweak = 1.04 'すべての行を自動調整する前に列幅を 4% 広げます。
WSN = アクティブシート名
Columns("A:A").EntireRow.Hidden = False

'データを含むワークシート全体で最後のアクティブな行と列を検索します
ActiveSheet.usedRange を使用する場合
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:= xlByColumns、SearchDirection:= xlPrevious).Column
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows、SearchDirection:=xlPrevious).Row
最後に
CurrCol = LastColumn + 1 'つまり最後の列の右側
CurrCol < 27 の場合
ILetter = Chr$(CurrCol + 64) 'インデックス列

ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) ' XNUMX 桁の場合はインデックス列。XNUMX 文字は気にしていません
終了する場合

'Icell はデータの右下にあります。 セルは、結合された範囲に適合するために必要な高さを計算するために使用されます。
ICell = ILetter & LastRow + 1

'空白行の折り返しバグを修正するために、列の幅を少しだけ増やします。
Range("A" & LastRow + 1).Select
C1 = 1 の場合、LastColumn まで
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * 微調整 'バグを治すために列幅を少しだけ増やします
ActiveCell.Offset(0, 1).Range("A1").Select ' セルを XNUMX つ右に移動します
Next

'一部の折り返し行での空白行のバグを防ぐために、列幅を 4% 追加して行を自動調整 (マージされた行を無視)
セル.選択
選択範囲.行.自動フィット
Set sht = Worksheets(WSN) 'データのある列の最後のエントリを検索するために必要です

CurrCol = 1 の場合、LastColumn まで
' 現在の列番号をアルファ (一文字または二文字) に変換します。
CurrCol < 27 の場合
文字 = Chr$(CurrCol + 64)

文字 = Chr$(Int((CurrCol - 1) / 26) + 64)
文字 = 文字 & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
終了する場合
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row '現在の列の最後の行を検索します

CRow = 1 の場合 LastRowCC まで
範囲(文字とCR).選択
Mgd = ActiveCell.MergeCells 'セルは結合された範囲内にありますか
If Mgd = True then 'True の場合は、
「結合された範囲アドレスとは何ですか?」 範囲の先頭の XNUMX 桁または XNUMX 桁を抽出します
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
MgdCellStart2 = "$" の場合
MgdCellStart = MgdCellStart1

MgdCellStart = MgdCellStart1 & MgdCellStart2
終了する場合
If MgdCellStart = Letter then '結合されたセルの最初の列が現在の列と等しいか
シート付き(WSN)
古い幅 = 0
Set oRange = Range(MgdCellAddr) ' oRange を検出された結合範囲に設定します
C1 = 1 の場合、oRange.Columns.Count へ
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'セル範囲の列幅を累積します (4% を追加)
Next
古い高さ = 0
R1 = 1 の場合、oRange.Rows.Count へ
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'セル範囲の既存の行の高さを累積します
Next
oRange.MergeCells = False
.Range(Letter & CRow).Copy Destination:=Range(ICell) '値だけではなく、テキストとフォント サイズをコピーします
.Range(ICell).WrapText = True 'ICell をラップします
.Columns(ILetter).ColumnWidth = OldWidth '既存の範囲を模倣するように ICell を含む列の幅を変更します
.Rows(LastRow + 1).EntireRow.AutoFit 'ICell 行を自動調整し、必要なマージされた高さを測定する準備が整います
oRange.MergeCells = True '結合された範囲を結合された状態にリセットします
oRange.WrapText = True 'とラッピング
'結合された範囲に必要な高さを測定します
NewHeight = .Rows(LastRow + 1).RowHeight
'新しい必要な高さは古い既存の高さを超えていますか?
NewHeight > OldHeight の場合
R1 の場合 = CRow から CRow + oRange.Rows.Count - 1
'範囲に比例して各行を増加します
Range(ILetter & R1).RowHeight = Range(ILetter & R1).RowHeight * NewHeight / OldHeight
Next

'結合されたセルに十分なスペースがある
終了する場合
CRow = CRow + oRange.Rows.Count - 1 '複数行範囲の場合、範囲の 2 行目にドロップダウンし、「次」に到達すると計算を繰り返します。
.Range(ICell).Clear '次の計算の準備ができた ICell をザップします
.Range(ICell).ColumnWidth = 8.1 '列幅を整理します
最後に
終了する場合
終了する場合
Next
Next

'列幅をリセットして 4% 追加を削除 (折り返しエラーを修正するために必要)
Range("A" & LastRow + 1).Select
C1 = 1 の場合、LastColumn まで
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak '列幅を元の値に縮小します
ActiveCell.Offset(0, 1).Range("A1").Select ' XNUMX セル右
Next
Range( "A1")。Select

Application.ScreenUpdating = True '更新をオンに戻します
サブを終了

トムハンドラ:
Application.ScreenUpdating = True '更新をオンに戻します
TwN = エラー番号
TwD = エラーの説明
MsgBox "エラーを処理する必要があります " & TwN & " " & TwD
Force Stop
履歴書
End Subの

Excel がブックを閉じたり再度開いたりしたときに画面表示の外観が変更されないようにすることはできますか?
投稿全体を見る