Tag: 用户定义函数

当另一个工作簿处于活动状态时,UDF引用已命名的表错误

现在已经确定解决scheme了 我是一个build立UDF的VBA新手。 这个UDF包含许多在工作簿中的其他工作表上引用Excel表格的查找函数,比如: Twirecol = Application.WorksheetFunction.VLookup(i, Range("iterationtable"), 2, False) 麻烦的是,如果另一个工作簿处于活动状态,那么当Excel重新计算公式时,将返回一个#VALUE错误。 我看到很多关于如何引用VBA和UDF中的其他工作簿和工作表的解决scheme,但是我不知道如何适当地限制这些表对象,以便他们将注意力集中在UDF所在的工作簿上。 请注意,我正在寻找一个不依赖于工作表名称或工作簿文件名或path的解决scheme,因为所有这些都可能随时间而改变。 这是我的名字经理这个工作簿: 名称经理 这是整个UDF代码: Public Function voltagedrop(trenchlength As Integer, intlength As Integer) As String Application.Volatile Dim TLX As Integer Dim ILX As Integer Dim TVD As Single Dim IVD As Single Dim VD As Single Dim Twirecol As Integer Dim Iwirecol As Integer Dim […]

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包装的方法会更好。

Excel VBA UDF加载项函数#Name错误

我有一个UDF,我写了一个加载项。 我把它放在那里(与其他库),以便我可以改变function,只是部署一个更新的加载项,从而消除了需要修改数百个调用子/函数的工作簿,我需要改变它们。 这一切都在Office 2007中完成。 直到最近当用户开始转向Windows 7时,它运行良好。现在,只有在Windows 7上(XP仍然可以),单元格中存在#Name错误。 这在特定条件下发生(下面的schemeD只是一个问题)。 总之,我有两个工作簿,每个调用,我们称之为“FunctionX”,所以我们假设每个单元格A1都有“= FunctionX(parmA,parmB)”: Scenairo A – 如果我单独打开工作簿(一切正常) 情景B – 我同时打开两个工作簿(一切正常) schemeC-I在不同的情况下分别打开两个工作簿(一切正常) 场景D – 我打开一个工作簿,然后第二个,在同一个Excel实例(#Name第一个工作簿调用FunctionX的单元格中的错误) 我意识到解决方法是只通过场景AC操作,但是我不断得到用户抱怨D.如果他们进入任何调用FunctionName的#Name侵犯单元格,并回车,#Names走开,但编程强迫重新计算不这样做(我最初的尝试在一个创可贴)。 我唯一的办法是编写一个循环遍历所有打开的工作簿的程序,用我的函数进入一个单元格,强制执行代码驱动的用户正在做的事情,或者我错过了什么? 谢谢…任何/所有的build议表示赞赏。

VBA UDF Excel 2010 #VALUE

我已经阅读了有关UDF #VALUE错误的线程,似乎要么我不知道有关VBA能够使用它们,要么我遇到的问题是不一样的。 无论哪种方式,我试图做一个UDF来计算YY:MM格式的一个年龄的月数,根据我创build的公式做了相同的。 Function TOTALMONTHS(YearsMonths As String) Colonz = WorksheetFunction.Find(":", YearsMonths) Yearz = Left(YearsMonths, Colonz – 1) Monthz = Mid(YearsMonths, Colonz + 1, Lengthz – Colonz) Lengthz = Len(YearsMonths) TOTALMONTHS = Yearz * 12 + Monthz End Function 上述代码在Excel 2010中实现时返回#VALUE错误。 任何协助我犯了什么错误将不胜感激! 谢谢! 编辑: 我试图和一个If块来迎合包含“>”在一开始的年龄。 例如,8:6和> 8:6。 我想我可能会在开始的search结果1上得到误报,但不知道为什么。 Function TOTALMONTHS(YearsMonths As String) As Integer If WorksheetFunction.Search(">", […]

无法为Excel UDF返回正确的错误types

我在Excel中写了一个相当简单的UDF,现在我添加了错误检查。 本质上它只是返回string中两个分隔符之间的子串。 如果没有find任何分隔符,我希望它返回#N / A错误(像MATCH那样)。 我是这样做的 If (start_delim_pos = 0 Or end_delim_pos = 0) Then MYFUNCTION= CVErr(xlErrNA) End If 但是,我收到#VALUE错误。 不pipe我放在CVErr函数中,我得到一个#VALUE错误。 任何想法可能是什么问题,以及如何获得所需的错误返回?

