Memorizzazione della posizione di un utente prima di eseguire una macro (Microsoft Excel)
John ha una macro che esegue alcune elaborazioni su vari fogli di lavoro in una cartella di lavoro. Vuole, all’inizio della macro, salvare l’intervallo di celle (o la singola cella) che l’utente ha selezionato. Usa ActiveCell.Address per determinarlo. Quindi, alla fine della macro, vuole tornare all’utente con lo stesso intervallo selezionato che aveva originariamente selezionato.
Il problema è che la macro potrebbe essere terminata su un foglio di lavoro completamente diverso da quello in cui ha iniziato l’utente e ActiveCell.Address fornisce solo un indirizzo di cella, non un nome di foglio di lavoro e sicuramente non un intervallo. John si chiede quale sia il modo migliore per memorizzare ciò di cui ha bisogno in modo da poter tornare alla posizione originale dell’utente alla fine della macro.
Per la migliore possibilità di riportare qualcuno al punto di partenza, ci sono tre elementi: cartella di lavoro, foglio di lavoro e cella. In realtà, questo ultimo elemento (cella) potrebbe essere un po ‘semplicistico, poiché l’utente avrà sempre una cella selezionata (questo è ciò che viene restituito da ActiveCell.Address), ma potrebbe anche avere un intervallo selezionato.
Ecco come ottieni tutti e quattro gli oggetti:
Dim rngOrigSelection As Range Dim rngOrigCell As Range Dim sOrigWS As String Dim sOrigWB As String Set rngOrigSelection = Selection Set rngOrigCell = ActiveCell sOrigWS = ActiveSheet.Name sOrigWB = ActiveWorkbook.Name
Quando in seguito vuoi riportare l’utente dov’era, puoi usare questo tipo di codice:
Workbooks(sOrigWB).Activate Sheets(sOrigWS).Select rngOrigSelection.Select rngOrigCell.Activate
Ovviamente, Excel ha sempre diversi modi per eseguire una determinata attività. In questo caso, potresti accorciare il tuo codice ricordando solo la cella attiva e l’intervallo selezionato:
Dim rngOrigSelection As Range Dim rngOrigCell As Range Set rngOrigSelection = Selection Set rngOrigCell = ActiveCell
Quando vuoi ripristinare l’utente nella posizione, ti affidi all’oggetto padre disponibile in VBA:
rngOrigSelection.Parent.Parent.Activate rngOrigSelection.Parent.Select rngOrigSelection.Select rngOrigCell.Activate
L’oggetto padre dell’intervallo di selezione salvato è il foglio di lavoro in cui si trova quell’intervallo e l’oggetto padre di quell’oggetto padre è la cartella di lavoro in cui si trova il foglio di lavoro.
Un altro approccio consiste nel creare semplicemente, all’interno della macro, un intervallo denominato che si riferisce a ciò che l’utente ha selezionato:
ActiveWorkbook.Names.Add Name:="MyOrigPlace", RefersTo:=Selection
Dopo aver completato l’elaborazione, quando sei pronto per tornare a ciò che l’utente aveva selezionato, usi questo codice:
Application.Goto Reference:="MyOrigPlace" ActiveWorkbook.Names("MyOrigPlace").Delete
La prima riga torna alla selezione e la seconda riga quindi elimina l’intervallo denominato. L’unico inconveniente di questo approccio è che la cella attiva non viene mantenuta; il codice presuppone che si desidera che la cella in alto a sinistra nell’intervallo sia la cella attiva al termine. È inoltre necessario tenere presente che se l’elaborazione elimina le celle che compongono l’intervallo denominato, il codice potrebbe non funzionare correttamente: Excel non può andare in un luogo che non esiste più.
Ovviamente, potresti non dover ricordare alcuna posizione, se codifichi correttamente la tua macro. Sebbene VBA ti consenta di “spostarti” e selezionare diverse aree dei fogli di lavoro e della cartella di lavoro, nella maggior parte dei casi ciò non è necessario. Ad esempio, potresti semplicemente lavorare con intervalli diversi e quindi fare il tuo lavoro su quegli intervalli, senza mai cambiare la selezione corrente o la cella attiva. In effetti, VBA ti consente di modificare, riformattare, ordinare, eliminare e fare quasi tutto ciò che puoi immaginare sulle celle senza bisogno di selezionarle.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (6161) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 ed Excel in Office 365. Puoi trovare una versione di questo suggerimento per l’interfaccia di menu precedente di Excel qui: