我想知道如何在用作公式时阻止我的UDF执行3次。
Excel 2013(版本:15.0.4859.1002)
我构建了一个用户定义的函数,它必须针对名为“table_Sequence”的excel ListObject验证一组两个值。 如果值存在,则函数返回相应的字母。
基本上,我正在尝试创建一个工具,帮助我们根据某些规则构建SAP FLOC结构。其中一个,第5级是3位数代码,其中包含来自“5-功能列表”选项卡的参考编号,以及在选项卡“设备”,“M”列中输入的每个自定义文本的唯一字母。
所以我的想法是首先检查密钥是否已经存在,如果没有,则在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
答案 0 :(得分:0)
对于那些需要在这个问题上关闭的人,
我放弃了尝试使用UDF来检索正确的代码。 我只是在WorkSheet.Change和WorkSheet.BeforeDoubleClick事件上创建了触发器。
如果您需要我发布代码和数据,请告诉我。
感谢YowE3K和Tom Williams的帮助。