Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在excel用户定义函数中使用工作表_Excel_Vba_Excel 2003_User Defined Functions - Fatal编程技术网

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

在excel用户定义函数中使用工作表,excel,vba,excel-2003,user-defined-functions,Excel,Vba,Excel 2003,User Defined Functions,我试图编写的VBA相当简单,但我从未编写过VBA,来自visual studio&C世界,这真是地狱 因此,我非常感谢这里的任何帮助/提示/提示 所以我有两张重要的床单。范围表每个日期有2个值。它需要一个结果,计算表接受两个值并得到一个结果 我想将每个日期的当前值和一年值放入计算表,并将结果放入结果列 所以我尝试定义一个UDF,但后来我知道我不能修改UDF中的工作表内容 我试着录制一个宏,然后希望从那里开始,但我得到了如下结果: Range("A2").Select She

我试图编写的VBA相当简单,但我从未编写过VBA,来自visual studio&C世界,这真是地狱

因此,我非常感谢这里的任何帮助/提示/提示

所以我有两张重要的床单。范围表每个日期有2个值。它需要一个结果,计算表接受两个值并得到一个结果

我想将每个日期的当前值和一年值放入计算表,并将结果放入结果列

所以我尝试定义一个UDF,但后来我知道我不能修改UDF中的工作表内容

我试着录制一个宏,然后希望从那里开始,但我得到了如下结果:

Range("A2").Select
Sheets("24Feb05-24FEB10").Select
Range("K9").Select
ActiveCell.FormulaR1C1 = "=Calc!R[-8]C[-10]"
Range("K9").Select
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
我假设R1C1是行和列,但它到底为什么说-8和-10

有人能帮我找到正确的方向吗

注:大约有2000多个日期

希望我的问题清楚


更新 我还要澄清一些事情:

Im大大简化了计算表,实际上,它需要5个值(有长达6年的列),然后该表调用了其他4个表,并进行了一些财务计算,这是一些技术精通的家伙写的

我试着让财务人员用代数向我表达他在做什么,这样我就可以写出一个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感到头疼


我想找一个小例子,说明我如何将一张表中的值转换成另一张表中的值,然后再将其他值取回来?也许在循环中

您在“相对”模式下录制了宏。R[-8]C[-10]表示:单元格位于当前单元格上方8行和左侧10列。

您可能会使其变得比您需要的更复杂。作为一名程序员,我相信你们会明白,在学习一个新系统时,花一点时间在帮助、谷歌、“傻瓜”书籍等方面是值得的。Excel强调一种与C#截然不同的编程风格

因此,以下是一些选项,从最简单和最常用的Excel开始:

1) 在结果列中使用公式。如果你想做的计算足够简单,这就是方法。举个简单的例子,假设您的计算只是将两个数字相加。你应该把公式

=B2+C2
=myUDF(B2, C2)
将其拖到单元格E2中,然后沿E列向下拖动。Excel将知道如何为E3=B3+C3等创建forumlas

你可以用公式做很多事情。Excel有许多内置的工作表功能,你可以在网上和书店找到大量的资料

2) 在VBA中编写UDF并从结果列调用它。自定义项是不修改工作表中任何其他内容的函数。它只是根据输入参数计算结果。当您在公式中有太复杂的事情无法完成时,或者当您想在多个位置使用公式时,您可以编写一个UDF。(请注意,在一个范围内拖动一个forumla是惯用的Excel,出于干燥的目的,它被算作“一个地方”)

因此,要编写UDF(让我们使用加法示例,但您要编写更复杂的逻辑),您需要在VBA代码模块中放入如下函数:

Public Function myUDF(current, oneYear)
    myUDF = current + oneYear
End Function
然后你会把公式

=B2+C2
=myUDF(B2, C2)
将其拖到单元格E2中,并沿E列向下拖动

注意,在这个例子中,我忽略了错误处理之类的东西。这就是为什么公式比自定义项更“优秀”的原因之一。现在,您必须开始编写与Excel声明式函数风格不同的代码,这是一种不同的思维模式

编辑: 2.5)使用Excel数据表-我很抱歉以前忘记了这一点,但如果您正好有一个或两个单元格作为独立参数,正好有一个单元格作为结果,那么Excel有一个内置的“假设”分析工具,您可以使用。“数据表”这个名称令人遗憾,因为这两个词都被严重重载,但这就是它的名称。你告诉Excel你的输入和输出是什么,它会做你想做的事情。见:

以下是该链接的小介绍:

数据表是指 显示如何更改一个或两个 公式中的变量(公式:A 值序列、单元格引用、, 中的名称、函数或运算符 共同产生一个新的细胞 值。公式总是以 等号(=)将影响 这些公式的结果。数据表 提供计算的快捷方式 在一次操作中产生多个结果,并且 查看和比较结果的方法 所有不同的变化 一起写你的工作表

3) 编写一个宏,将计算表当作函数使用。如果工作表上有非常复杂的逻辑,并且很难转换为VBA,因为它一直在变化,或者因为它是由一个不懂VBA、不熟悉命令式编程的Excel用户开发的,那么您可以这样做。我不打算提供代码,但伪代码可能如下所示:

Range("A2").Select
Sheets("24Feb05-24FEB10").Select
Range("K9").Select
ActiveCell.FormulaR1C1 = "=Calc!R[-8]C[-10]"
Range("K9").Select
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
这与“Excel方式”相差甚远,因为您必须自己设置数据,然后运行宏。如果返回并更改某些“输入”,则需要重新运行宏。(这在某种程度上可以通过使用工作表事件实现自动化。)

很多不熟悉Excel的程序员直接跳到了这一步,将Excel放在一个巨大的网格控件中,而忽略了它存在的原因——自动重新计算

编辑以响应有关的其他信息:

好的,看起来案例(3)是合适的,因为您有一个复杂的工作表,不容易手动转换为VBA或C#cod