在excel用户定义的函数中使用工作表

我试图写的VBA是相当简单的,但我从来没有写VBA和来自Visual Studio&C#世界,这真的是地狱!

所以我真的很感激任何帮助/指针/提示在这里

替代文字

所以我有两个重要的工作表。 范围工作表每个date有2个值。 它需要一个结果,计算表取两个值,并得到我的结果。

我想将每个date的Current和OneYear值放入Calc表格中,并将结果存入结果列。

所以我试着定义一个UDF,但后来我学到了不能修改UDF中的工作表内容。

我试图录制一个macros,然后希望从那里走,但我有这样的事情:

Range("A2").Select Sheets("24Feb05-24FEB10").Select Range("K9").Select ActiveCell.FormulaR1C1 = "=Calc!R[-8]C[-10]" Range("K9").Select 

我假设R1C1是行和列,但为什么在地球上它说-8和-10!

有人能让我走向正确的方向吗?

注意:约有2000多个date。

希望我的问题很清楚!


更新我会清除更多的东西:

大大简化了Calc表格,实际上,它需要5个值(有6列的列)然后,这张表格会调用其他4张表格,然后进行一些技术专家的财务计算。

我试图让财务人员在代数中向我expression他在做什么,所以我可以写一个C#函数。

我也试着写一个UDF,但是就像我说的那样需要放入值并得到结果,这意味着UDF将修改表单

 Function Func1(txt As Variant) As String //Returns the nth element from a delimited text string Dim txt As String txt = text Sheet4.Cells(1, 1) = txt Func1 = Sheet4.Cells(2, 1)//get the result value' End Function 

基本上我有一个头疼痛学习/了解VBA语法和API。

我正在寻找一个小例子 ,我将如何从一个表格中取值到另一个表格,然后得到一些其他的值呢? 也许在一个循环!?

你可能会使这个比你需要的更复杂。 作为一名程序员,我相信你在学习一个新系统的时候,会花上一点时间在Google的帮助下,“傻瓜”书籍等等。 Excel强调的是与C#不同的编程风格。

所以,这里有一些选项,从最简单,最通用的Excel语言开始:

1)在结果栏中使用公式 。 如果你想要做的计算很简单,那么这就是要走的路。 作为一个微不足道的例子,说你的计算只是添加这两个数字。 你会把公式

 =B2+C2 

到单元格E2中,然后将其拖到E列中。 Excel将知道该怎么做,并使E3 = B3 + C3的论坛等等。

你可以用公式做很多事情。 Excel有许多内置的工作表function,你可以在网上和书店find大量的材料。

2) 在VBA中编写一个UDF,并从结果列中调用它。 UDF是一个不会修改工作表中其他任何内容的函数。 它只是根据其input参数计算结果。 当你在一个公式中有太复杂的事情,或者当你想在多个地方使用公式时,你会写一个UDF。 (请注意,拖过一个范围的论坛是惯用的Excel,并计为DRY的“一个地方”)。

所以,为了编写一个UDF(让我们使用另外的例子,但是你会写更复杂的逻辑),你可以把这样一个函数放到VBA代码模块中:

 Public Function myUDF(current, oneYear) myUDF = current + oneYear End Function 

你会把公式

 =myUDF(B2, C2) 

进入单元格E2,然后拖动到E列。

请注意,在这个例子中,我忽略了像error handling这样的东西。 这是公式比UDF更“Excel”的原因之一。 现在,您必须开始编写与Excel的声明式function风格不同的代码,这是一种不同的思维模式。

编辑:2.5) 使用Excel数据表 – 我很尴尬,我忘记了这一点,但如果你有一个或两个细胞是独立的参数,并且恰好一个单元格是你的结果,那么Excel有一个内置的,在“假设”分析工具,你可以使用。 “数据表”这个名字是令人遗憾的,因为这两个词都是如此重载,但这就是所谓的。 你告诉Excel你的input和输出是什么,它会做你想做的。 看到:

http://office.microsoft.com/en-us/excel-help/calculate-multiple-results-by-using-a-data-table-HP010072656.aspx

