【问题标题】:Change column width and row height of hidden columns and rows (remaining hidden): Excel VBA更改隐藏列和行的列宽和行高(保持隐藏):Excel VBA
【发布时间】:2017-05-01 03:49:46
【问题描述】:

我有一个宏可以更改我的 excel 工作簿中所有工作表的列宽和行高,但是,此宏不会更改隐藏的行和列。

请建议我应该如何修改我的代码,以便它应该改变隐藏行和列的列宽和行高并保持隐藏?

Sub rowcolactivesheetb()

    Dim exworkb As Workbook
    Dim xlwksht As Worksheet
    Dim lastrow1 As Long
    Dim lastcolumn1 As Long
    Dim firstrowDB As Long

    With ActiveSheet

        lastrow1 = .Cells(Rows.Count, "A").End(xlUp).Row
        lastcolumn1 = .Cells(1, Columns.Count).End(xlToLeft).Column

        .Range(.Cells(1, 1), .Cells(lastrow1, lastcolumn1)).Select

        With Selection.SpecialCells(xlCellTypeVisible)
            .ColumnWidth = 10.2
            .RowHeight = 9.4
        End With

    End With

End Sub

编辑

我已经在下面实现了 Wolfie 的方法,但现在得到了

运行时错误 91,对象变量或未设置块变量。

在这一行:

' Z is a number, my loop variable for looping over each sheet
rng = ActiveWorkbook.Sheets(Z).Range(Sheets(Z).Cells(1, 3), Sheets(Z).Cells(lastrow1, lastcolumn1))

【问题讨论】:

  • 如果您编辑隐藏的行和列,它们将变得可见,因此您需要再次隐藏它们
  • 这是主要问题,可以通过应用任何更改行宽和高度并再次隐藏的代码来自动隐藏它
  • 在我的excel表中,除了隐藏的行和列之外,还有分组的行和列,以及是否可以修改我的代码以使其适用于分组的行和列(如果不是隐藏的行和列)

标签: excel vba


【解决方案1】:

下面的代码相当简单,并评论了更多细节。步骤:

  • 遍历使用范围内的行和列,注意哪些是隐藏的。
  • 取消隐藏所有内容并调整大小
  • 循环遍历行和列,隐藏之前隐藏的那些

代码

Sub rowcolactivesheetb()
' Resizes all rows and columns, including those which are hidden.
' At the end, hidden rows and columns remain hidden.
    Dim n As Long
    Dim hiddencols() As Long
    Dim hiddenrows() As Long
    Dim rng As Range
    Application.ScreenUpdating = False
    With ThisWorkbook.ActiveSheet
        ' Set up range variable and true/false hidden arrays        
        ' We don't need to find last row/col, just used UsedRange
        Set rng = .UsedRange
        ReDim hiddencols(rng.Columns.Count)
        ReDim hiddenrows(rng.Rows.Count)
        ' Get hidden/visible status of each row and column
        For n = 0 To UBound(hiddencols)
            hiddencols(n) = rng.Columns(n + 1).Hidden
        Next n
        For n = 0 To UBound(hiddenrows)
            hiddenrows(n) = rng.Rows(n + 1).Hidden
        Next n
        ' Unhide all
        rng.EntireColumn.Hidden = False
        rng.EntireRow.Hidden = False
        ' resize all
        rng.ColumnWidth = 10.2
        rng.RowHeight = 9.4
        ' Re-hide rows/cols
        For n = 0 To UBound(hiddencols)
            rng.Columns(n + 1).Hidden = hiddencols(n)
        Next n
        For n = 0 To UBound(hiddenrows)
            rng.Rows(n + 1).Hidden = hiddenrows(n)
        Next n
    End With
    Application.ScreenUpdating = True
End Sub

最后,关于With 的注释,您不应该开始第二个With 块,除非它是针对第一个 的对象。但实际上,无论如何你都可以放弃(不受欢迎的)Select...

With ActiveSheet
    lastrow1 = .Cells(Rows.Count, "A").End(xlUp).Row
    lastcolumn1 = .Cells(1, Columns.Count).End(xlToLeft).Column
    With .Range(.Cells(1, 1), .Cells(lastrow1, lastcolumn1)).SpecialCells(xlCellTypeVisible)
        .ColumnWidth = 10.2
        .RowHeight = 9.4
    End With
End With

编辑:

关于您的后续错误,在将Range 对象分配给变量时,您必须使用Set 命令。所以你的代码应该是

Set rng = ActiveWorkbook.Range("...

您不必将Set 用于基本变量类型(字符串、整数等)

【讨论】:

  • 感谢您解决了它在活动表上工作的问题,但是当我修改代码以在工作簿中的所有工作表上工作时,它给出了错误。我修改了我的代码
  • 因为我想从 C 列更改列宽,所以相应地对其进行了修改,但给出了错误
  • @Stacey 您不应该编辑您的帖子以完全更改您的原始代码,否则我的回答似乎已经过时并且您的原始问题丢失了!分配范围时必须使用Set 关键字,因此Set rng = ActiveWorkbook.Range("...。如果它解决了您的问题,请考虑将此答案标记为已接受。
  • @Stacey 我已经回滚了您的问题并对其进行了编辑以演示您将来应该如何做,请注意! :) 我将编辑我自己的答案来解决您的问题,除非您有其他问题,否则您无需发布新帖子。
  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多