Функция с константой в качестве аргумента - PullRequest
3 голосов
/ 02 мая 2019

Некоторые предопределенные методы и функции VBA требуют, чтобы им была передана определенная константа, например:

Application.Calculation = xlCalculationAutomatic
.cells(i,j).End(xlUp).Row
.PpParagraphAlignment = ppAlignCenter

В этих фрагментах константами являются xlCalculationAutomatic , xlUp и ppAlignCenter .

Когда вызывается функция / метод и запрашивается заполнение аргумента, VBE Intellisense обычно предлагает выпадающий список допустимых констант для выбора.

Есть ли способ достичь того же с помощью моих собственных подпрограмм и функций?Например, в приведенном ниже случае аргумент "sRowOrCol" требует, чтобы пользователь в настоящее время набирал литералы "Row" или "Col", однако я хотел бы предложить пользователю выпадающий список, содержащий, например, "xlRow" и "xlCol".

Function FindLast(ws As Worksheet, sRowOrCol As String, iColRow As Long)
    If sRowOrCol = "Row" Then
        FindLast = ws.Cells(ws.Rows.Count, iColRow).End(xlUp).Row
        Exit Function
    ElseIf sRowOrCol = "Col" Then
        FindLast = ws.Cells(iColRow, ws.Columns.Count).End(xlToLeft).Column
        Exit Function
    Else
        MsgBox "Invalid argument"
    End If    
End Function

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Кажется, вы ищете оператор Enum . В вашем случае это может выглядеть так:

Enum Margin
    Row
    Column
End Enum

' …

Function FindLast(ws As Worksheet, margin As Margin, iColRow As Long)
    If margin = Row Then
    …
End Function

IntelliSense будет работать с этим, но вы, возможно, захотите дать своим константам перечисления общий префикс (например, mar), чтобы облегчить их выбор в поле IntelliSense DropDown. Вот почему, например, xlUp имеет префикс xl. Хотя лично я не большой поклонник таких префиксов.

0 голосов
/ 02 мая 2019

В этом случае вы также можете использовать Excel-Enum XlRowCol:

Похоже, вы также пропускаете 'или' в If sRow__Col = "Row" Тогда

Function FindLast(ws As Worksheet, sRowOrCol As XlRowCol, iColRow As Long)
    If sRowOrCol = xlRows Then
        FindLast = ws.Cells(ws.Rows.Count, iColRow).End(xlUp).Row
        Exit Function
    ElseIf sRowOrCol = xlCols Then
        FindLast = ws.Cells(iColRow, ws.Columns.Count).End(xlToLeft).Column
        Exit Function
    Else
        MsgBox "Invalid argument"
    End If
End Function

Первоначально я изменил только часть, которая должна быть изменена, чтобы облегчить работу с OP;Законченный скорректированный код:

Function FindLast(ws As Worksheet, RowOrCol As XlRowCol, ColRow As Long) As Long
    Select Case RowOrCol
        Case xlRows: FindLast = ws.Cells(ws.Rows.Count, ColRow).End(xlUp).Row
        Case xlColumns: FindLast = ws.Cells(ColRow, ws.Columns.Count).End(xlToLeft).Column
        Case Else: MsgBox "Invalid RowOrCol argument"
    End Select
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...