将常量作为参数的函数

3

一些预定义的VBA方法和函数需要传递一个特定的常量,例如:

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

在这些代码片段中,常量为xlCalculationAutomaticxlUpppAlignCenter
当调用函数/方法并要求填写参数时,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

看起来你正在寻找Enum语句。在你的情况下,它可能是这样的:

Enum Margin
    Row
    Column
End Enum

' …

Function FindLast(ws As Worksheet, margin As Margin, iColRow As Long)
    If margin = Row ThenEnd Function

IntelliSense将与此配合使用,但您可能希望给枚举常量添加共同前缀(例如mar),以便在IntelliSense下拉框中更轻松地选择它们。这就是为什么例如xlUp具有前缀xl的原因。虽然我个人不太喜欢这种前缀。


1
如果 m = Margin.Row,则If m = Margin.Row Then也可以正常工作并且在我看来更好。 在您的示例中不起作用,因为您将参数命名为类型之后,会使智能感知混淆。 - GSerg
这似乎是有效的。为了回答问题,值得注意的是Enum语句是一个独立的代码片段,与任何子程序/函数无关。 - Eleshar

0

在这种情况下,你也可以使用Excel-Enum XlRowCol:

看起来你在"If sRow__Col = "Row" Then"语句中也漏写了'或'。

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

使用波兰式表示法已经够糟糕的了,但如果使用错误的类型提示,那就更糟糕了。;-) - Konrad Rudolph
你是指匈牙利命名法吗?我只是保持了原作者的代码不变;-) - EvR
是的,没错。问题是,那是需要被改变的代码的一部分。 - Konrad Rudolph
我注意到一旦修改代码,就不知道这个函数是如何工作的了... - Eleshar
@EvR 这种表示法有其原因 :) - Eleshar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接