Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Attivare pulsanti a distanza

Ultimo Aggiornamento: 09/04/2016 23:48
Post: 2
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 12:10

Salve,
bazzico con vba soltanto da un mesetto e sto cercando di creare una piccola applicazione che mi aiuti nel valutare le competenze dei miei alunni (sono un professore).
Prima di esporvi il problema cerco di spigarvi cosa vorrei ottenere:
ho creato una tabella in cui ho inserito in modo sequenziale le competenze che sto vagliando, così che quelle che stanno sotto sono più complesse di quelle che si trovano sopra.
Accanto alla colonna delle competenze c'è una colonna che contiene i valori VERO/FALSO da modificare per vedere se la competenza è stata raggiunta o no.
Sulle celle di quest'ultima colonna ho posizionato dei pulsanti che, al click, cambiano valore (da VERO a FALSO e viceversa) e modificano anche il valore delle celle sottostanti sulla base del valore del pulsante.
Dato che alcune delle competenze più complesse presuppongo competenze meno complesse, per comodità, modificando in VERO il valore di una delle competenze più complesse "dipendenti" in automatico viene modificato in VERO anche il valore della competenza da cui dipende.

Ora, fino alla riassegnazione dei valori sono riuscito ad arrivare con delle semplici funzioni IF.
Il problema è il seguente:
dato che i vari pulsanti al click eseguono anche altri comandi, il semplice cambiarne il valore mi preclude l'esecuzione di detti comandi.

C'è un modo per "attivare" i bottoni "a distanza" (cioè senza cliccarci direttamente) e non semplicemente cambiarne il valore?

Grazie mille e spero di essere stato abbastanza chiaro.
Post: 3.077
Registrato il: 13/03/2012
Città: LIVORNO
Età: 78
Utente Master
2010
OFFLINE
09/04/2016 12:44

sarai più chiaro se alleghi il file con nomi fittizi

----------
Win 10 - Excel 2010
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Post: 2
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 14:15

Info completa
hai ragione ...
prima di inserire il codice allora specifico meglio:

il contesto è: una tabella con 5 colonne:
prima: numero della componente (chiamo componenti le sottoparti delle competenze di cui parlavo; questo numero serve ad identificarle)
seconda: descrizione competenza
terza: competenza individuata con bottoni VERO/FALSO
quarta: competenza presente (quindi osservabile) con bottoni VERO/FALSO
quinta: possibile dipendenza della competenza con riferimento al numero di serie della competenza da cui dipende

ogni bottone è nominato nel modo seguente:
"numero competenza" & "Competenza Individuata"/"Competenza Presente"

Grazie ancora

ecco il codice che si attiva cliccando su ognuno di questi pulsanti:
Macro che modifica il valore del pulsante cliccato, della cella sottostante e di vari altri pulsanti e celle ad esso collegati::
Sub VeroFalsoClick()
'
'Al click cambia caption bottone cliccato, valore VERO/FALSO cella sottostante e valori bottoni e celle dipendenti_
' e da cui dipende bottone cliccato
'
Dim Cella As Range
Dim NoRif As Range
Dim RifBott As String
Dim Indicatore As Range
Dim Indicatore2 As Range
Dim Riga As Integer
Dim Colonna As Integer
Dim lunghezza As Integer
Dim lunghezza2 As Integer

Set Indicatore = Range("Tabella2[[#Headers],[Componente Individuata]]")
Set Indicatore2 = Range("Tabella2[[#Headers],[Componente Presente]]")
Set NoRif = Range("Tabella2[[#Headers],[Numero Componente]]")
lunghezza = Len(Indicatore)
lunghezza2 = Len(Indicatore2)
'
'Ricava RIGA cella su cui bottone, in base a nome bottone
'(in nome del bottone è composto da un riferimento numerico alla componente da individuare (Numero Componente)_
'e dal nome della componente individuata: p.e. "2Individua informazioni" ("Numero Compoente" + "Componente Individuata"))
'
Rifer = Application.Caller
If IsNumeric(Left(Rifer, 2)) = True Then 'stabilisce quale parte estrarre da nome bottone
RifBott = Left(Rifer, 2)

Else
RifBott = Left(Rifer, 1)

End If

Set r = ActiveSheet.Cells.Find(RifBott, LookIn:=xlValues, _
        After:=Cells(1, 1), _
        lookat:=xlWhole, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext)
Riga = r.Row
'
'Ricavare COLONNA cella su cui bottone, su base nome bottone
'
InizioRif = Len(RifBott) + 1
If Mid(Rifer, InizioRif, lunghezza) = Indicatore Then 'stabilire quale parte estrarre da nome bottone
RifColonna = Indicatore.Value

Else
RifColonna = Indicatore2.Value

End If

Set c = ActiveSheet.Cells.Find(RifColonna, LookIn:=xlValues, _
        After:=Cells(1, 1), _
        lookat:=xlWhole, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext)
Colonna = c.Column
'
'MODIFICA bottone cliccato e cella sottostante
'
If ActiveSheet.Buttons(Rifer).Caption = "Vero" Then
Set Cella = Cells(Riga, Colonna)
Cella.Value = False

