2016-04-14 21 views
0

bir prosedür başka makro çağrılan bir prosedür vs bir etkinlik veya kullanıcı girişi çalıştırılan olup olmadığını anlamanın bir yolu var mı? işlem başka bir makro aranırsaKullanıcı girişi veya Aranan prosedür (VBA) vs olay prosedürü

Örneğin, bir Boolean değeri temsil mı?

Açıkçası Aşağıdaki kod boşa gidebilir, ancak fikir.

dim macro 

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

Hayır, içinde bilmenin bir yolu yoktur prosedürü nasıl –

+0

denir cevabım ile yanlış olabilir, ama cevabınızı doğru bir şekilde anlıyorsanız Application.caller kullanarak belirli şekillerde kullanmak istediğiniz bilgileri toplayabilirsiniz. – StormsEdge

+0

@PaulOgilvie, o zaman işleri çok zorlaştırır. –

cevap

0

benim anlayış doğru ise, kararın

için sorgulanan gereken bazı değişken Kodlama sabit alt/prosedür/etkinlik adının yalnızca önemsiz çözümü vardır Ben bu konuda SO içinde ince ve derin konuyu okumuş hatırlamak

için: ve sonunda çok karmaşık çözümlere içine kazma sonra, en basit bir sol ben

yukarıda yazmış ve daha az ayrıntılı bir sürede yapmak, Kamu değişkeni kullanmak neredeyse zorunlu neler oldu örnek:

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 

elbette herhangi UserForm olay işleyicisi denizaltilarina genişletilmesi gerektiği de

daha kesin ve (umarım) ueseful ama uzun versiyonu:

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

Bu yüzden, bir alt çağrılıp çağrılmadığını söylemek için küresel bir değişken kullanıyor musunuz? –

+0

Evet. daha kesin olarak, bir global değişken kullanın ve bir alt/fonksiyon girdiğinizde tanımlayın. Ve eğer "üst" arayanın kaydını tutmak istiyorsanız, o zaman bu ikinci – user3598756

+0

yeniden tanımlanmadan önce herhangi bir alt/işlevi "thingName" in "current" değeri olarak girdiğinizde tanımlanacak başka bir 'public callerName String 'ekleyeceksiniz. İşte yapacağım şey bu. Yardım için seni reddettim. Şerefe –

0

Sen prosedür gelen çağrılan yer hakkında bilgi toplamaktadır Application.Caller kullanabilirsiniz.

benim veri çıkarabilseniz karşılamak için gelen ne yeri bulmak için Application.Caller.Column kullandım. Ben yöntemini kullandım nasıl

Örnek:

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 

Yukarıdaki yayınlanan koduyla bazı sorunlar vardır. Uygulama sözdizimini yanlış kullanıyorsunuz (yanlış anlaşılmadan). Referans vermeye çalıştığınız "ne nesnesi" ne Application.Caller. olarak başvurmalısınız. Prosedürler nesne değildir (en azından benim bildiğim kadarıyla), ancak kodunuzda sunulabilecek olası durumlar nelerdir? Bu bir UDF için mi ve dolayısıyla bir menzile dönebilir mi? Bir sayfa dönebilir mi? Prosedür nerede? Bunlar, bir boole değerini doğru veya yanlış olarak değerlendirecek bir koşulu doğru bir şekilde oluşturmak için cevaplamamız gereken sorulardır.

+0

bir şey öğrendim. ATM, bu bir hata atar –

+0

Peki, bool'unuzun değerini belirlemek için onu koşullu olarak kullanırsınız. Yani Application.Caller.Column = 3 ise o zaman sheetLocationBool = True. Ancak, Application.Caller'dan değişken bir getiri beklediğinizi unutmayın; bu nedenle, uygulamadan alakasız olan bir veri türünü kullanmaya çalışırsanız bir hata almak çok kolaydır. I.E. eğer bir alttan çağrılmışsa ve bir aralık nesnesi gibi davranıyorsanız, bir hata alırsınız (belli ki). – StormsEdge

+0

Bana yardım etmek için bunu nasıl kullanabileceğimi bilmiyorum? Örnek kod? –