Lagra en användar plats innan Köra ett makro

September 16

John har ett makro som gör viss bearbetning på olika kalkylblad i en arbetsbok. Han vill, i början av makro, för att rädda det cellområde (eller enda cell) som användaren har valt. Han använder ActiveCell.Address att avgöra detta. Sedan, i slutet av makrot vill han återvända till användaren med samma intervall valt att de ursprungligen hade valt.

Problemet är, kan makrot vara klar på en helt annan kalkylblad än där användaren startade och ActiveCell.Address ger bara en celladress, inte ett kalkylblad namn och definitivt inte en rad. John undrar om det bästa sättet att lagra vad han behöver så att han kan återvända till användarens ursprungliga plats i slutet av makrot.

För bästa chans att få någon tillbaka till där de började, det finns tre element: arbetsbok, arbetsblad, och cell. Faktiskt, kan denna sista elementet (cell) vara lite förenklat, eftersom användaren alltid kommer att ha en cell vald (detta är vad som returneras av ActiveCell.Address), men kan dessutom ha ett intervall väljs.

Här är hur du får alla fyra objekt:

Dim rngOrigSelection Såsom Range
Dim rngOrigCell Såsom Range
Dim sOrigWS As String
Dim sOrigWB As String

Ställ rngOrigSelection = Val
Ställ rngOrigCell = Active
sOrigWS = ActiveSheet.Name
sOrigWB = ActiveWorkbook.Name

När du vill senare återvända användaren till där de var, kan du använda den här typen av kod:

Arbetsböcker (sOrigWB) .Activate
Ark (sOrigWS) .Select
rngOrigSelection.Select
rngOrigCell.Activate

Naturligtvis har Excel alltid flera sätt som du kan utföra en viss uppgift. I det här fallet kan du förkorta din kod genom att bara minnas den aktiva cellen och markerade området:

Dim rngOrigSelection Såsom Range
Dim rngOrigCell Såsom Range

Ställ rngOrigSelection = Val
Ställ rngOrigCell = Active

När du vill återställa användaren till platsen, litar du på moderobjektet finns i VBA:

rngOrigSelection.Parent.Parent.Activate
rngOrigSelection.Parent.Select
rngOrigSelection.Select
rngOrigCell.Activate

Moderbolaget Syftet med urvalsintervall du sparade är kalkylbladet där det intervallet ligger, och moder- av det överordnade objektet är arbetsboken i vilken kalkylbladet är belägen.

Ett annat tillvägagångssätt är att helt enkelt skapa, inom ditt makro, ett namngivet område som refererar till vad användaren hade valt:

ActiveWorkbook.Names.Add Namn: = "MyOrigPlace", RefersTo: = Urval

När du gör din behandling, när du är redo att återvända till vad användaren hade valt, använder du denna kod:

Application.Goto Referens: = "MyOrigPlace"
ActiveWorkbook.Names ("MyOrigPlace"). Delete

Den första raden återgår till valet och den andra raden bort då det namngivna området. Den enda nackdelen med detta tillvägagångssätt är att den aktiva cellen inte behålls; koden förutsätter att du vill att övre vänstra cellen i området att vara den aktiva cellen när den är klar. Du bör också vara medveten om att om din behandling tar bort de celler som bygger upp det namngivna området, då koden kanske inte fungerar korrekt-Excel kan inte gå till en plats som inte längre existerar.

Naturligtvis kan du inte komma ihåg vilken plats alls, om du koda din makrot korrekt. Medan VBA tillåter dig att "flytta runt" och välj olika områden av dina kalkylblad och arbetsbok, det är inte nödvändigt i de flesta fall. Du kan till exempel helt enkelt arbeta med olika intervall och sedan göra ditt arbete på dessa intervall, utan att någonsin ändra den aktuella markeringen eller aktiva cellen. Faktum låter VBA du ändra, formatera, sortera, ta bort och göra nästan allt du kan tänka dig till celler utan att faktiskt behöva välja dem.

ExcelTips är din källa för kostnadseffektiv Microsoft Excel utbildning. Detta tips (3285) gäller för Microsoft Excel 97, 2000, 2002, och 2003. Du kan hitta en version av detta tips för menyfliksområdet i Excel (Excel 2007 och senare) här: Lagra en användar plats innan Köra ett makro.