首页 > 解决方案 > 设置已用行的最小行高

问题描述

我有以下代码,我似乎无法正常工作。

如果我删除并将其lastquoterow更改为它,A13:A250那么它可以工作,但它会减慢代码速度,因为它必须经过整个范围并检查它是否需要调整大小(因为还没有数据存在进一步向下,意味着整个范围将被调整)。这也会导致一些视觉问题,因为它会导致稍后在后续代码中插入的行具有比所需更宽的间距。

我也不能让它调整 A1-A12 的大小,因为这是我的标题范围必须保持静态。我试图告诉它从A13我的范围开始的地方开始,转到最后使用的行,如果行大小是< 21,设置高度为 21。然后我的下一阶段代码开始并插入更多处理合并单元格等的数据,这些数据有自己的代码来设置其行高并且不能被弄乱。

我把这个搞砸了什么?

    Dim lastquoterow
        
        lastquoterow = quote1.Columns("A").Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row
        
    For Each c In Range("A13" & lastquoterow)
        If c.RowHeight < 21 Then
            c.RowHeight = 21
        End If
    Next

标签: excelvbarow-height

解决方案


你必须决定什么lastquoterow是。如果它是一行,那么它应该是一个Long. 虽然,.Row最后表明它应该被转换为Long.

无论如何,这对我有用。50硬编码是有原因的,就我没有您的输入而言:

Sub TestMe()

    Dim lastquoterow As Long
    Dim c As Range
    
    lastquoterow = 50
    
    For Each c In quote1.Range("A13:A" & lastquoterow)
        If c.RowHeight < 21 Then
            c.RowHeight = 21
        End If
    Next

End Sub

如果它太慢,您可以将行添加到一个范围并rowsToIncrease.RowHeight = 21只执行一次,对于 1M+ 行需要不到 2 秒的时间,这应该被认为是快速的:

Sub TestMe()

    Dim lastQuoteRow As Long: lastQuoteRow = 2 ^ 20
    Dim c As Range
    Dim rowsToIncrease As Range
    
    For Each c In quote1.Range("A13:A" & lastQuoteRow)
        If c.RowHeight < 21 Then
            If rowsToIncrease Is Nothing Then
                Set rowsToIncrease = c
            Else
                Set rowsToIncrease = Union(c, rowsToIncrease)
            End If
        End If
    Next
    
    If Not rowsToIncrease Is Nothing Then
        Debug.Print rowsToIncrease.Address
        rowsToIncrease.RowHeight = 21
    End If
    
End Sub

推荐阅读