ActiveSheet.Shapes(Rifer).Select
With Selection
       .Height = Cella.Height
       .Width = Cella.Width
       .onAction = "VeroFalsoClick"
        .Characters.Text = "Falso"
        .Characters.Font.Name = "Calibri"
        .Characters.Font.FontStyle = "Normale"
        .Characters.Font.Size = 12
        .Characters.Font.Strikethrough = False
        .Characters.Font.Superscript = False
        .Characters.Font.Subscript = False
        .Characters.Font.OutlineFont = False
        .Characters.Font.Shadow = False
        .Characters.Font.Underline = xlUnderlineStyleNone
        .Characters.Font.ColorIndex = 3
End With

Else

Set Cella = Cells(Riga, Colonna)
Cella.Value = True

ActiveSheet.Shapes(Rifer).Select
With Selection
       .Height = Cella.Height
       .Width = Cella.Width
       .onAction = "VeroFalsoClick"
       .Characters.Text = "Vero"
       .Characters.Font.Name = "Calibri"
        .Characters.Font.FontStyle = "Normale"
        .Characters.Font.Size = 12
        .Characters.Font.Strikethrough = False
        .Characters.Font.Superscript = False
        .Characters.Font.Subscript = False
        .Characters.Font.OutlineFont = False
        .Characters.Font.Shadow = False
        .Characters.Font.Underline = xlUnderlineStyleNone
        .Characters.Font.ColorIndex = 5
End With

End If
'
'se "componente presente" FALSO allora anche "componente individuata" FALSO
'
If RifColonna = Indicatore2.Value Then
 If Cella.Value = False Then
 Cella.Offset(0, -1).Value = False
 bottoneaccanto = RifBott & Indicatore
 ActiveSheet.Shapes(bottoneaccanto).Select 
With Selection
       .Height = Cella.Offset(0, -1).Height
       .Width = Cella.Offset(0, -1).Width
       .onAction = "VeroFalsoClick"
       .Characters.Text = "Falso"
       .Characters.Font.Name = "Calibri"
        .Characters.Font.FontStyle = "Normale"
        .Characters.Font.Size = 12
        .Characters.Font.Strikethrough = False
        .Characters.Font.Superscript = False
        .Characters.Font.Subscript = False
        .Characters.Font.OutlineFont = False
        .Characters.Font.Shadow = False
        .Characters.Font.Underline = xlUnderlineStyleNone
        .Characters.Font.ColorIndex = 3
End With
 End If
End If
'
'se "componente individuata" VERO allora anche "componente presente" VERO
'
If RifColonna = Indicatore.Value Then
 If Cella.Value = True Then
 bottoneaccanto = RifBott & Indicatore2
 Cella.Offset(0, 1) = True
 ActiveSheet.Shapes(bottoneaccanto).Select 
With Selection
       .Height = Cella.Offset(0, 1).Height
       .Width = Cella.Offset(0, 1).Width
       .onAction = "VeroFalsoClick"
       .Characters.Text = "Vero"
       .Characters.Font.Name = "Calibri"
        .Characters.Font.FontStyle = "Normale"
        .Characters.Font.Size = 12
        .Characters.Font.Strikethrough = False
        .Characters.Font.Superscript = False
        .Characters.Font.Subscript = False
        .Characters.Font.OutlineFont = False
        .Characters.Font.Shadow = False
        .Characters.Font.Underline = xlUnderlineStyleNone
        .Characters.Font.ColorIndex = 5
End With
'
'se "componente individuata" VERO e presente dipendenza specificata in altra cella accanto_
'allora "componente individuata" da cui dipende VERO
' QUI è il mio problema, perché vorrei attivare questi pulsanti e non cambiarne il valore.
' attivandoli innescherei il loro .onAction, cambiandone il valore invece non si innesca
'
 If Cella.Offset(0, 2) <> "" Then
 bottonesopra = Cella.Offset(0, 2).Value & Indicatore
 Set s = ActiveSheet.Cells.Find(Cella.Offset(0, 2).Value, LookIn:=xlValues, _
        After:=Cells(1, 1), _
        lookat:=xlWhole, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext)
 liv = s.Row
 
 Cells(liv, Colonna).Value = True
  ActiveSheet.Shapes(bottonesopra).Select 
With Selection
       .Height = Cells(liv, Colonna).Height
       .Width = Cells(liv, Colonna).Width
       .onAction = "VeroFalsoClick"
       .Characters.Text = "Vero"
       .Characters.Font.Name = "Calibri"
        .Characters.Font.FontStyle = "Normale"
        .Characters.Font.Size = 12
        .Characters.Font.Strikethrough = False
        .Characters.Font.Superscript = False
        .Characters.Font.Subscript = False
        .Characters.Font.OutlineFont = False
        .Characters.Font.Shadow = False
        .Characters.Font.Underline = xlUnderlineStyleNone
        .Characters.Font.ColorIndex = 5
 End With
  End If
  
  
