加载函数,引用活动工作表

我创build了一个插件,它有一个function区控件,它在Access数据库上执行SQL语句,并将结果粘贴到右侧一个单元格。 这完美的作品。 它被称为SubTest(c as iribboncontrol)我也有另一个子,称为GetData(arg1,arg2),我打算从工作表中使用,作为= GetData(“01/02/2016”,“打开”),然后一个再次向右,呈现了返回的自定义SQL。 这一切工作正常,直到粘贴ActiveCell.Offset(1, 1).CopyFromRecordset rstData从function,但不是从函数调用工作正常,我缺less一些简单的东西。

像这样获得数据,仍然给出错误

 public sub get_data() activecell.offset(1,1).value="TEST" end sub 

非常感谢

一个函数接受input并返回一个值。 它不能有副作用 1 。 因此, 正如斯科特·克莱纳(Scott Craner)已经提到的 ,你不能调用一个过程来改变从工作表单元格调用的函数内部的单元格值。


有很多这样的事情是错误的:

 Public Sub get_data() ActiveCell.Offset(1,1).Value="TEST" End Sub 

依赖于ActiveCell代码意味着你有其他的代码使用SelectActivate 。 这使得你的代码非常虚弱,容易出错/错误,避免它们( 请参阅如何 )。

避免程序名称中的下划线; 改用PascalCase 。 这不仅仅是“因为它是约定” – VBA将拒绝编译在接口成员名称中强调的更高级的代码; 所以即使你没有使用接口和Implements关键字,也要避免在成员名称中使用下划线。 在VBA中,下划线有一个特殊的含义,比如你可以在事件处理过程中看到: ObjectName_MemberName ,例如Button1_Click

为他们做的事情命名。 “获取数据”将是一个函数的名称,即“获取”一个值[并返回它]。 一个“获得”某种东西是没有意义的。 你的程序不会“得到”任何东西,如果有的话,它“设置”一个值。


1从VBA代码调用的Function过程肯定会有副作用。 事实是,在一个理想的世界里,他们不应该这样做 。 代替副作用代码使用程序 。 Excel工作表函数是纯函数 ,而用户定义的函数也必须是或多或less的纯函数 ,否则它们不能在工作表中使用。 采取一些input,计算一个值,返回该值:这是一个function