Tag: udf

delphiExcel UDF与变种返回types

我有一个使用ExecuteExcel4Macro注册UDF的加载项。 这工作正常。 只有在当前会话中检测到兼容工作簿时才会注册该加载项。 问题是我想改变当前的UDF从返回只是一个字符,但一个字符或Excel错误。 我发现了一些关于使用types库的文章,但我相信这意味着我的UDF将始终被注册,并且我想在注册时控制它们。 我目前正在注册 ExcelApp.ExecuteExcel4Macro('REGISTER("filepath","add-in-name","AccountDescription","CC","Account Id","My Addin group")'); function AccountDescription ( sAccountId: PChar ) : PChar ; stdcall ; 我正在使用add-in-express来帮助实现Excel自动化。 CC指示该函数接受一个以空字符结尾的string,并期望返回一个以空字符结尾的string。 我不知道我是否可以指定一个变体,所以我可以返回Excel2000.xlErrNa。 编辑:上面修复了函数调用,我忘记了注册。 编辑(2):注册函数中的第四个参数包含udf参数和返回值types。 我不确定如何表示变体。 编辑(3):该dll /项目被称为DynacViews2和DynacViews2.dll源文件中有: exports AccountDescription; 对不起,如果这是一个小碎片。 我想强调的是,这与目前上面的代码一起工作。 问题是试图改变AccountDescription的签名来返回一个OleVariant而不是一个PChar。 更改的原因是我想返回一个string或一个Excel错误。 在线的其他示例(包括add-in-express)显示使用TypeLibrary添加函数并将返回types指定为variant。 这将使用OleVariant创build一个签名,并且可以返回一个string或Excel错误(Excel2000.xlErrNa)。 问题是我正在使用VBA REGISTER函数只添加UDF的,如果工作簿是兼容的。 我可能会错误地解决这个问题。 编辑4: 注册使用示例 – 此链接显示注册使用情况,但不链接到任何微软站点,所以没有解释如何指定参数。

在其他函数之后运行UDF?

我有一个UDF收集其他function的结果,并将其发送到计算和发送响应的Web API。 例如 ABCD 7 =CalcResult(E7, F7) =CalcResult(G7, H7) 234 =SendToAPI(A7,B7,C7) 8 =CalcResult(E8, F8) =CalcResult(G8, H8) 274 =SendToAPI(A8,B8,C8) 9 … … … … 会发生什么事情是,当你运行SendtoAPI它张贴到两个空值和c值,然后在CalcResult完成后的第二个与正确的数据的API两次。 有没有什么方法可以先调用? 将SendToAPI设置为最后一次运行?

如何在VBA Excel UDF参数中使用比较运算符?

我将如何编写UDF,以便他们接受比较运算符的参数? 当使用标准函数时,您可以这样写= countif(range; x) ,您将得到等于x的范围内的单元格数量。 在VBA中复制这个函数看起来像这样: Function countifUDF(rng As Range, x As Integer) count = 0 For Each cell in rng.Cells If cell.Value = x Then count = count + 1 Next cell countifUDF = sum End Function 当使用标准函数时,可以将比较运算符传递给函数,如this = countif(range;“<”&x) ,您将得到范围小于x的单元格数。 我怎么能在UDF中做到这一点? 我的UDF as = countifUDF(range;“<”&x)产生#VALUE 解 Function countifUDF(rng As Range, x As String) […]

Excel VBA #Value! 错误

我有以下function,当我运行它说#value! 错误。 我将不胜感激任何帮助。 Function Bootstrap(S As Object, Z As Object, L As Double) Dim j As Integer Dim a() As Double Dim b() As Double Dim n As Integer Dim Q() As Double Dim sum As Double Dim P As Double ReDim a(1 To n) ReDim b(1 To n) ReDim Q(1 To n) dt = […]

Excel VBA UDF自动更正错误大小写

我有一个Excel VBA插件,添加用户定义的函数(UDF)。 这些function在计算结果方面都很好。 我使用MacroOptions将它们input到函数向导中。 在工作表中使用它们时,它们自动更正大小写的函数名称。 例如,如果函数名为MyFunction,并且用户将其input为myfunction,则在input公式时,会将函数名称的大小写自动更正为MyFunction。 就像使用Excel的内置工作表函数一样,如果input例如中位数,它将自动更正为MEDIAN。 但是,有一个UDF的自动更正是不正确的。 我希望它是例如MyFunction,但即使用户像这样input,它会自动为所有小写myfunction自动更正。 我已经查看了所有相关的代码,并且找不到任何理由。 除了函数名称,函数描述以及函数本身的代码和参数外,所有其他UDF的代码都是相同的。 任何想法为什么这一个UDF autocorcts函数名称不同? 这是一个MacroOptions行的例子: Application.MacroOptions "MyAddin.xla!MyFunction", "Description of MyFunction for the Excel's Function Wizard.", , , , , "Custom category in Function Wizard" UDF本身看起来像这样: Public Function MyFunction(param1 As Long, param2 As Long) As Long 'MyFunction's code here… End Function 再次,UDF计算正确。 问题是与函数名称的自动更正。 我尝试closures插件,然后用新的默认Excel工作簿中受影响的函数创build一个具有相同函数名称的新UDF。 它工作正常 – 它自动更正到正确的情况。 […]

