Скрыть столбцы Excel на основе выбора пользователя - PullRequest
0 голосов
/ 10 марта 2020

У меня есть список проверки в ячейке B2, который получает список из строки 5 (G5: BF5).

Я хочу, чтобы пользователь мог выбрать значение из списка проверки, в результате которого будут отображены все столбцы. от G до BF, скрытого за исключением заголовка столбца, который соответствует значению в ячейке B2.

Я использовал приведенный ниже код, но продолжаю получать ошибку Application-Defined или Object-Defined.

Я использую следующий VBA:

Рабочий лист >> Изменить

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$B$2" Then
    Dim the_selection As String
    Dim week_in_review As String
    the_selection = Worksheets("SortHeatMap").Range("B2")
    Dim rep As Integer
    For rep = 8 To 25
    the_column = GetColumnLetter_ByInteger(rep)
    week_in_review = Worksheets("SortHeatMap").Range(column_letter & "5")
    If the_selection = week_in_review Then
    Worksheets("SortHeatMap").Range(the_column & ":" & the_column).EntireColumn.Hidden = False
    Else
    Worksheets("SortHeatMap").Range(the_column & ":" & the_column).EntireColumn.Hidden = True
    End If
    Next rep
    End If

End Sub

И это в (общем) >> GetColumnLetter_ByInteger в модуле 1.

Public Function GetColumnLetter_ByInteger(what_number As Integer) As String

    'This section obtains Column letter of selected week.

    GetColumnLetter_ByInteger = ""

    If MyColumn_integer <= 26 Then
    column_letter = Chr(64 + MyColumn_integer)
    End If

    If MyColumn_integer > 26 Then
    column_letter = Chr(Int((MyColumn_integer - 1) / 26) + 64) & Chr(((MyColumn_integer - 1) Mod 26) + 65)
    End If

    GetColumnLetter_ByInteger = column_letter

End Function

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Этот код сначала скроет все столбцы в указанном диапазоне, а затем покажет тот, который вы указали в B2. Преимущество этой системы в том, что ранее показанный столбец будет среди скрытых.

Private Sub Worksheet_Change(ByVal Target As Range)

    Const TriggerCell As String = "B2"
    Const FirstColumnToHide As String = "G"
    Const LastColumnToHide = "BF"

    Dim Rng As Range
    Dim ClmToShow As Variant

    With Target
        If .Address = Range(TriggerCell).Address Then
            Application.ScreenUpdating = False
            ClmToShow = .Value
            On Error Resume Next
            ClmToShow = Columns(ClmToShow).Column
            If ClmToShow < Columns(FirstColumnToHide).Column Or _
               ClmToShow > Columns(LastColumnToHide).Column Then Exit Sub
            ' if TriggerCell doesn't contain a qualified column reference
            ' this would also be the case if an error occurred at this point

            On Error GoTo 0
            Set Rng = Range(Columns(FirstColumnToHide), Columns(LastColumnToHide))
            Rng.Columns.Hidden = True
            Columns(ClmToShow).Hidden = False
            Application.ScreenUpdating = True
        End If
    End With
End Sub

По возможности, избегайте встраивания констант в код. Здесь это легко сделать. Все константы объявлены в верхней части кода. Если в будущем будут какие-то изменения, их можно будет сделать там, не затрагивая сам код.

0 голосов
/ 10 марта 2020

Что-то вроде этого должно сделать это:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rep As Long, v
    If Target.Address = Me.Range("B2").Address Then
        v = Target.Value
        For rep = 8 To 25
            Me.Columns(rep).Hidden = (Me.Cells(5, rep).Value <> v)
        Next rep
    End If
End Sub

Когда вы находитесь в модуле кода рабочего листа, вы можете использовать Me для обращения к листу.

Преобразование номеров столбцов в буквы - это боль, и тебе никогда не нужно это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...