Questo che sto per svelare è una cosa che gli americani chiamano "dirthy trick". Anzi, metto le mani avanti: non parlerei di uovo di Colombo, è solo una sciocchezzuola cui di sicuro avranno pensato quanti si sono imbattuti nel seguente:
PROBLEMA Come rendere invisibili, pro tempore, i controlli ActiveX incorporati in un documento Word.
Chi conosce, magari per sentito dire, le "macro" VSTO (Visual Studio Tools per Office) del mondo Visual Studio .NET 2005 sa che rendono possibile la creazione dinamica di controlli, con possibilità di distruggerli e ricrearli (nel senso di resuscitarli, non di sollazzarli!). Bello, così tra l'altro diventa in qualche modo possibile fare di un documento .doc un'interfaccia utente, posizionando qua e là pulsanti di comando e altro del tipo usa-e-getta. Ma come emulare almeno in parte tale virtù nel buon vecchio VBA? In Excel non ci sono troppi problemi a incollare tali oggetti in un foglio di lavoro.
Consiglio: in un modello a più fogli abbastanza complesso dedicatene uno come "copertina" dello stesso. Corredandolo di controlli opportuni e, magari, di hyperlink locali si ottiene qualcosa di più immediato ed efficace delle UserForm (o no?).
Il guaio con Word è che i controlli incorporati vengono stampati, mentre al contrario Excel offre opzioni "native" che lo evita. Per l'esattezza, da un lato i controlli "classici" di Excel, ottenibili con la barra strumenti Moduli, per default non compaiono proprio in stampa, mentre i controlli ActiveX godono della proprietà Visible, che si può, perlomeno, rendere False in una routine di stampa. Esempio:
Private Sub CommandButton1_Click()
'Routine di stampa
'Nascondi il pulsante
CommandButton1.Visible = False
'Anteprima di stampa foglio corrente
ActiveSheet.PrintPreview
'Visualizza di nuovo il pulsante
CommandButton1.Visible = True
End Sub
Disgraziatamente in Word - imminente vers. 2007 compresa - NON esiste una barra Moduli e un volgare bottone ActiveX non gode diosaperché della pur logica proprietà Visible. Per questo motivo chi crea macro VBA per Word le associa a bottoni posti in barre strumenti, normali o personali, soluzione che però non è troppo immediata (l'utente non la nota, se non è avvisato). Fu così che chi scrive tempo fa ha escogitato una macro di stampa lanciata da un pulsante posto in cima al documento che manda in stampa la selezione subito sotto fino al termine del documento stesso.
Ma ecco la soluzione cui sicuramente molti già pensano. Se non si può cancellare / ricreare un controllo lo si può... Fermatevi qui, chiudete questo post e riflettete.... Poi riaprite il mio post e leggete in fondo, dopo i puntini puntini puntini.
puntini
puntini
puntini
puntini
puntini
puntini
puntini
puntini
puntini, aiutatemi a dire puntini
PUNTINI!, capitooooo???
SOLUZIONE. Ovviamente basta rendere invisibile e, se occorre, far riapparire il nostro ipotetico CommandButton1 (o altro più sofisticato controllo). Semplice? Sì però - accidentaccio! - gli ActiveX in Word NON possiedono l'anelata proprietà Visible. Anche qui al contrario di Excel. In altri termini la riga di codice seguente in Excel viene accettata, mentre in Word è rigettata sdegnosamente:
CommandButton1.Visible = False
Ma a tutto c'è rimedio. Come? Ma basta ridurre al minimo le dimensioni, come di sicuro avrete trovato da soli:
With CommandButton1
'Memorizza le dimensioni attuali
OldLarg = .Width
OldAlt = .Height
'Minimizzale. Il pulsante scompare!
.Width = 1
.Height = 1
End With
Si noti che i valori zero non sono accettati, comunque di fatto l'occultamento funziona. Al codice predetto seguiranno le istruzioni del caso, al termine delle quali si potrà inserire il codice di ripristino:
With CommandButton1
'Rissegna le dimensioni originarie
.Width = OldLarg
.Height = OldAlt 'Il pulsante riappare!
End With
?>
?>
?>
?>