End If
End If
End Sub
[Modificato da by sal 09/04/2016 15:16]
Post: 3
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 14:18

Info completa
dato che non mi ha messo gli "a capo", allego un file .txt con la macro...
Post: 521
Registrato il: 10/10/2013
Città: VICENZA
Età: 69
Utente Senior
365
OFFLINE
09/04/2016 14:27

ciao
non mi avventuro a ricreare un file che non capisco
ma se al click di un pulsante devo attivare altre macro
è sufficiente il comando
Call " nome macro"
Post: 4
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 14:47

Grazie per il consiglio, ma il fatto è che questa macro opera su delle variabili ricavate da un application.caller (in questo caso un determinato pulsante).
La macro riaverebbe dal pulsante il nome del pulsante e, sulla base del nome, andrebbe a modificare altre celle e pulsanti (il nome, scomposto in varie stringhe, contiene vari riferimenti a oggetti terzi).
La macro funziona così: clicco su un pulsante, mi modifica il pulsante stesso e (almeno) un altro pulsante.
Se non clicco sull'altro pulsante da modificare, la macro, così com'è, mi modifica il suo valore, ma non invoca il comando ad esso associato, perché mi considera come application.caller il primo pulsante cliccato.
Che casino...
Deve pur esserci un modo
Post: 4.763
Registrato il: 14/11/2004
Utente Master
Office 2019
OFFLINE
09/04/2016 15:22

Pulsanti
Ciao ti ho aggiustato il codice, quando inserisci del codice, dopo averlo selezionato e premuto "Code" al posto di "testo" scrivi "vb", riconosce che è visual basic, e dai invio 2 volte.

se vuoi risolvere prima, inserisci il file togliendo dati sensibili, ricostruire un file che poi non sarà come l'originale, mentre lo hai disponibile è una perdita di tempo, non tutti lo fanno.

potrebbero esserci altre soluzioni più snelle capendo il problema.

Ciao By Sal [SM=x423051]

[Modificato da by sal 09/04/2016 15:24]
se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
Post: 5
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 15:43

Giusto, Sal, mi pare una giusta osservazione la tua.
Allego il file excel.
Sono presenti due moduli:
Modulo1: contiene la macro che si attiva al click dei pulsanti
Modulo3: contiene una macro che completa la tabella del foglio con i pulsanti VERO/FALSO

Spero in un vostro aiuto e ancora grazie
[Modificato da basilio.p 09/04/2016 15:43]
Post: 1.805
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Veteran
Excel 365
OFFLINE
09/04/2016 20:50

Ciao a tutti.

Ho aperto per curiosità il file di Basilio ma quando clicco su uno dei pulsanti il codice mi va in debug su questa istruzione

Rifer = Application.Caller


dicendo: " Impossibile trovare il progetto o la libreria"

Se dichiaro la variabile Rifer (come Variant) il codice va nuovamente in debug con lo stesso errore sull'istruzione

If IsNumeric(Left(Rifer, 2)) = True Then 


e mi viene evidenziata l'istruzione Left che è un'istruzione di base del VBA; come è possibile che dica che manca il progetto o la libreria?

Alfredo
Post: 6
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 22:38

Stranezze
alfrimpa, 09/04/2016 20.50:

Ciao a tutti.

Ho aperto per curiosità il file di Basilio ma quando clicco su uno dei pulsanti il codice mi va in debug su questa istruzione

Rifer = Application.Caller


dicendo: " Impossibile trovare il progetto o la libreria"

Se dichiaro la variabile Rifer (come Variant) il codice va nuovamente in debug con lo stesso errore sull'istruzione

If IsNumeric(Left(Rifer, 2)) = True Then 


e mi viene evidenziata l'istruzione Left che è un'istruzione di base del VBA; come è possibile che dica che manca il progetto o la libreria?


[SM=g27833] Che cosa strana... A me non dà alcun problema, non penso di aver toccato nulla a livello di codici di foglio o di applicazione (anche perché non ne sarei capace...)
Post: 7
Registrato il: 31/03/2016
Città: OMEGNA
Età: 39
Utente Junior
2016
OFFLINE
09/04/2016 22:48

può dipendere però dalla versione di excel: io ho lavorato sul 2016
Post: 1.806
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Veteran
Excel 365
OFFLINE
09/04/2016 22:56

Io, come si vede, ho la 2007 ma a livello di VBA non credo sia cambiato molto.

Comunque su una istruzione banale/basilare come Left dire che gli manca il progetto o la libreria mi sembra assurdo.
[Modificato da alfrimpa 09/04/2016 22:57]

Alfredo
Post: 231
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Junior
Excel 2016-32bit Win11
OFFLINE
09/04/2016 23:48

Non va nemmeno nel mio 2010 64bit ma sono comandi vecchi che risalgono ancora ad Excel5 (e forse anche precedenti). In particolare quel comando serve come una costante che fa riferimento alla applicazione di origine (foglio od altro), qualunque esso sia, rendendo universale la macro.
[Modificato da rollis13 09/04/2016 23:50]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 12:45. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com