我如何使用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