2016-12-13 83 views
-4

我想知道在用作公式时如何防止我的UDF执行3次。excel vba UDF在公式中使用时执行3次

的Excel 2013(编译:15.0.4859.1002)

我建立了一个用户定义函数必须验证一组针对一个Excel的ListObject两个值命名为“table_Sequence”的。 如果这些值存在,该函数将返回相应的字母。所以基本上,我试图创建一个工具来帮助我们建立基于特定规则的SAP FLOC结构。其中一个级别是3位数字代码,其中包含来自选项卡“5-函数列表”的参考编号以及在选项卡设备列“M”中输入的每个Customtext的唯一字母。

所以我的想法是首先检查键是否已经存在,如果没有,请在table_Sequence中创建它。

该代码工作正常。

但是...... 它运行每次三次我使用UDF更新单元! 所以我担心如果用户想要在整个列中复制这个公式,那么只要依赖关系被更新,它就会产生一个可怕的滞后。

有人可以帮助我了解发生了什么,以及如何防止这种情况发生?

任何帮助将不胜感激,

table_Sequence看起来是这样的:

Struct    |CustomText |Letter 
---------------- |------  |--- 
2151-05-01-22-23 |#1 L1  |B 
2151-05-01-22-86 |#2 L1  |A 

所以在一个小区我所说的UDF这样的:

=GetNextSequence("2151-05-01-22-23";"#1 L1") 

,并返回 “B”这很好。 只有它执行3次它得到的结果返回

这里的UDF代码之前:

'************************************************************************************************** 
'**  Name:  GetNextSequence 
'**  Purpose: Assign next sequence for current structure element 
'** 
'**  Input:  Current Cell 
'**     Level Number at which we may stop the structure 
'** 
'**  Output:  Sequence string 
'** 
'************************************************************************************************** 
Public Function GetNextSequence(Struct As String, CustomText As String) As String 

Dim i As Long 
Dim Result As Variant 
Dim suffix As String 
Dim NewRow As Range 
Dim tbl As ListObject 
Application.EnableEvents = False 
Application.ScreenUpdating = False 

'** Filter and sort sequence table 
Set tbl = ActiveWorkbook.Worksheets("Sequence").ListObjects("table_Sequence") 
tbl.Sort.SortFields.Clear 
tbl.Sort.SortFields.Add Key:=Range("table_Sequence_1[Letter]"), SortOn:= _ 
    xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
With tbl.Sort 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 
tbl.Range.AutoFilter Field:=1, Criteria1:=Struct 
tbl.Range.AutoFilter Field:=3, Criteria1:=CustomText 
'** Store Last letter used 
suffix = tbl.ListRows(1).Range.Cells(1, 3).Value 

If tbl.ListRows.Count = 0 Then 
    '** Increment sequence 
    suffix = Chr(Asc(suffix) + 1) 
    '** Add row and return new letter 
    Set NewRow = tbl.ListRows.Add.Range 
    iColumn = tbl.ListColumns("Letter").Index 
    NewRow.Cells(1, 3).Value = suffix 
    NewRow.Cells(1, 1).Value = Struct 
    NewRow.Cells(1, 2).Value = CustomText 

End If 

GetNextSequence = suffix 

Application.EnableEvents = True 
Application.ScreenUpdating = True 

End Function 
+5

[请编辑您的问题以包含相关代码](http://stackoverflow.com/posts/41128718/edit)。没有多少人会(应该)下载并打开一个随机启用宏的Excel文件,并假设他们会这样做,这个问题不会帮助任何其他人遇到类似问题,如果链接失效。 – Comintern

+4

有许多不会从公共论坛下载启用宏的工作簿。请包括代码并描述您在原始文章中的使用方式。 –

+5

我没有下载启用宏的病毒,也没有人应该。这不是这个网站的工作原理。 –

回答

0

对于那些需要封闭在这个问题上,

我放弃了试图使用UDF中检索正确的代码。 我只是在WorkSheet.Change和WorkSheet.BeforeDoubleClick事件上创建触发器。

如果您需要我发布代码和数据,请告诉我。

感谢YowE3K和Tom Williams的帮助。

+0

哦,并且感谢那些投反对票的人,它真的让我觉得我的贡献很重要。 ... 不是真的... – Firefighter1017