Выявить столбец, нажав на ячейку в нем - PullRequest
1 голос
/ 30 сентября 2019

У меня есть подпункт (на рабочем листе), который увеличивает столбец, когда я нажимаю на ячейку. Проблема в том, что я не могу вернуть исходный размер столбца при выходе из него.

Я попытался использовать некоторые параметры по умолчанию, но это заканчивается ошибкой.

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). Но мне нужен оригинальный размер столбца.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Проблема в том, что я не могу вернуть исходный размер столбца при выходе из него.

Это то, что вы пытаетесь? Это сохраняет предыдущую ширину и номер столбца в переменной.

Dim prevWidth As Long
Dim prevCol As Long

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If prevWidth <> 0 And prevCol <> 0 Then
        Columns(prevCol).ColumnWidth = prevWidth
    End If

    On Error Resume Next
    prevWidth = Target.ColumnWidth
    prevCol = Target.Column
    Columns(prevCol).EntireColumn.AutoFit
    On Error GoTo 0
End Sub

enter image description here

1 голос
/ 30 сентября 2019

Вот простой пример, где я жертвую ТОП-2 строками, которые содержат ширину для активных и неактивных столбцов:

enter image description here

Вы можете выбрать любойстрока, возможно, даже использовать именованный диапазон в случае, если вы добавляете / удаляете строки. Но это код, который я использовал:

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

enter image description here


РЕДАКТИРОВАТЬ

Другая интересная вещь, которую нужно сделать, - это создать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...