2016-12-13 79 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