Function 将宏拆分为单独的函数,而不是统一反应

Function 将宏拆分为单独的函数,而不是统一反应,function,vba,variables,excel,parameter-passing,Function,Vba,Variables,Excel,Parameter Passing,我一直在为我的工作构建宏,以加速我们所做的一些重复性任务。 有些宏变得相当长,因此很难编辑/修复/添加功能。 许多宏也共享代码块。 所以我开始研究函数和子函数,并开始分离宏的块。 在错误开始发生到我无法前进的地步之前,我毫无进展 我按照一些写得不好的教程来设置这些东西,但大多数都没有按照他们说的那样工作 Ill jsut在一个宏的开头放一点代码,看看im是否在正确的轨道上 Sub current_Order(control As IRibbonControl) Application.Scree

我一直在为我的工作构建宏,以加速我们所做的一些重复性任务。 有些宏变得相当长,因此很难编辑/修复/添加功能。 许多宏也共享代码块。 所以我开始研究函数和子函数,并开始分离宏的块。 在错误开始发生到我无法前进的地步之前,我毫无进展

我按照一些写得不好的教程来设置这些东西,但大多数都没有按照他们说的那样工作

Ill jsut在一个宏的开头放一点代码,看看im是否在正确的轨道上

Sub current_Order(control As IRibbonControl)
Application.ScreenUpdating = False

'code removed from here not neccessary to what we talking about


FocusSheet = ActiveSheet.Name

Call JobNumber

Call PONumber(ByVal FocusSheet)
然后调用两个函数

Function JobNumber() As String

Sheets("Mat. Estim & Data Dump").Select
JobNumber = Range("G3").Value

End Function

Function PONumber(ByVal FocusSheet) As String

Sheets(FocusSheet).Select

PONumber = Range("M7").Value

End Function
这就是问题所在。JobNumber函数返回,PONumber不返回。 如果我将MsgBox放在函数本身中,我可以看到函数正在工作并从单元格中获取正确的值。 如果我将MsgBox放在主子模块中,JobNumber起作用,PONumber会使宏崩溃,无论宏是如何引用的,也不管它在主子模块中的什么位置

我很困惑,因为这两个函数似乎完全相同,都只是转到另一个工作表,从单元格中获取一个值,然后将该值放回主子表中。 为什么一个工作,另一个撞坏潜艇

如果我不能让这两个简单的两行函数作为独立于主子函数的函数来工作,我不知道我是否有机会使用宏中一些更复杂的代码部分


请帮助我

我从评论中看到,您已经解决了自己的问题,但我将在这里说明,以供批准

您的函数调用应为:

Call PONumber(FocusSheet)
ByVal仅在函数定义中用于确定函数处理参数的方式。如果要从函数返回值,应使用:

myVal = PONumber(FocusSheet)
正如@Rory所提到的,您不需要选择图纸。事实上,虽然它是完全可行的,但不需要单独的函数。不使用JobNumber函数,您可以编写:

Sheets("Mat. Estim & Data Dump").Range("G3").Value
因此,如果您需要将此单元格的值存储到我怀疑您正在执行的变量中,您可以使用:

myVal = Sheets("Mat. Estim & Data Dump").Range("G3").Value

不选择工作表、单元格、范围和对象会给您带来巨大的性能提升,这是相对的,因为您只访问2个工作表,但是如果您在循环中执行此类操作,它确实会增加,并提供更好的用户体验。程序在选择工作表时不会“闪烁”,尽管您已将屏幕更新设置为False。总之,这是一种更好的编程实践。

我注意到,当您将函数JobNumber作为字符串或函数PONumberByVal FocusSheet作为字符串调用时,您不会输入任何保存该方法返回值的变量。我相信你应该做的是:

Dim sResult as String
sResult = PONumber(FocusSheet)
其次,不要像在函数PONumber中那样选择工作表以从特定单元格中检索值。也不要参考图纸的名称,而不是计算机名称。它应该看起来像以下内容:

Function PONumber(ByVal FocusSheet) As String
    PONumber = Sheet5.Range("M7").Value 'Sheet5 is just an example, you have to use your name
End Function

最后一点建议:如果您处理的工作表的结构在宏的生命周期内可能会发生很大变化,我建议您命名单元格,而不是使用固定地址引用它们。这意味着,您可以使用公式->定义名称将特定单元格命名为ImportantValue,并像下面那样调用它:RangeImportantValue.Value,而不是像下面这样调用地址。这样,即使单元格移动到其他位置,Excel也能检索到所需的值。

宏崩溃的确切含义是什么?如果你得到一个错误,它是什么?顺便说一下,不需要选择表格来读取单元格值。啊哈,我算出来了。只是需要一点额外的代码Rory你是什么意思。。。。类似于“Sheetname”的表单。范围为“M7”??这样做的好处是处理速度稍微快一点吗?我对上述代码的问题是,我需要像PONumberFocusSheet一样调用PONumber,而不是PONumberByVal Focussheet。还将ByVal更改为ByRefSo使用调用PONumberFocusSheet。我不知道为什么在不处理返回值的情况下使用函数。