Дополнительные параметры VBA Sub со значениями по умолчанию - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь написать подпрограмму VBA, которая позволяет использовать дополнительные параметры со значениями по умолчанию . Я попробовал пример кода из Microsoft Docs - Дополнительные параметры (Visual Basi c) , но это приводит к тому, что подпрограмма не отображается в списке доступных подпрограмм (т.е. из макросов просмотра).

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
    If office = "QJZ" Then
        Debug.WriteLine("office not supplied -- using Headquarters")
        office = "Headquarters"
    End If
    ' Insert code to notify headquarters or specified office.
End Sub

Дополнительное объявление, которое я пробовал, но не смог появиться, было:

Sub HighlightByFont( _
        Optional ByVal highlightFont As Variant = "", _
        Optional ByVal highlightColor As Variant = "", _
        Optional ByVal highlightText As Variant = "", _
        Optional ByVal matchWildcards As Variant = False, _
        Optional ByVal useGUI As Variant = False, _
        Optional ByVal highlightBold As Variant = False, _
        Optional ByVal highlightItalic As Variant = False)

На данный момент мне пришлось согласиться на нижеприведенное с помощью IsMissing logi c:

Sub HighlightByFont( _
        Optional ByVal highlightFont As Variant, _
        Optional ByVal highlightColor As Variant, _
        Optional ByVal highlightText As Variant, _
        Optional ByVal matchWildcards As Variant, _
        Optional ByVal useGUI As Variant, _
        Optional ByVal highlightBold As Variant, _
        Optional ByVal highlightItalic As Variant)

Возможно ли (все еще ), и если да, то как:

  1. настроить объявление параметра?
  2. , чтобы он отображался в списке макросов просмотра?

Среда:

  • Word 2016 x64
  • Windows 10

Все ссылки, включая ответы SO, связанные с дополнительными параметрами VBA, относятся к 2015 году.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Ссылка, которую вы предоставили, ведет на страницу справки для VB Net, а не VBA. VBA и VB. Net похожи, но имеют очень разные варианты использования. VBA - это встроенный язык сценариев, используемый приложениями Microsoft Office. VB Net является полнопроходным. Net Язык, который имеет свои корни в VBA, но не используется приложением Office, если вы не укажете c надстройки или приложения VSTO.

Дополнительные аргументы в VBA работают нормально . Версия VBA примера кода, который вы предоставили выше:

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
    If office = "QJZ" Then
        Debug.print "office not supplied -- using Headquarters"
        office = "Headquarters"
    End If
    ' Insert code to notify headquarters or specified office.
End Sub

Вы также можете оказать всем нам небольшую услугу и научиться использовать разрыв строки, чтобы

Sub HighlightByFont(Optional ByVal highlightFont As Variant = "", Optional ByVal highlightColor As Variant = "", Optional ByVal highlightText As Variant = "", Optional ByVal matchWildcards As Variant = False, Optional ByVal useGUI As Variant = False, Optional ByVal highlightBold As Variant = False, Optional ByVal highlightItalic As Variant = False)

записывается как

Sub HighlightByFont _
( _
    Optional ByVal highlightFont As Variant = "", _
    Optional ByVal highlightColor As Variant = "", _
    Optional ByVal highlightText As Variant = "", _
    Optional ByVal matchWildcards As Variant = False, _
    Optional ByVal useGUI As Variant = False, _
    Optional ByVal highlightBold As Variant = False, _
    Optional ByVal highlightItalic As Variant = False _
)

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

0 голосов
/ 10 мая 2020

Объявление параметров необязательных значений

Да, необязательные параметры со значениями по умолчанию работают вплоть до Word 2016. В справочнике VBA указано:

Список аргументов аргумент имеет следующий синтаксис и части:

[Необязательно] [ByVal | ByRef] [ParamArray] varname [()] [As type] [= defaultvalue]

Необязательно Необязательно. Ключевое слово , указывающее, что аргумент не требуется. Если используется, все последующие аргументы в списке arglist также должны быть необязательными и объявляться с помощью ключевого слова Optional . Необязательный не может использоваться для любого аргумента, если используется ParamArray .

значение по умолчанию Необязательно. Любое постоянное или постоянное выражение. Действительно только для необязательных параметров . Если тип - Object , явное значение по умолчанию может быть только Nothing .

Sub OptParam_Test_1()
  'Shows in Macro list
End Sub

Sub OptParam_Test_2(param)
  'Does not show in Macro list
    Debug.Print (param) 'Output for OptParam_Test_2 "hello": hello
End Sub

Sub OptParam_Test_3(Optional param)
  'Shows in Macro list
    Debug.Print (param) 'Output: hello
End Sub

Sub OptParam_Test_4(Optional param As String = "hello")
  'Does not show in Macro list
    Debug.Print (param) 'Output: hello
End Sub

Sub OptParam_Test_5(Optional param As Variant = "hello again")
  'Does not show in Macro list
    Debug.Print (param) 'Output: hello again
End Sub

Неожиданное поведение интерфейса при объявлении параметров со значениями по умолчанию = подпрограмма перестанет отображаться в списке макросов .

Note sub examples 1, 3 show. 2, 4, 5 do not.

Это не следует интерпретировать как вспомогательный компонент, имеющий проблему или недоступный для использования.

  • Понятно, Похоже, это было дизайнерское решение, что подпрограммы с параметрами должны вызываться из другого подпрограммы или окна немедленного действия 1 и, следовательно, не отображаться в списке макросов enter image description here
  • Логически, подпрограммы только с / всеми необязательными параметрами (и без значений по умолчанию ) действительно показывают 2 в списке макросов с момента вызова, по определению , не требует предоставления явного аргумента
  • Несогласованно , подпрограммы с дополнительными параметрами и предоставлены значения по умолчанию делать не показывать в списке макросов

Параметры вызова

Два варианта вызова подпрограмм, содержащих параметр со значением по умолчанию:

  1. Объявить вызывающий суб без параметров, который вызывает рассматриваемый суб. Эта вызывающая подпрограмма появится в списке макросов.
    Sub OptParam_Test_4(Optional param As String = "hello")
      'Does not show in Macro list
        Debug.Print (param) 'Output: hello
    End Sub

    Sub OptParam_Test_4_()
      'Shows in Macro list
      OptParam_Test_4
      'Output: hello
    End Sub

Caller sub shows in Macros list

Используйте окно Immediate 1 для вызова рассматриваемой подпрограммы

1 Developer - Visual Basi c - Просмотр - Немедленное окно (Ctrl + G)

2 вопреки различным комментариям к множеству сообщений SO, связанных с этим топом c

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