我如何使用excel vba中的模块函数将值设置为范围?
我想在Excel VBA模块中做一个简单的函数,所以我可以在Excel中使用它作为自定义函数。 (我使用Excel 2003或2007,这没关系)
我在一个新的工作簿中创build一个函数(!),如下所示:
Function a() Sheets(1).Range("A1").Value = 4 end function
但是当我尝试在sheet1上使用它,它不会工作! 我尝试了很多东西。
我怎么做这个工作(没有解决方法,我想用它作为一个自定义函数)?
请帮忙。 谢谢,gadym
使用其他单元格的函数不能成为Excel中的公式函数(UDF),因为它打破了Excel的依赖关系模型(所有单元格依赖项必须在公式中是显式的)。 然而公式可以使用单元值作为input。
这是一个简单的function添加到VBA中的模块:
Public Function testFunction(inputValue As Integer) As Integer testFunction = inputValue * 2 End Function
这可以在任何单元格公式中使用。 例如, =testFunction(4)
或=testFunction(A5)
。
编辑
好的,回顾一下你对吉祥物回答的评论。 一个公式只能向它所在的单元发送一个答案 – 它不能向另一个单元发送答案。 因此,如果一个公式是您唯一的select,您必须在单元格A1中具有一个从C1读取input的公式。
A1中的公式:
=a(C1)
模块中的function:
Public Function a(string col) a = iif(col = "ok", "1", "2") End Function
但是,如果在将公式放入A1中时出现问题,则会留下手动驱动的stream程(工作表button,工具栏button等来推送这些值)或工作表单元格更改事件。 工作表事件的不利之处在于,它会触发每一个单元格的更改,所以您需要保持代码清晰,不要做任何繁重的工作 – 或者如果这样做,那就太难了。
您将添加一个新的子例程到工作表中:
Private Sub Worksheet_Change(ByVal Target As Range)
无论何时更改单元格,都会触发此操作 Target
范围指示更改的单元格。 如果目标包含 C列单元格,您的代码将更新A列单元格。 这是比公式方法更多的工作,但它确实使过程完全自动化。 我现在无法访问Excel,因此以下内容仅仅是来自内存和谷歌search的片段,未经testing:
For Each cCell In Application.Intersect(Target, Me.Range("C1:C5")) cCell.Offset(, -2).Value = iif(cCell.Value = "ok", "1", "2")
我不希望使用明确的范围,而是一个命名的范围,因为它使你的代码变得更加脆弱。 但是,这将使find相应的A列单元格更难确定,我不会尝试没有Excel的代码手=)
它看起来像你试图在你的电子表格中编程改变一个单元格的值。 这可以做到,但正如Joel Goodwin所指出的,这不能用“用户定义的function”来完成。 但是,您可以使用macros或在工作表中添加一个button并将代码放在button中执行此操作。
例如,通过转到“视图”>“工具栏”>“控件工具箱”(对于较新版本的Excel,这将有所不同)并selectbutton控件并将其添加到工作表中,从而为工作表添加一个button。 一旦添加button,双击它。 这应该调出Visual Basic编辑器。 把你的代码放在它提供的Sub
的主体中,像这样:
Private Sub CommandButton1_Click() Sheets(1).Range("A1").Value = 4 End Sub
回到你的工作表,并禁用devise模式在控制工具箱(它是在其中的浅蓝色三angular形的图标)。 在devise模式禁用的情况下,单击button,单元格A1的值将更改为4。
如果单元格A1包含公式= a(),并且您希望A1显示4(或其中的公式= a()的任何其他单元格),那么您需要将您的代码更改为:
Function a() a = 4 End Function