2016-04-14 19 views
0

プロシージャーがイベントまたはユーザー入力から実行されているか、別のマクロから呼び出されたプロシージャーかを判別する方法はありますか?ユーザー入力またはイベントプロシージャーと呼び出されたプロシージャー(VBA)

たとえば、プロシージャが別のマクロから呼び出された場合は、Booleanの値が表示されますか?

明らかに、以下のコードは問題ですが、あなたはそのアイデアを得ます。

dim macro 

    macro = called.proccedure 
    if macro = true then 
     'do what ever 
    end if 
+0

はありません、に知る方法はありませんどのように呼び出されるのか –

+0

私の答えは間違っている可能性がありますが、答えを正しく理解していれば、Application.callerを使用して特定の方法で情報を収集できます。 – StormsEdge

+0

@PaulOgilvie、これは非常に困難です。 –

答えて

0

私の理解が正しければ、決定

を照会するためにいくつかの変数にハードコーディングサブ/手順/イベント名の唯一の自明な解があると私はこのことについてSOで罰金と深いスレッドを読んで覚えています

のため:そして最後に、非常に複雑なソリューションを掘り下げる後、最も簡単な1つの左は私が

の上に書いて、それがそれほど冗長できるだけそれを作るために、パブリック変数を使用することはほぼ必修何でした例:

Option Explicit 

Public thingName As String 


Sub main() 

thingName = "Main" '"Mark" you're in 'Main' sub 

'... 
Call DoSomething 'call DoSomething() procedure 

End Sub 


Sub DoSomething() 

thingName = "DoSomething" '"Mark" you're in 'DoSomething' sub 

MsgBox ReturnSomething ' ReturnSomething() function 

'... 

End Sub 


Function ReturnSomething() 

thingName = "ReturnSomething" '"Mark" you're in 'ReturnSomething' Function 

'... 
ReturnSomething = "something" 

End Function 

はもちろん、任意のユーザーフォームのイベントハンドラの潜水艦に拡張する必要があることをあまりにも

より正確で(たぶん)uesefulが、長いバージョンは次のとおりです。

Option Explicit 

Public Type Thing 
    Name As String 
    Type As String 
    Job As String 
End Type 
Dim myThing As Thing 


Sub main() 

'"Mark" you're in 'Main' sub 
With myThing 
    .Name = "Main" 
    .Type = "Sub" 
    .Job = "main procedure" 
End With 

'... 
Call DoSomething 'call DoSomething() procedure  

End Sub 


Sub DoSomething() 

'"Mark" you're in 'DoSomething' sub 
With myThing 
    .Name = "DoSomething" 
    .Type = "Sub" 
    .Job = "procedure to do something" 
End With 


MsgBox ReturnSomething 'call ReturnSomething() function 

'... 

End Sub 


Function ReturnSomething() 

'"Mark" you're in 'ReturnSomething' Function 
With myThing 
    .Name = "ReturnSomething" 
    .Type = "Function" 
    .Job = "procedure to return something" 
End With 

'... 
ReturnSomething = "something" 

End Function 
+0

グローバル変数を使用すると、サブが呼び出されたかどうかを知ることができます。 –

+0

はい。より正確には、グローバル変数を使用し、サブ/関数を入力するたびに定義します。また、親の呼び出し元を追跡したい場合は、後者を再定義する前に、 'thingName'の「現在の」値としてサブ/関数を入力するときに定義される別の' public callerName as String 'を追加します。 – user3598756

+0

ありがとうそれは私がやることです。あなたの助けを借りてくれました。乾杯 –

0

Application.Callerを使用して、プロシージャがどこから呼び出されているかについての情報を収集できます。

私はApplication.Caller.Columnを使用して、条件を満たすために私のデータがどこから来たのかを調べました。私はこの方法を使ってきた方法の

例:

If Application.Caller.Column = 20 Then Call ChangeDirectionForSellSide(firstLegBuySell, secondLegBuySell, futureLegBuySell) 

    'First option leg built 
    chatConfirmString = "You " & firstLegBuySell & " " & Format(firstLegQuantity, "#,##0") & DetermineProductMeasurementType(productType, tradeDataRange.Item(2).Value, contractMonth) & " " & productType & " " & tradeDataRange.Item(2).Value & " " & contractMonth & " " & Format(tradeDataRange.Item(6).Value, "#,###.00##") & " " & tradeDataRange.Item(7).Value & " @ " 

    'Formats the price type 
    If productType = "WTI" Or productType = "BRT ICE" Or productType = "FO 3.5%" Or productType = "GO" Then 

     chatConfirmString = chatConfirmString & Format(tradeDataRange.Item(8).Value, "#,###.00") 

    Else 

     chatConfirmString = chatConfirmString & Format(tradeDataRange.Item(8).Value, "#,###.0000") 

    End If 

あなたは上記の投稿のコードを持ついくつかの問題があります。 アプリケーションの構文が間違っている(誤解から)参考にしようとしているものは、「これまでに何があったのか」とApplication.Caller.と言わなければなりません。プロシージャはオブジェクトではありません(少なくとも私の知識ではありません)が、あなたのコードにはどのような状況がありますか?これはUDFのためのものなので範囲を返すことができますか?シートを返すことはできますか?手続きはどこですか?ブール値を真または偽と評価する条件を正確に作成するためには、これらの質問が必要です。

+0

どうやってそれをブール変数に入れますか? ATM、それはエラーを投げます –

+0

あなたはあなたのブールの価値を判断する条件としてそれを使用します。したがって、Application.Caller.Column = 3の場合、sheetLocationBool = True。ただし、Application.Callerからの戻り値が可変であることを期待しているので、アプリケーションからのデータ型を無関係に使用しようとするとエラーが発生しやすくなります。 I.サブオブジェクトから呼び出され、範囲オブジェクトのように扱っている場合は、エラーが表示されます(明らかに)。 – StormsEdge

+0

私はこれを使って私を助けてもらえませんか?コード例? –

関連する問題