用于连接的Excel VBA UDF正在给出错误消息

我试图在Excel中编写一个用户定义的函数(UDF),将采取一定范围的单元格中的值,并以某种方式连接它们。 具体来说,我想连接它们的方式,结果string可以被粘贴到一个SQL“in”函数 – 即如果我有一个范围在Excel中包含: apples oranges pears 我想要UDF导致'apples', 'oranges', 'pears' (即最后一个值后没有逗号)。 这是我的代码 – 它在VBA窗口中编译好,但是当我在工作表中使用它时,我只是得到错误。 任何想法都非常感谢 – 我在写VBA时有点新手。 并对这个模糊的问题表示歉意。 我只是不知所措,看看是哪一点造成了麻烦。 Function ConcatenateforSQL(ConcatenateRange As Range) As Variant Dim i As Long Dim strResult1 As String Dim strResult2 As String Dim Separator1 As String Dim Separator2 As String Separator1 = "'" 'hopefully the quotes act as escape characters […]

UDF返回格式化的数字

有时我喜欢在同一个单元格中显示数字和文字。 为此,我将单元格自定义格式化为0.00“test”,例如,使用公式=PI()的单元格A1 ,但使用自定义格式进行格式化0.00" test"将返回3.14 test的显示结果。 关键的是,单元格的值没有被格式化 – 仍然可以在另一个单元格中执行=A1 * 3并得到结果 – 因为A1的值仍然是Pi,只是它的显示已经改变。 对于返回一个数值(在我的情况下, Long ,但它可以是任何数字) 的UDF是否有返回一个单元格的方式,以便它显示的方式1,但它是实际值(VBA中的.Value2我相信)是一个数字,而不是文本。 我试过Format(在VBA中,但是它返回一个文本string,我只是格式化我的单元格,我想如何手动,但正如你可以从下面的代码看到,格式是依赖于中间结果(我试图以计算所花费的时间返回格式化的值)。 UDF_RESULT = Format(valueResult.Length, IIf(tElapsed < timeout, "0" & " """ & Round(tElapsed, 2) & "s""", "0")) 这对于Macro来说很容易,但是在UDF中更难。 我可以在模块级别声明所有中间值,然后Worksheet_Calculate()macros可以访问这些值并应用自定义格式,但是UDF包装的方法会更好。

匹配单元格内的任何单词与单元格范围内的任何单词

我有一个短语列表。 我想检查是否有新的条款部分匹配的单词。 我正在寻找一个代码来实现列表上的模糊匹配,以返回具有紧密匹配的单元格。 示例数据: Phrases,Terms real term,new words great work,new term check phrase,more phrase example here,great alpha phrase random,beta new 期望的输出: Phrases,Term,Match real term,new words,No match great work,new term,real term check phrase,more phrase,check phrase/phrase random example here,great alpha,great work phrase random,beta new,No match 我得到了什么: 我尝试使用下面的代码来匹配单元格,如果它被发现: =IF(ISERROR(MATCH("*" & B2 & "*",A:A, 0)), "No Match", VLOOKUP("*" & […]

用户在VBA中定义的函数不工作并返回零,没有数据types不匹配

我正在定义一个用户定义的函数,如下所示,当我试图在子程序中调用它时,它返回一个“零”值,这肯定是错误的。 Function Getpartialderiv_K_x(x As Variant, y As Variant, P As Variant, T As Variant, hx As Variant, dx As Variant) As Variant Dim i As Integer ReDim dx(1 To UBound(x, 1)) As Variant 'record the original value for x Dim original_x As Variant original_x = x 'calc f(x+1) For i = 1 To UBound(x, 1) […]

复制工作表时出现#VALUE错误

我使用的UDF基本上是一个简化的查找。 这里是代码: Function SUELDOBASICO(Columna As Integer) As Double SUELDOBASICO = Application.WorksheetFunction.VLookup(Application.Caller.Parent.Cells(Application.Caller.Row, 3), Application.Caller.Parent.Parent.Sheets("Escalas Salariales").Range("A3:DJ23"), Columna, False) End Function 我注意到,有时当复制工作表(在同一个工作簿)时,我得到一个#VALUE错误。 如果我在Excel中“编辑”单元格,只要使用F2和Enter就不会改变,错误消失。 它曾经发生,当简单地改变窗口(例如对Firefox,并且回到Excel)。 这就是为什么我在代码中使用Caller和Parent原因。 它几乎是完全固定的,除非有时复印纸张。 我似乎无法find错误的来源。 请帮助。