VBA -automatiseringsfel

Denna handledning kommer att förklara vad ett VBA -automationsfel betyder och hur det uppstår.

Excel består av objekt - arbetsbokobjektet, kalkylbladobjektet, intervallobjektet och cellobjektet för att bara nämna några. Varje objekt har flera egenskaper och metoder vars beteende kan styras med VBA -kod. Om VBA -koden inte är korrekt programmerad kan ett automatiseringsfel uppstå. Det är ett av de mer frustrerande felen i VBA eftersom det ofta kan dyka upp utan någon uppenbar anledning när din kod ser helt bra ut!

(Se vår felhanteringsguide för mer information om VBA -fel)

Med hänvisning till en variabel som inte längre är aktiv

Ett automatiseringsfel kan uppstå när du hänvisar till en arbetsbok eller kalkylblad via en variabel, men variabeln är inte längre aktiv.

1234567891011 Sub TestAutomation ()Dim strFile As StringDim wb Som arbetsbok'öppna filen och ställ in variabel för arbetsbokstrFile = Application.GetOpenFilenameAnge wb = Workbooks.Open (strFile)'Stäng arbetsbokenwb.Stäng'försök att aktivera arbetsbokenwb.AktiveraAvsluta Sub

När vi kör koden ovan får vi ett automatiseringsfel. Detta beror på det faktum att vi har öppnat en arbetsbok och tilldelat en variabel till den arbetsboken. Vi har sedan stängt arbetsboken men i nästa kodrad försöker vi aktivera den stängda arbetsboken. Detta kommer att orsaka felet eftersom variabeln inte längre är aktiv.

Om vi ​​vill aktivera en arbetsbok måste vi först ha arbetsboken öppen!

Överbelastning av minne

Detta fel kan också ibland inträffa om du har en loop och du glömmer att rensa ett objekt under loopens loop. Det kan dock bara uppstå ibland och inte andra- vilket är en av anledningarna till att detta fel kan vara så irriterande.

Ta till exempel den här koden nedan:

1234567891011121314151617 Sub InsertPicture ()Dim i As IntegerDim shp som objektFör i = 1 till 100Med kalkylblad ("Sheet1")'ställ in objektvariabelnStäll in shp = .OLEObjects.Add (ClassType: = "Forms.Image.1", Link: = False, DisplayAsIcon: = False, Left: =. Cells (i, "A"). Left, Top: =. Cells ( i, "A"). Topp, bredd: = 264, höjd: = 124)Sluta medMed shp.Object.PictureSizeMode = 3'ladda upp bilden.Object.Picture = LoadPicture ("C: \ data \ image" & i & ".jpg").Object.BorderStyle = 0.Object.BackStyle = 0Sluta medNästa iAvsluta Sub

Variabeln deklareras som ett objekt och sedan UPPSÄTTNING nyckelordet används för att tilldela objektet en bild. Objektet fylls sedan med en bild och sätts in i Excel -arket med viss formatering som sker samtidigt. Vi lägger sedan till en loop till koden för att infoga 100 bilder i Excel -arket. Ibland orsakar detta ett automatiseringsfel, men ibland gör det inte - frustrerande, eller hur?

Lösningen på detta problem är att rensa objektvariabeln i slingan genom att ställa in objektet på INGENTING - detta frigör minnet och förhindrar felet.

12345678910111213141516171819 Sub InsertPicture ()Dim i As IntegerDim shp som objektFör i = 1 till 100Med kalkylblad ("Sheet1")'ställ in objektvariabelnStäll in shp = .OLEObjects.Add (ClassType: = "Forms.Image.1", Link: = False, DisplayAsIcon: = False, Left: =. Cells (i, "A"). Left, Top: =. Cells ( i, "A"). Topp, bredd: = 264, höjd: = 124)Sluta medMed shp.Object.PictureSizeMode = 3'ladda bilden.Object.Picture = LoadPicture ("C: \ data \ image.jpg").Object.BorderStyle = 0.Object.BackStyle = 0Sluta med'rensa objektvariabelnStäll in shp = ingentingNästa iAvsluta Sub

DLL -fel och uppdatering av Windows

Ibland uppstår felet och det finns inget som kan göras inom VBA -koden. Omregistrera DLL-filer som används, se till att vårt Windows är uppdaterat och som en sista utväg, kör en registerkontroll som ibland det enda som kan fungera för att rensa detta fel.

Ett bra sätt att undvika detta fel är att se till att felfällor finns på plats med Vid fel Gå till eller Vid fel Återuppta nästa rutiner.

wave wave wave wave wave