[Risolto] Identificazione del pulsante di connessione macro

Creare una macro - Scrivere uno script - Usare le API
Rispondi
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

[Risolto] Identificazione del pulsante di connessione macro

Messaggio da chimico »

Saluti ,

So che quando faccio clic sul pulsante Macro con il tasto destro del mouse, posso facilmente identificare la Macro collegata a questo pulsante, fino a quel momento capisco molto bene .

ora ho bisogno di fare il contrario, se sono all'interno del progetto VBProject e voglio ad esempio cambiare qualche comando da qualche codice VB qualsiasi, quindi chiedo se è possibile identificare quale pulsante del foglio di lavoro che è collegato a questa Macro che sto alterando ?


abbracci amici .
Ultima modifica di chimico il lunedì 4 febbraio 2019, 3:19, modificato 2 volte in totale.
LibreOffice 5.4.4.2 no Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Identificazione del pulsante di connessione alla macro

Messaggio da patel »

Non credo si possa fare, la cosa migliore è inserire un commento prima di ogni sub indicando a quale pulsante è collegata
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
hubert lambert
Volontario
Volontario
Messaggi: 164
Iscritto il: venerdì 9 giugno 2017, 13:48

Re: Identificazione del pulsante di connessione alla macro

Messaggio da hubert lambert »

Ciao a tutti,

Una possibilità sarebbe di percorrere tutti i controlli, cercando gli eventi assegnatigli.
Qualcosa come:

Codice: Seleziona tutto

function da_macro_verso_formulari(libreria, modulo, macro, sede)
    doc = thiscomponent
    controlli = chr(10) + "Uso della macro """ + macro + """ della libreria """ +_
             libreria + """ (" + sede + ")" + chr(10)
    controlli = controlli + string(len(controlli), 95) + string(2, chr(10))
    uri = "vnd.sun.star.script:" + libreria + "." + modulo + "." + macro + "?language=Basic&location=" + sede
    sheets = doc.Sheets
    for each sheet in sheets.ElementNames
        drawpage = sheets.GetByName(sheet).DrawPage
        forms = drawpage.Forms
        for n = 0 to forms.Count -1
            form = forms(n)
            da_formulario_verso_controlli(sheet, form, uri, controlli)
        next n
    next sheet
    da_macro_verso_formulari = controlli
end function

function da_formulario_verso_controlli(foglio, formulario, uri, controlli)
    for n = 0 to formulario.Count -1
        control = formulario(n)
        controltype = replace(control.ServiceName, "stardiv.one.form.component.", "")
        if controltype = "Form" then
            da_formulario_verso_controlli(foglio, control, uri, controlli)
        end if
        scriptevents = formulario.getScriptEvents(n)
        if ubound(scriptevents) >= 0 then
            for each event in scriptevents
                if event.ScriptCode = uri then
                    controlname = control.Name
                    if control.PropertySetInfo.hasPropertyByName("Label") then
                        controlname = control.Label
                    end if
                    controlli = controlli + controltype + " """ + controlname + """ (evento """ + event.EventMethod +_
                            """, foglio """ + foglio + """)" + chr(10)
                end if
            next event
        end if
    next n
    da_formulario_verso_controlli = controlli
end function
La quale macro va utilizzata così:

Codice: Seleziona tutto

sub main
    uso = da_macro_verso_formulari("Standard", "Module2", "trovami", "document")
    msgbox uso
end sub
Cordiali saluti.
Allegati
chimico.ods
(10.96 KiB) Scaricato 147 volte
OpenOffice 4.1.2/4.1.4 | LibreOffice 5.4.4/6.0
Win7 + LinuxMint
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Identificazione del pulsante di connessione alla macro

Messaggio da chimico »

Saluti sr. hubert lambert

La tua macro è stata fantastica, mi ha aiutato molto, lo sto già usando . :bravo: :bravo:

Vorrei fare un'altra domanda, potrei creare un codice che informa il percorso Macro all'interno del progetto VBproject ?

per esempio: il comando InputBox mi chiede il nome della Macro, scrivo il nome della macro, poi il codice indica il percorso di questa macro in VBProject, che informa la libreria e il modulo della Macro che ho digitato nell'InputBox .

Posso farlo all'interno di VBProject usando il comando "Ctrl + H", ma se voglio proteggere con password VBProject, allora quando voglio trovare il percorso della macro, devo rimuovere la protezione .

nota: che il mio file ha più di 100 macros .

Vi abbraccio e vi ringrazio molto per l'aiuto che mi avete già dato . :super: :super:
LibreOffice 5.4.4.2 no Windows 7
hubert lambert
Volontario
Volontario
Messaggi: 164
Iscritto il: venerdì 9 giugno 2017, 13:48

Re: Identificazione del pulsante di connessione alla macro

Messaggio da hubert lambert »

Ecco una proposta :

Codice: Seleziona tutto

sub uso_macro()
    doc = thiscomponent

    scriptprovider = createUnoService("com.sun.star.script.provider.ScriptProviderForBasic")
    scriptprovider.initialize(array(doc))
    macro = trim(inputbox("Nome della macro da trovare:"))
    if macro = "" then exit sub

    uri = percorso_macro(scriptprovider, macro)
    if uri = "" then
        msgbox "Macro """ & macro & """  non trovata."
        exit sub
    end if

    controlli = ""
    sheets = doc.Sheets
    for each sheet in sheets.ElementNames
        drawpage = sheets.GetByName(sheet).DrawPage
        forms = drawpage.Forms
        for n = 0 to forms.Count -1
            form = forms(n)
            da_formulario_verso_controlli(sheet, form, uri, controlli)
        next n
    next sheet
    if controlli = "" then controlli = "Nessuno"

    titolo = chr(10) + "La macro """ + macro + """ è usata da:" + chr(10)
    titolo = titolo + string(len(titolo), 95) + string(2, chr(10))

    msgbox titolo + controlli
end sub

function da_formulario_verso_controlli(foglio, formulario, uri, controlli)
    for n = 0 to formulario.Count -1
        control = formulario(n)
        controltype = replace(control.ServiceName, "stardiv.one.form.component.", "")
        if controltype = "Form" then
            da_formulario_verso_controlli(foglio, control, uri, controlli)
        end if
        scriptevents = formulario.getScriptEvents(n)
        if ubound(scriptevents) >= 0 then
            for each event in scriptevents
                if event.ScriptCode = uri then
                    controlname = control.Name
                    if control.PropertySetInfo.hasPropertyByName("Label") then
                        controlname = control.Label
                    end if
                    controlli = controlli + controltype + " """ + controlname + """ (evento """ + event.EventMethod +_
                            """, foglio """ + foglio + """)" + chr(10)
                end if
            next event
        end if
    next n
    da_formulario_verso_controlli = controlli
end function

function percorso_macro(sp, themacro)
    libraries = sp.ChildNodes
    for each library in libraries
        if library.hasChildNodes() then
            modules = library.ChildNodes
            for each module in modules
                if module.hasChildNodes() then
                    macros = module.ChildNodes
                    for each macro in macros
                        if macro.Name = themacro then
                            percorso_macro = "vnd.sun.star.script:" + library.Name + "." + module.Name + "." + themacro + "?language=Basic&location=document"
                            exit function
                        end if
                    next macro
                end if
            next module
        end if
    next library
    percorso_macro = ""
end function
Nel file allegato, quella proposta va testata con il nome di macro "trovami" o "main".
Allegati
chimico.ods
(11.82 KiB) Scaricato 143 volte
OpenOffice 4.1.2/4.1.4 | LibreOffice 5.4.4/6.0
Win7 + LinuxMint
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Identificazione del pulsante di connessione alla macro

Messaggio da chimico »

è perfetto, ottima macro sr. hubert lambert . :bravo: :bravo: :bravo:

ma, penso che tu non mi abbia capito in questo nuovo dubbio, la mia domanda è Se è possibile informare l'indirizzo Macro in VBproject .

Ho creato un piccolo modello nel foglio di lavoro 1 nelle celle "B13", "B16" e "B17", di quello che sto cercando .

Potrei già mettere questo argomento come Risolto, perché il primo dubbio è già stato risolto perfetto . :)

segue il file .

Molte grazie, amico mio .
Allegati
chimico_2.ods
(15.13 KiB) Scaricato 135 volte
LibreOffice 5.4.4.2 no Windows 7
hubert lambert
Volontario
Volontario
Messaggi: 164
Iscritto il: venerdì 9 giugno 2017, 13:48

Re: Identificazione del pulsante di connessione alla macro

Messaggio da hubert lambert »

chimico.ods
(15.46 KiB) Scaricato 141 volte
Buona sera adesso ;) .
OpenOffice 4.1.2/4.1.4 | LibreOffice 5.4.4/6.0
Win7 + LinuxMint
chimico
Messaggi: 97
Iscritto il: giovedì 22 novembre 2018, 15:20

Re: Identificazione del pulsante di connessione alla macro

Messaggio da chimico »

[Risolto]

sr. hubert lambert ,

la macro è molto perfetta, è stato un finale molto intelligente, è stato bello la macro . :bravo: :bravo: :bravo:

Congratulazioni per la tua grande conoscenza . :bravo: :bravo: :bravo:

e grazie per l'aiuto . :D

amico abbraccio . :super:
LibreOffice 5.4.4.2 no Windows 7
Rispondi