Excel自动计算设置

在“Microsoft Office Excel 2007”中有一个复杂的项目,它使用了大量的UDF。 通过Workbook_Open事件中的VBA,我将Excel自动计算设置为OFF,并将计算方法放置在战略位置,以便在需要时手动计算单元格,以便UDF不会无意中执行重新计算。 如果工作簿是唯一在Excel实例中打开(或首先打开)的工作簿,则一切正常。 只有在另一个工作簿(在同一个实例中) 之后打开时,我的项目才会inheritanceFIRST工作簿中的自动计算设置,并对我的UDF执行无限计算。 放置在Workbook_Open事件中的禁用代码在UDF完成计算(可能需要永久)之前不会执行。 这只发生在我的项目不是首先打开的项目上。 通过http://www.decisionmodels.com/calcsecretse.htm ,我发现执行Workbook_Open事件之前执行计算过程是Excel的本质。 所以我明确的问题涉及打开项目后打开另一个工作簿自动计算打开: 如何强制我的项目禁用自动计算,而不先执行重新计算(记住,问题只发生在项目不是第一个被打开,因为它将遵循先前打开的工作簿的设置) 或 … 如何让项目在另一个实例(双击时)中打开以避免inheritance以前工作簿的自动计算设置。 无论哪种方式,我正在寻找的答案是项目打开,而不是先执行计算。 谢谢

使用子/function修改variables

如果它们是肯定的,我想在某些variables前加一个+符号。 例如: Sub mySub() Dim cash As Variant End Sub 如果我这样做,它运作良好: Dim plus As String plus = "+" If cash > 0 Then cash = plus & cash Else cash= cash End If 但是我正在寻找一个子或者函数,如果它们是肯定的,它将会把我所有的variables和在它们前面加上一个+符号。 sub NewSub(i As Variant) If i > 0 Then i = plus & i Else i = i End If End […]

Excel UDF计算应返回“原始”值

我一直在努力处理VBA问题,我会尽可能地彻底地解释它。 我使用我自己的RTD实现创build了一个VSTO插件,我从我的Excel工作表调用。 为了避免在单元格中使用完整的RTD语法,我创build了一个UDF,从表单中隐藏了该API。 我创build的RTD服务器可以通过自定义function区组件中的button启用和禁用。 我想要达到的行为如下: 如果服务器被禁用,并且在单元格中input了对我的函数的引用,我希望单元格显示为Disabled 如果服务器被禁用 ,但function已被启用(并因此显示一个值的单元格)中input一个单元格,我希望该单元格保持显示该值 如果服务器启用 ,我希望单元格显示Loading 听起来很容易。 这是一个非function代码的例子: Public Function RetrieveData(id as Long) Dim result as String // This returns either 'Disabled' or 'Loading' result = Application.Worksheet.Function.RTD("SERVERNAME", "", id) RetrieveData = result If(result = "Disabled") Then // Obviously, this recurses (and fails), so that's not an option If(Not IsEmpty(Application.Caller.Value2)) Then // […]

如何引用UDF中的一系列单元格

c#,ExcelDNA,在我的UDF中,我想传递一系列单元格,MyUDF(A1:A2) 我尝试了MyUDF(object param1),如果我inputmyUDF(A1:A2),MyUDF永远不会被调用,我也试过MyUDF(string param1),MyUDF(string [] param1)都不起作用。 什么types的参数应该是? 谢谢

函数为范围内的每个单元格返回“太低”,“太高”或“OK”

我想要一个函数来运行一系列的单元格,如果: 任何大于NormalValue然后返回“太低”, NormalValue大于范围内的最大值的两倍然后返回“太高”, 这些都不是真的,然后返回“确定”。 这是我到目前为止所提出的: Function TooHighLow(rng As range, NormalValue As Double) For Each cell In rng If Application.WorksheetFunction.Max(cell.Value) > NormalValue Then TooHighLow = "Too Low" ElseIf NormalValue > 2 * (Application.WorksheetFunction.Max(cell.Value)) Then TooHighLow = "Too High" Else TooHighLow = "OK" End If Next cell End Function