excel vba UDF在公式中使用时执行3次

时间:2016-12-13 19:05:57

标签: vba excel-vba user-defined-functions excel

我想知道如何在用作公式时阻止我的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

1 个答案:

答案 0 :(得分:0)

对于那些需要在这个问题上关闭的人,

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

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

感谢YowE3K和Tom Williams的帮助。