Excel表格:仅对可见行自动调整列

dvtswwa3  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(142)

我有过滤功能,显示我不同的行取决于我写在搜索字段。然后打印这些行,在此之前,我想自动调整一列(W),因为该字段中的文本有时可能很长,有时可能很短。如果它很短,我想在打印前自动调整列以节省保存空间。
我试过一些函数,其中包含. autoreColumn.AutoFit,但考虑到隐藏的行,然后在它们可见的地方自动调整。
范例:

With Range("W4:W1400").SpecialCells(xlCellTypeVisible)
    .EntireColumn.AutoFit
End With

或者这个:

Dim mCell As Range
For Each mCell In Range("W2:W2")
    mCell.EntireColumn.AutoFit
   ' If mCell.EntireColumn.ColumnWidth > 50 Then _
   ' mCell.EntireColumn.ColumnWidth = 50
Next mCell

这里还有一个额外的好处,如果列包含一个额外的长文本,列(W)应该只延伸到50。
:)

dxxyhpgq

dxxyhpgq1#

我觉得使用一个临时表来检查临时列宽比循环要容易。

Sub limitWidthColW()
    Dim lRow As Long, rng As Range
    Dim ws As Worksheet, ws2 As Worksheet
    
    Set ws = Me.Worksheets("Sheet1") 'change your sheet, "Me" = ThisWorkbook, also change as needed
    lRow = ws.Range("A" & Rows.Count).End(xlUp).Row
    If ws.FilterMode Then '**
        Set ws2 = Me.Worksheets.Add(After:=Me.Worksheets(Me.Worksheets.Count))
        Set rng = ws.Range("W1:W" & lRow).SpecialCells(xlCellTypeVisible)
        
        rng.Copy ws2.Range("A1")
        ws2.Range("A1").EntireColumn.AutoFit
        Dim colWidth2 As Long
        colWidth2 = ws2.Range("A2").EntireColumn.ColumnWidth
        If colWidth2 > 50 Then colWidth2 = 50 'bonus!
        ws.Range("W2").EntireColumn.ColumnWidth = colWidth2
        'Cleaning up
        Application.DisplayAlerts = False
            ws2.Delete
        Application.DisplayAlerts = True
    Else '**
        ws.Columns("W:W").AutoFit '**
    End If '**
End Sub

如果未应用过滤器,这也会重置列W的自动调整,而不会创建/删除临时图纸。如果你不想发生这种情况,请删除“**"行。

ghhaqwfi

ghhaqwfi2#

AutoFit将始终使用最宽的文本设置列宽,无论单元格是否可见。
最好的办法是只将可见的单元格复制到(隐藏的)工作表中,在该列上使用“自动调整”,并将计算出的列宽分配给列。下面的例程将执行此操作,它假设工作簿中有一个名为“tmp”的工作表,并且数据。如果需要,可以传递可选的最小或最大列宽。

Sub AutofitVisible(r As Range, Optional minWidth As Double = 0, Optional maxWidth As Double = 0)
    Dim tmpSheet As Worksheet
    Set tmpSheet = ThisWorkbook.Sheets("Tmp")
    tmpSheet.UsedRange.Clear
    ' Copy only the visible cells
    r.SpecialCells(xlCellTypeVisible).Copy
    With tmpSheet.Range("A1")
        .PasteSpecial xlPasteAll  ' Copy the visible cells (with formatting)
        .EntireColumn.AutoFit     ' Autofit that data
        Dim colWidth As Double    
        colWidth = .ColumnWidth
        If minWidth > 0 And minWidth > colWidth Then colWidth = minWidth
        If maxWidth > 0 And maxWidth < colWidth Then colWidth = maxWidth
    
        r.EntireColumn.ColumnWidth = colWidth ' Set column width of orig. data
    End With
End Sub

调用看起来像这样:

AutofitVisible  Range("W4:W1400"), maxWidth := 50

相关问题