首页 > 解决方案 > 通过单击其中的单元格来显示列

问题描述

我有一个子(在工作表上),当我单击单元格时会放大列。问题是当我离开它时我无法返回列的原始大小。

我尝试使用一些默认参数,但这以错误结束。

Then rngDEwidh.Columns.ColumnWidth = rngDEwidh.Columns.ColumnWidth
Then rngDEwidh.Columns.ColumnWidth = xlNone
Then rngDEwidh.Columns.ColumnWidth = ActiveCell.width

这是一个子:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Static rngDEwidh As Range
    If Not rngDEwidh Is Nothing Then rngDEwidh.Columns.ColumnWidth = xlNone
    Set rngDEwidh = Target
    rngDEwidh.Columns.ColumnWidth = 25
End Sub

使用 xlNone 时出错,如果我使用任何值(例如 10)就可以了。但我需要列的原始大小。

标签: excelvba

解决方案


这是一个简单的例子,我牺牲了保持活动和非活动列宽度的 TOP 两行:

在此处输入图像描述

您显然可以选择任何行,甚至可以使用命名范围以防添加/删除行。但这是我使用的代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim rng As Range
For Each cl In Range("A1:E1")
    Set rng = Intersect(cl.EntireColumn, Target.Columns)
    If Not rng Is Nothing Then
        cl.ColumnWidth = cl(1)
    Else
        cl.ColumnWidth = cl(2)
    End If
Next cl

End Sub

在此处输入图像描述


编辑

另一个有趣的事情是Dictionary在激活特定工作表时创建一个。用指定范围内每列的列宽填充该字典。其余的是我上面显示的代码的一个小改编。

Public dict As New Scripting.Dictionary
Dim rng As Range, cl As Range

Option Explicit

Private Sub Worksheet_Activate()

For Each cl In Range("A1:E1")
    dict.Add cl.Column, cl.ColumnWidth
Next cl

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

For Each cl In Range("A1:E1")
    Set rng = Intersect(cl.EntireColumn, Target.Columns)
    If Not rng Is Nothing Then
        cl.EntireColumn.AutoFit
    Else
        cl.ColumnWidth = dict(cl.Column)
    End If
Next cl

End Sub

推荐阅读