Renato dall'Italia chiede:
Come posso aprire una cartella di lavoro in VBA scegliendo da un elenco? Quando registro una macro, codifica il nome del file selezionato nella macro.
C'è un comando in VBA chiamato GetOpenFileName. Visualizza la casella Apri file. È possibile navigare in una directory, selezionare il file e quindi fare clic su Apri. A questo punto, il comando non apre il file, si limita a restituire il nome al programma. Ecco un esempio del codice in uso:
Sub TestIt() NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file") If NewFN = False Then ' They pressed Cancel MsgBox "Stopping because you did not select a file" Exit Sub Else Workbooks.Open Filename:=NewFN End If End Sub
Roger chiede:
Come posso far eseguire una macro prima che un file venga chiuso o salvato?
La macro deve essere inserita nel riquadro del codice associato a "ThisWorkbook". Dal menu a discesa a destra, seleziona BeforeClose o BeforeSave.
Ken scrive:
Ho un gestore di eventi del foglio di lavoro che esegue un ciclo, almeno 16 volte. Cosa sta succedendo?
Il gestore di Ken era semplice: se la voce non fosse numerica, cambierebbe la voce in maiuscolo. Ecco il problema. Quando ha cambiato il valore della voce in maiuscolo, si tratta di un'altra modifica del foglio di lavoro e l'evento si attiva di nuovo. Ogni volta che si attivava l'evento di modifica, Ken cambiava il foglio di lavoro e la macro veniva chiamata in modo ricorsivo, fino a quando lo stack di chiamate non esauriva la memoria.
La soluzione è interrompere temporaneamente l'esecuzione degli eventi mentre si modifica il valore in lettere maiuscole. Puoi farlo modificando il valore di Application.EnableEvents su False. Ecco la macro corretta:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Not IsNumeric(Target.Value) Then Application.EnableEvents = False Target.Value = UCase(Target.Value) Application.EnableEvents = True End If End Sub
Andy dal Regno Unito pone la domanda più interessante di oggi.
Ho una routine VBA in una cartella di lavoro che crea molte altre cartelle di lavoro. Vorrei poter aggiungere dinamicamente un collegamento ipertestuale in ogni nuova cartella di lavoro che punterà alla cartella di lavoro che ha generato le nuove cartelle di lavoro.
Andy, questa è un'idea interessante. Senza il vantaggio di vedere il tuo codice, posso immaginare che qualcosa del genere funzionerebbe:
Sub Testit() Creator = ActiveWorkbook.FullName '… . Andy's code to create the new workbook… . ActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _ Creator, TextToDisplay:="Click Here to Return to " & Creator End Sub