这里是从这个链接的小介绍:

数据表是一个单元格的范围,它显示了如何在公式中更改一个或两个variables(公式:单元格中的值序列,单元格引用,名称,函数或运算符,它们共同产生一个新值。等号(=)。)会影响这些公式的结果。 数据表提供了在一个操作中计算多个结果的快捷方式,以及在工作表上查看和比较所有不同变化的结果的方法。

3) 写一个使用你的计算表的macros ,就像它是一个函数。 如果您在该表上有非常复杂的逻辑,那么您可能会这样做,而且转换为VBA是非常困难的,因为它始终在变化,或者是由不熟悉VBA且不熟悉的Excel用户开发的与命令式编程。 我不会提供代码,但伪代码可能如下所示:

 Public Sub doCalc() 'for each cell in the result column 'copy the corresponding current and oneYear cells to the calc sheet 'Excel will recalc the calc sheet 'copy the result cell on the calc sheet back to the Range sheet in the right place 'end End Sub 

由于您必须自己设置数据,然后运行macros,因此这与“Excel方式”相差甚远。 如果你回去改变一些“input”,你需要重新运行macros。 (这可以使用工作表事件在一定程度上自动化。)

很多Excel的新手程序员都跳到这一步,将Excel归入一个巨大的网格控制系统,而忽略了它首先存在的原因 – 自动重新计算。

编辑应对问题中的其他信息:

好吧,看起来情况(3)是适当的,因为你有一个复杂的工作表,不容易手动翻译成VBA或C#代码。 下面是一些(过于简化,硬编码,缺乏EH等)代码,让您更深入地了解如何在VBA中执行此操作:

首先,有一个VBAmacros假装它是一个UDF。 请注意,它是一个Sub,而不是一个函数,你不能从公式中调用它。 您可以调用子程序来响应用户的操作,如select菜单选项或按下命令button:

 Public Sub fakeFunct(input1, input2, outputRng As Range) CalcSheet.[b1] = input1 CalcSheet.[b2] = input2 'Excel recalcs what's in cell B3 if you have it set to automatic recalcualation outputRng = CalcSheet.[b3] End Sub 

在这个例子中,“CalcSheet”是工作表模块的“代码名称”。 (欲了解更多信息,请参阅Chip Pearson的优秀网站: http : //www.cpearson.com/excel/codemods.htm )

你实际上是从另外一个循环你的“input”中调用上面的macros:

 Public Sub loopFakeFunct() Dim i As Long For i = 2 To 2000 Call fakeFunct(RangeSheet.Cells(i, 2), RangeSheet.Cells(i, 3), RangeSheet.Cells(i, 5)) Next i End Sub 

这是您响应用户操作或从Worksheet_Change事件等调用的东西。它会变得缓慢而笨拙,我将许多实用的VBA东西留出,但它应该足以让您开始。 (我使用'RangeSheet'而不是'Range'作为表单代码名称,以避免与Range类和Excel定义的Application.Range方法冲突。

4) 使用一些第三方工具将工作表转换为UDF,然后可以像(2)中那样调用它。 这里有一些商业工具可以把你的工作表,让你指定哪些单元格是input和输出,然后生成C ++代码或任何可以编译成XLL加载项。

5) 等待微软这样做:

http://research.microsoft.com/en-us/um/people/simonpj/papers/excel/excel.htm

6) 使用parsing器一

http://www.resolversystems.com/products/resolver-one/

它有一个function,允许您在另一个function中使用整个工作簿,或者在任何Python代码中使用。

您在“相对”模式下录制macros。 R [-8] C [-10]表示:当前单元格左上方的单元格8行,10列。

在这种情况下,它通常是最好的,在Excel范例中工作,而不是转换为C#方式:不知道为什么你需要一个UDF,而不是你的财务人员编写的Excel公式:为什么不能/财务人员只是代码一些公式将投入提供给财务人员表,然后再写一些公式来回馈结果? 如果你真的需要用VBA来做到这一点,那么J Tolle给了你一个重复循环的基本架构,但是我build议你先用公式来做。