Ошибка несоответствия типа при использовании ActiveCell.Row

#excel #vba

#excel #vba

Вопрос:

Здесь возникли некоторые проблемы. На листе с именем «Пуск» у меня есть столбец «I» В этом столбце, все поля в строках имеют одинаковый выпадающий список:

  • Лист 1
  • Лист 2
  • Лист 3

Я хотел бы открыть лист в рабочей книге, соответствующий значению из выпадающего списка. Так, например, если я выберу лист 1 из списка, откроется «Лист 1» в рабочей книге. Как упоминалось ранее, эти выпадающие списки охватывают весь столбец «I», поэтому независимо от того, какую строку я выбираю для использования выпадающего списка, я бы хотел, чтобы произошло то же самое. Я использовал активную ячейку.Строка, но ошибка несоответствия типа:

 Private Sub Worksheet_Change(ByVal Target As Range)
        
If Rows(ActiveCell.Row).Value = "Sheet 1" Then
            Worksheets("Sheet 1").Visible = True
            Worksheets("Sheet 1").Activate
            Else
If Rows(ActiveCell.Row).Value = "Sheet 2" Then
            Worksheets("Sheet 2").Visible = True
            Worksheets("Sheet 2").Activate
            Else
If Rows(ActiveCell.Row).Value = "Sheet 3" Then
            Worksheets("Sheet 3").Visible = True
            Worksheets("Sheet 3").Activate
End If
End If
End If

End Sub
 

Есть идеи?

Комментарии:

1. Мое первое подозрение заключается в том, что Rows у меня нет Value свойства

2. if target.value....

3. Чего вы ожидаете от Rows(ActiveCell.Row).Value строки кода?

4. @FaneDuru .value должен прочитать выбранное значение из выпадающего списка. Мне удалось заставить это работать, добавив If Range("A" amp; (ActiveCell.Row)).Value = "Sheet 1" Then к каждому условию соответственно

5. Затем вы можете адаптировать свое событие, чтобы использовать только строку кода : Worksheets(Range("A" amp; Target.row).value).activate . Лучшим способом было бы предварительно проверить, существуют ли листы…

Ответ №1:

Вы можете сделать:

 Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 9 Then ThisWorkbook.Worksheets(Target.Value).Activate
End Sub
 

Обратите внимание, что это будет работать, только если Target.Value точно соответствует имени листа

Ответ №2:

Вы должны использовать Target , а не ActiveCell :

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim v1 As Long, v2 As String
    
    v1 = Target.Column
    v2 = Target.Value
    
    If v1 <> 9 Then Exit Sub
    If v2 = "Sheet 1" Or v2 = "Sheet 2" Or v2 = "Sheet 3" Then
            Worksheets(v2).Visible = True
            Worksheets(v2).Activate
    End If
End Sub