从宏调用函数

时间:2014-05-27 20:13:04

标签: excel vba excel-vba

我正在尝试使用函数Cells(Rows.Count, 14).End(xlUp).Row来确定包含数据的最后一行。这个和类似的公式出现在我的VBA代码的许多地方。我的电子表格非常复杂,我经常需要添加列。因此,我不想参考第14列,而是想使用一个我只能在一个地方轻松更改的值。我正在使用一个名为Column of sort,我只需要在一个地方更新。销售的商品出现在N栏中。我意识到这段代码非常简单,但为了提问,我将其简化了。当我尝试运行Test子程序时,我编译错误:ByRef参数类型不匹配和变量Item_Sold。我使用信件的原因是Range()需要一封信,但Cells().End(xlUp).Row需要一个号码。

如果我将Items_Sold = "N"移动到函数的子函数中,它会起作用,但这意味着这段代码必须放在每个子函数中,而不是只放在一个函数中。

功能:

Function ColNum(ColumnNumber As String) As Integer
Dim Items_Sold As String
Items_Sold = "N"
ColNum = Range(Replace("#:#", "#", ColumnNumber)).Column
End Function

宏:

Sub Test()
Dim Total_Items_Sold As Integer
Total_Items_Sold = Cells(Rows.Count, ColNum(Items_Sold)).End(xlUp).Row
End Sub

2 个答案:

答案 0 :(得分:4)

使用全局常量。

在模块的顶部,在任何子/函数之外:

Const COL_NUM As Long = 14

用法:

Sub Test()
    Dim Total_Items_Sold As Long
    Total_Items_Sold = ActiveSheet.Cells(Rows.Count, COL_NUM).End(xlUp).Row
End Sub

答案 1 :(得分:0)

通过编写

在代码的开头添加一个全局变量
public Items_Sold as String

将解决您的 ByRef 问题。但是,除非您之前在某处设置了 Items_Sold 的值,否则在调用 Test()时,您仍然会遇到未声明的 Items_Sold 值的问题。