Ошибка несоответствия типов при вызове другого сабвуфера - PullRequest
0 голосов
/ 01 октября 2018

Следующий код дает мне ошибку несоответствия типов.Я протестировал HideTabs, имея внутренний массив вариантов, и он работал.Может ли кто-нибудь помочь?

Public Sub MainSub()
    Dim tab_names As Variant
    tab_names = Array("Sheet2", "Sheet3")
    Call HideTabs(tab_names)
End Sub

Public Sub HideTabs(ws_names() As Variant)
    Dim ws_name As Variant
    For Each ws_name In ws_names()
        ThisWorkbook.Worksheets(ws_name).Visible = False
    Next ws_name
End Sub

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

В MainSub вы определяете tab_names As Variant, в то время как параметр HideTabs ожидается как ws_names() as Variant.

Один - это Variant, который может храниться (среди всех других простых типов и объектов) массив, в то время как другой является Variant Array, который может хранить Variants (каждый из которых может хранить массив по очереди).

Таким образом, в действительности вы пытаетесь передать скаляр в качестве параметра, гдеожидается массив.

Чтобы исправить ваш код, убедитесь, что оба объявления используют один и тот же тип (Variant Array, поскольку неявный массив в «скаляре» Variant, кажется, не может использоваться с For Each).

Public Sub MainSub()
    Dim tab_names() As Variant
    tab_names = Array("Sheet2", "Sheet3")
    HideTabs tab_names ' "Call" is obsolete. Don't use it.
End Sub

Public Sub HideTabs(ByVal ws_names() As Variant)
    Dim ws_name As Variant
    For Each ws_name In ws_names()
        ThisWorkbook.Worksheets(ws_name).Visible = False
    Next ws_name
End Sub

Как указано в QHarr's answer круглые скобки не требуются - они будут работать без них.Однако вы избавляетесь от необходимости проверять аргумент Variant для содержащегося в нем массива, если вам напрямую требуется массив.

0 голосов
/ 01 октября 2018

Вы можете написать следующим образом.Вам не нужно () в качестве варианта передачи ByVal для подпрограммы.

Public Sub MainSub()
    Dim tab_names As Variant
    tab_names = Array("Sheet2", "Sheet3")
    HideTabs tab_names
End Sub

Public Sub HideTabs(ByVal ws_names As Variant)
    Dim ws_name As Variant
    For Each ws_name In ws_names
        ThisWorkbook.Worksheets(ws_name).Visible = False
    Next ws_name
End Sub

enter image description here

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