2016-12-13 3 views
-4

式として使用されたときにUDFが3回実行されないようにする方法を知りたいと思います。式で使用するとvba UDFが3回実行されます

エクセル2013(ビルド:15.0.4859.1002)を

私は「table_Sequence」という名前のエクセルListObjectに対する2つの値のセットを検証する必要があり、ユーザー定義関数を構築しました。 値が存在する場合、関数は対応する文字を返します。

私は基本的に、特定のルールに基づいてSAP FLOC構造を構築するのに役立つツールを作成しようとしています。そのうちの1つは、レベル5は3桁のコードで、タブ「5機能リスト」からの参照番号と、「装備」列「M」に入力されたすべてのカスタムテキストの固有の文字が含まれています。

私の考えは、キーがすでに存在するかどうかをチェックし、そうでない場合は、table_Sequenceで作成することでした。

コードは正常に動作します。

しかし... このUDFを使用してセルを更新するたびに3回実行されます !!! 私は、この数式を列全体にコピーしたい場合、依存関係が更新されるたびにひどいラグが生じることに気づいています。

何が起こっているのか、どうやってこれを防ぐことができるのか誰かが私に助けられますか?

任意の助けが理解されるであろう、

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" を返しますどっちがいい。この問題に閉鎖を必要とする人のために

'************************************************************************************************** 
'**  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を使用しようとあきらめた: は、それが戻って

を結果を取得する前にのみ、それが3回実行ここではUDFコードです適切なコード。 WorkSheet.ChangeイベントとWorkSheet.BeforeDoubleClickイベントでトリガーを作成しました。

コードとデータを投稿する必要がある場合は、私に知らせてください。

ありがとうございましたYowE3Kとトムウィリアムズが助けてくれてありがとうございます。

+0

ああ、否定的な投票をした人に感謝する。 ... あんまり... – Firefighter1017

関連する問題