【问题标题】:how to get a subroutine in excel vba to return something?如何让excel vba中的子​​程序返回一些东西?
【发布时间】:2015-03-14 20:52:57
【问题描述】:

我在 excel vba 中有以下代码:

Sub main()
    Call Get_Rows_Generic("usersFullOutput.csv", 1)
End Sub

在我的另一个模块中:

Sub Get_Rows_Generic(work_sheet As String, column_num As Integer) 

    Dim wsUsers As Worksheet:             Set wsUsers = Worksheets(work_sheet)
    Dim userRows As Integer:              userRows = wsUsers.Cells(Rows.Count, column_num).End(xlUp).Row

    MsgBox userRows
End Sub

我如何在子外部访问子 Get_Rows_GenericMsgBox 中显示的内容)的结果?即将结果输入另一个子或单元格......等等。

【问题讨论】:

  • 如果你想要一个Sub 来返回一些东西,那就把它改成Function

标签: excel vba function subroutine


【解决方案1】:

那为什么不把它变成一个函数呢?

Function Get_Rows_Generic(work_sheet As String, column_num As Integer) 

    Dim wsUsers As Worksheet:             Set wsUsers = Worksheets(work_sheet)
    Dim userRows As Integer:              userRows = wsUsers.Cells(Rows.Count, column_num).End(xlUp).Row

    Get_Rows_Generic = userRows
End Sub

那么你的电话可能是

Sub main()
    Dim result as integer
    result = Get_Rows_Generic("usersFullOutput.csv", 1)
End Sub

如果您希望 result 成为全局变量,那么我建议您参考这个问题:How do I declare a global variable in VBA?

Public result as integer

【讨论】:

  • 谢谢!最后一行函数应该是Get_Rows_Generic = userRows,对吗?
  • @dwstein 谢谢。是的,你是对的。那里应该有一个等号。
【解决方案2】:

假设您知道可以将您的 Sub 转换为函数,那么有一种粗略的方法可以实现您想要做的事情。由于 VBA/VBScript 默认将参数作为ByRef 传递,因此您可以使用它来“返回”一个值。

Sub main()
    Dim userRows as Integer
    userRows = 0
    Call Get_Rows_Generic("usersFullOutput.csv", 1, userRows)
    Msgbox userRows
End Sub

Sub Get_Rows_Generic(work_sheet As String, column_num As Integer, ByRef userRows as Integer) 

    Dim wsUsers As Worksheet:             Set wsUsers = Worksheets(work_sheet)
    Dim userRows As Integer:              userRows = wsUsers.Cells(Rows.Count, column_num).End(xlUp).Row

End Sub

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多