Application.Caller

Pomoč pri izdelavi makrov
Odgovori
dragopre
Prispevkov: 109
Pridružen: To Dec 11, 2012 11:46 pm

Application.Caller

Odgovor Napisal/-a dragopre »

Pozdravljeni

V VBA sestavim list z več 100 oblikami ( kvadrati - rišem rodovnik ). Imena so govoreča in precej dolga.
Pri dogodku ".OnAction" s funkcijo Application.Caller ugotavljam ime gradnika.
Težava pa nastopi, ker funkcija pri daljših imenih vrne samo prvih 30 znakov imena.
Je možno to omejitev "poraviti".
Oziroma, je kakšna druga možnost ugotoviti oziroma nasloviti gradnik, ki je klical proceduro.

Lep pozdrav
Drago
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: Application.Caller

Odgovor Napisal/-a admin »

Podajte vsaj minimalno kodo, da bo razvidno kaj počnete.

Sicer pa ima vsak gradnik lastno metodo, s čimer natančno veste kdo je oz. o katerem gradniku je govora.
lp,
Matjaž Prtenjak
Administrator
dragopre
Prispevkov: 109
Pridružen: To Dec 11, 2012 11:46 pm

Re: Application.Caller

Odgovor Napisal/-a dragopre »

Na list narišem obliko - puščico in jo imenujem npr: PrOseba_0102010101020101020101010101_Gor
Struktura imena pove pozicijo v strukturi rodovnega drevesa in jo rabim za identifikacijo osebe.

Koda: Izberi vse

                                                                ' Puščica GOR - Pregled družine - Član
  If InStr(pKlic, "G") > 0 Then                                 ' Če se zahteva puščica GOR
    nPtop = nShTop + 4                                          ' - Odmik zgoraj
    nPLeft = nShLeft + nShWidth - nPWidth - 5                   ' - Odmik od leve
    cPImeObl = cShImeObl & "_Gor"                               ' - Ime gradnika
    With Worksheets(cList).Shapes.AddShape(msoShapeUpArrow, _
                                           nPLeft, _
                                           nPtop, _
                                           nPWidth, _
                                           nPHeight)
        .Name = cPImeObl
        .Fill.ForeColor.RGB = xBarvaF
        .Line.ForeColor.RGB = xBarvaL
        .Line.Weight = 1
        .Placement = 3
        .Fill.Transparency = 0.5
        .OnAction = "Puščica_Klik"
        .Locked = True
    End With
  End If
V Proceduri "Puščica_Klik" ugotavljam, katera oblika kliče: Application.Caller vrne: PrOseba_0102010101020101020101 ( samo prvih 30 znakov)

Koda: Izberi vse

Sub Puščica_Klik()

  Dim cImeOb As String                                                  ' Ime oblike
  Dim cSmer As String                                                   ' Vrsta ikone (Gor, Dol, Dok)
                                                                    
  cImeOb = Application.Caller 
  cSmer = Right(cImeOb, 3)
  ....  
Lep pozdrav
Drago
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: Application.Caller

Odgovor Napisal/-a admin »

Pozdravljeni,

Rešitev imate veliko. Osnovna, ki bi jo lahko uporabili, ne da bi vedeli karkoli drugega o VBA je, da namesto imen uporabite številke.
V Excelu uporabite poseben list (lahko ga skrijete) in vanj vpisujete poljubno dolga imena, vsaki ime v svojo vrstico. Objekte pa poimenujete s številkami in potem ime dobite tako da preberete celico v ustrezni vrstici. To bi bila preprosta rešitev.

Lahko pa uporabite boljšo rešitev, kjer pa morate znati malce VBA-ja in sicer tako, da vaši funkciji Puščica_Klik (PS: V kodi ne uporabljajte slovenskih znakov, saj boste imeli težave če bote to želeli uporaiti na drugih računalnikih!) preprosto tudi poveste, kdo joje klical in tako dobite ime že kot parameter.

Prilagam minimalni delujoč primer:

Koda: Izberi vse

Sub init()
    Sheet2.Shapes(1).OnAction = "'Puscica_Klik """ & Sheet2.Shapes(1).Name & """'"
End Sub

Sub Puscica_Klik(ImeObjekta As String)
    MsgBox "Klical me je " & ImeObjekta
End Sub
PS: bodite pozornoi na števil dvojnih in enojnih narekovajov, saj so pomembni :)
lp,
Matjaž Prtenjak
Administrator
dragopre
Prispevkov: 109
Pridružen: To Dec 11, 2012 11:46 pm

Re: Application.Caller

Odgovor Napisal/-a dragopre »

Najlepša hvala.

Druga rešitev je prava. Dopolniti sem moral samo par vrstic. Že deluje.

ps.
Sam sem že razmišljal o prvi rešitvi, pa je vaš predlog veliko boljši.
Nisem pa vedel, da pri "OnAction" lahko vključim tudi parameter.
Lepo je imeti tako pomoč. Hvala

Lep pozdrav
Drago
Odgovori