フィルターで非表示となっている行を無視して、列幅を自動調整する
Excelで列幅をセルの文字列に合わせて自動調整するには、列番号の境界線をダブルクリックすれば、自動調整されます。
なお、フィルターで一部の行が非表示になっている場合は、列番を自動調整したときに、下記のように非表示になっている行も含めて列幅が調整されます。
長い文字が入力された行が非表示の場合に、最長の文字が入力されたセルに合わせて自動調整されるため、上記画像のように余分な幅が生まれます。
フィルター箇所のみを印刷等で横幅1ページで印刷する場合に、なるべく文字が小さくならないようにしたいときは、この余白は余計です。かと言って、自分で幅を調整するのは面倒・・・。
そういうときは2つの対応策があります。
1.可視セルのみ選択状態にしてセルの書式から列幅を自動調整する
列幅を調整したいセルを範囲選択します。
そのままでは非表示の箇所も含みますので、セルを範囲選択した状態でALT+;で可視セルのみを選択状態にします。
その上で、[ホーム]タブの[セル]グループにある[書式]をクリックして[列の幅の自動調整]をクリックします。
そうすると、非表示のセルは無視して、列幅が自動調整されました。(上記画像はすでに実行後の状態です。)
2.ExcelVBAで列幅を自動調整する
列幅を自動調整したい列を下記のように選択して、マクロを実行します。
そうすると、フィルターで非表示となっている行を無視して自動調整されます。(下記の画像はすでに実行後の状態です。)
コードは下記の通りです。
Sub sb非表示セルを無視して列幅自動調整()
Dim i As Long
For i = 1 To Selection.Columns.count
Call sb非表示セルを無視して列幅自動調整サブ(i)
Next i
End Sub
Sub sb非表示セルを無視して列幅自動調整サブ(columnIndex As Long)
'用途:選択列の幅を表示されている行の最大列幅で自動調整(非フィルター非表示を考慮しない)
Dim SelectedColumn As Range
' アクティブシートの使用範囲に基づいて範囲を設定
Set SelectedColumn = Intersect(Selection.Columns(columnIndex), ActiveSheet.usedRange)
Dim TargetRng As Range
Dim MaximumColumnWidth As Double
MaximumColumnWidth = 0 ' 最大列幅を初期化子※Double型としているのは、列幅が小数点以下まで取得可能なため
' 最初に列幅を最小(0)に設定します。
Selection.Columns(columnIndex).ColumnWidth = 0
For Each TargetRng In SelectedColumn.Rows ' 選択している列内の各セルをループ
If Not TargetRng.Hidden And Not IsEmpty(TargetRng.Value) Then ' セルの行が非表示でなく、セルが空でない場合
TargetRng.Columns.AutoFit ' 列幅を自動調整
Dim AutoFitWidth As Double
AutoFitWidth = TargetRng.ColumnWidth ' AutoFitWidthに自動調整した列幅を代入
If AutoFitWidth > MaximumColumnWidth Then ' 自動調整した列幅がこれまでの最大列幅より大きい場合
MaximumColumnWidth = AutoFitWidth ' 最大列幅を更新
End If
End If
Next TargetRng
SelectedColumn.ColumnWidth = MaximumColumnWidth ' 選択している列全体の列幅を最大列幅に設定
End Sub
実行結果自体は、1.と2.で変わりませんので、お好みで使い分けてください。 私は、可視セルのみ選択状態にするショートカット等を覚えるのが面倒なので、リボンにこのマクロを登録して使っています。
もしよろしければサポートをお願いします。今後の執筆のかてにします。