【问题标题】:Assigning a value from a sub从 sub 赋值
【发布时间】:2019-07-09 23:11:53
【问题描述】:

我似乎无法编写一个基本的子函数来返回一个值。我收到“编译错误:预期的函数或变量名称”,但 VBA 似乎可以识别该名称。当我更新函数名时,它甚至会改变大小写。

我查看了此处的帮助甚至类似的帖子。我认为这是一个愚蠢的错误,但有人可以帮助我理解我做错了什么。我什至做了一个不编译的简单函数:

Sub fIVe()
    Dim i As Integer
    i = 5
    fIVe = i
End Sub

sClassification = getClassification("Activities")
ExportSheet "Activities", sFolderName, xWb, True, sClassification

Public Sub getClassification(sTabName As String)
    Dim sClassificationCode As String, sClassification As String
    'Step 1: Find Code for tab name
    sClassificationCode = Application.WorksheetFunction.Index(Sheets("Cover Master").Range("B7:B12"), _
        Application.WorksheetFunction.Match(sTabName, Sheets("Cover Master").Range("A7:A12"), 0), 1)
    'Step 2: Find definition in Type Definitions tab using code from above
    sClassification = Application.WorksheetFunction.Index(Sheets("Type Definitions").Range("F6:F21"), _
        Application.WorksheetFunction.Match(sClassificationCode, Sheets("Type Definitions").Range("E6:E21"), 0), 1)
     getClassification = sClassification
End Sub

【问题讨论】:

  • Functions 返回一个值。有很多关于这方面的文档,但这里有一个 link 可以帮助您入门。
  • fIVe 变成Function?否则,还有其他几种方法可以使变量“可用”(我松散地使用该术语,因为传递参数 ByRef 与范围变量等不同):stackoverflow.com/questions/16374253/…
  • 如果你是硬编码这个函数以返回 5,那么最好使用模块级 Public Const fIVe as Integer = 5

标签: excel vba


【解决方案1】:

为了编译它进行了几处更改。返回值,而不是

Public Sub foo
End Sub

你使用

Public Function foo As SomeReturnTypeOrOther
    foo = SomeValueOrOther
End Function

以下标记为“

Function fIVe() As Long    ' <== 'Function' instead of 'Sub'; add 'As <type>'
    Dim i As Long          ' <== Use 'Long' instead of 'Integer'
    i = 5
    fIVe = i
End Function                ' <== End Function

Public Sub DoSomething()    ' <== Wrap the 'sClassification = ...' 
                            ' and 'ExportSheet' lines in a Sub
    Dim sClassification As String   ' <== Since it's not in `getClassification`, 
                                    ' it doesn't share the variables
    sClassification = getClassification("Activities")
    ExportSheet "Activities", sFolderName, xWb, True, sClassification
End Sub

Public Function getClassification(sTabName As String) As String  ' <== Function; As String
    Dim sClassificationCode As String, sClassification As String
    'Step 1: Find Code for tab name
    sClassificationCode = Application.WorksheetFunction.Index(Sheets("Cover Master").Range("B7:B12"), _
        Application.WorksheetFunction.Match(sTabName, Sheets("Cover Master").Range("A7:A12"), 0), 1)
    'Step 2: Find definition in Type Definitions tab using code from above
    sClassification = Application.WorksheetFunction.Index(Sheets("Type Definitions").Range("F6:F21"), _
        Application.WorksheetFunction.Match(sClassificationCode, Sheets("Type Definitions").Range("E6:E21"), 0), 1)
     getClassification = sClassification
End Function

' I also added a stub ExportSheet since it wasn't included in your question.
Public Sub ExportSheet(ParamArray args() As Variant)
    ' Not sure what you want to do here
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2010-10-02
    • 2020-12-10
    • 2013-09-17
    • 2019-07-31
    相关资源
    最近更新 更多