10 sposobów na przyspieszenie makr

Ponieważ makra programu Excel stają się coraz bardziej niezawodne i złożone, może się okazać, że tracą wydajność. W przypadku makr słowo wydajność jest zwykle synonimem szybkości . Szybkość to szybkość, z jaką procedury VBA wykonują zamierzone zadania. Poniżej przedstawiono dziesięć sposobów, aby pomóc utrzymać działanie makr programu Excel na optymalnym poziomie wydajności.

Zatrzymanie obliczeń arkusza

Czy wiesz, że za każdym razem, gdy komórka, która ma wpływ na dowolną formułę w arkuszu kalkulacyjnym, zostanie zmieniona lub zmodyfikowana, program Excel ponownie oblicza cały arkusz? W arkuszach zawierających dużą liczbę formuł takie zachowanie może drastycznie spowolnić działanie makr.

Możesz użyć właściwości Application.Calculation, aby poinformować program Excel, aby przełączył się w tryb obliczania ręcznego. Gdy skoroszyt jest w trybie obliczeń ręcznych, skoroszyt nie zostanie ponownie obliczony, dopóki jawnie nie uruchomisz obliczenia, naciskając klawisz F9.

Umieść program Excel w trybie ręcznego obliczania, uruchom kod, a następnie przełącz się z powrotem do trybu automatycznego obliczania.

Submakro1()
Application.Calculation = xlCalculationManual
 'Umieść tutaj swój kod makra
Aplikacja.Calculation = xlCalculationAutomatic
Napis końcowy

Ustawienie trybu obliczania z powrotem na xlCalculationAutomatic automatycznie uruchomi ponowne obliczenie arkusza, więc nie ma potrzeby naciskania klawisza F9 po uruchomieniu makra.

Wyłączanie aktualizacji ekranu arkusza

Możesz zauważyć, że po uruchomieniu makr ekran dość mocno migocze. To migotanie oznacza, że ​​program Excel próbuje przerysować ekran, aby pokazać bieżący stan arkusza roboczego. Niestety, za każdym razem, gdy Excel przerysowuje ekran, zajmuje zasoby pamięci.

Możesz użyć właściwości Application.ScreenUpdating, aby wyłączyć aktualizacje ekranu, dopóki makro nie zostanie ukończone. Wyłączenie aktualizacji ekranu oszczędza czas i zasoby, dzięki czemu makro działa trochę szybciej. Po zakończeniu działania kodu makra możesz ponownie włączyć aktualizowanie ekranu.

Submakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fałsz
 'Umieść tutaj swój kod makra
Aplikacja.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Prawda
Napis końcowy

Po ustawieniu właściwości ScreenUpdating z powrotem na True, program Excel automatycznie uruchomi przerysowanie ekranu.

Wyłączanie aktualizacji paska stanu

Pasek stanu programu Excel, który pojawia się u dołu okna programu Excel, zwykle wyświetla postęp niektórych działań w programie Excel. Jeśli Twoje makro pracuje z dużą ilością danych, pasek stanu zajmie trochę zasobów.

Należy pamiętać, że wyłączenie aktualizacji ekranu jest czymś innym niż wyłączenie wyświetlania paska stanu. Pasek stanu będzie nadal aktualizowany, nawet jeśli wyłączysz aktualizację ekranu. Możesz użyć właściwości Application.DisplayStatusBar, aby tymczasowo wyłączyć wszelkie aktualizacje paska stanu, dodatkowo poprawiając wydajność makra:

Submakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fałsz
Application.DisplayStatusBar = False
 'Umieść tutaj swój kod makra
Aplikacja.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Prawda
Application.DisplayStatusBar = Prawda
Napis końcowy

Mówienie programowi Excel, aby ignorował zdarzenia

Możesz zaimplementować makra jako procedury zdarzeń, informując program Excel o uruchamianiu określonego kodu, gdy arkusz lub skoroszyt ulegnie zmianie.

Czasami standardowe makra wprowadzają zmiany, które wyzwalają procedurę zdarzenia. Na przykład, jeśli masz standardowe makro, które manipuluje kilkoma komórkami w Arkuszu1, za każdym razem, gdy zmienia się komórka w tym arkuszu, makro musi zostać wstrzymane na czas działania zdarzenia Worksheet_Change.

Możesz dodać kolejny poziom zwiększenia wydajności, używając właściwości EnableEvents, aby poinformować program Excel, aby ignorował zdarzenia podczas działania makra.

Ustaw właściwość EnableEvents na False przed uruchomieniem makra. Po zakończeniu działania kodu makra możesz ustawić właściwość EnableEvents z powrotem na True.

Submakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fałsz
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'Umieść tutaj swój kod makra
Aplikacja.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Prawda
Application.DisplayStatusBar = Prawda
Application.EnableEvents = Prawda
Napis końcowy

Ukrywanie podziałów stron

Za każdym razem, gdy makro modyfikuje liczbę wierszy, modyfikuje liczbę kolumn lub zmienia ustawienia strony w arkuszu, program Excel jest zmuszony poświęcić trochę czasu na ponowne obliczenie podziałów stron wyświetlanych w arkuszu.

Możesz uniknąć tego zachowania, po prostu ukrywając podziały stron przed uruchomieniem makra.

Ustaw właściwość arkusza DisplayPageBreaks na wartość False, aby ukryć podziały stron. Jeśli chcesz nadal wyświetlać podziały stron po uruchomieniu makra, ustaw właściwość arkusza DisplayPageBreaks z powrotem na wartość True.

Submakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fałsz
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = Fałsz
 'Umieść tutaj swój kod makra
Aplikacja.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Prawda
Application.DisplayStatusBar = Prawda
Application.EnableEvents = Prawda
Activesheet.DisplayPageBreaks = Prawda
Napis końcowy

Zawieszanie aktualizacji tabeli przestawnej

Jeśli makro manipuluje tabelami przestawnymi, które zawierają duże źródła danych, może wystąpić niska wydajność podczas wykonywania takich czynności, jak dynamiczne dodawanie lub przenoszenie pól przestawnych.

Możesz poprawić wydajność makra, wstrzymując ponowne obliczanie tabeli przestawnej do momentu wprowadzenia wszystkich zmian w polach przestawnych. Po prostu ustaw właściwość PivotTable.ManualUpdate na True, aby odroczyć ponowne obliczanie, uruchom kod makra, a następnie ustaw właściwość PivotTable.ManualUpdate z powrotem na False, aby wyzwolić ponowne obliczenie.

Submakro1()
ActiveSheet.PivotTables("Tabela przestawna1").ManualUpdate=True
 'Umieść tutaj swój kod makra
ActiveSheet.PivotTables("Tabela przestawna1").ManualUpdate=Fałsz
Napis końcowy

Unikaj kopiowania i wklejania

Należy pamiętać, że chociaż Macro Recorder oszczędza czas, pisząc dla Ciebie kod VBA, nie zawsze pisze najbardziej wydajny kod. Doskonałym przykładem jest to, jak Macro Recorder przechwytuje każdą operację kopiowania i wklejania, którą wykonujesz podczas nagrywania.

Możesz nieco wzmocnić swoje makra, wycinając pośrednika i wykonując bezpośrednią kopię z jednej komórki do komórki docelowej. Ten alternatywny kod używa argumentu Destination, aby ominąć schowek i skopiować zawartość komórki A1 bezpośrednio do komórki B1.

Zakres("A1").Miejsce docelowe kopiowania:=Range("B1")

Jeśli chcesz skopiować tylko wartości (nie formatowanie ani formuły), możesz jeszcze bardziej poprawić wydajność, unikając całej metody Copy. Po prostu ustaw wartość komórki docelowej na tę samą wartość, co w komórce źródłowej. Ta metoda jest około 25 razy szybsza niż metoda kopiowania:

Zakres("B1").Wartość = Zakres("A1").Wartość

Jeśli chcesz skopiować tylko formuły z jednej komórki do drugiej (nie wartości lub formatowanie), możesz ustawić formułę komórki docelowej na tę samą formułę, co w komórce źródłowej:

Zakres("B1").Formula = Zakres("A1").Formula

Korzystanie z instrukcji With

Podczas nagrywania makr często będziesz manipulować tym samym obiektem więcej niż raz. Możesz zaoszczędzić czas i poprawić wydajność, używając instrukcji With, aby wykonać kilka czynności na danym obiekcie w jednym ujęciu.

Instrukcja With zastosowana w poniższym przykładzie informuje program Excel o zastosowaniu wszystkich zmian formatowania jednocześnie:

    Z zakresem ("A1"). Czcionka
    .Pogrubienie = Prawda
    .kursywa = prawda
    .Underline = xlUnderlineStyleSingle
    Kończyć z

Przyzwyczajenie się do dzielenia akcji na instrukcje With nie tylko przyspieszy działanie makr, ale także ułatwi czytanie kodu makr.

Unikanie metody Select

Macro Recorder lubi używać metody Select do jawnego wybierania obiektów przed podjęciem na nich działań. Generalnie nie ma potrzeby wybierania obiektów przed rozpoczęciem pracy z nimi. W rzeczywistości można znacznie poprawić wydajność makr, nie używając metody Select.

Po nagraniu makr przyzwyczaj się do zmiany wygenerowanego kodu w celu usunięcia metod Select. W takim przypadku zoptymalizowany kod wyglądałby następująco:

    Arkusze("Arkusz1").Range("A1").FormulaR1C1 = "1000"
    Arkusze("Arkusz2").Range("A1").FormulaR1C1 = "1000"
    Arkusze("Arkusz3").Range("A1").FormulaR1C1 = "1000"

Zauważ, że nic nie jest zaznaczone. Kod po prostu używa hierarchii obiektów, aby zastosować potrzebne działania.

Ograniczanie wycieczek do arkusza roboczego

Innym sposobem na przyspieszenie makr jest ograniczenie liczby odwoływania się do danych arkusza roboczego w kodzie. Pobieranie danych z arkusza roboczego jest zawsze mniej wydajne niż z pamięci. Oznacza to, że Twoje makra będą działać znacznie szybciej, jeśli nie będą musiały wielokrotnie wchodzić w interakcje z arkuszem.

Na przykład poniższy prosty kod zmusza VBA do ciągłego powrotu do Arkuszy("Arkusz1").Range("A1"), aby uzyskać liczbę potrzebną do porównania wykonywanego w instrukcji If:

Dla MiesiącRaportu = 1 do 12
     Jeśli Zakres("A1").Value = MiesiącRaportu Wtedy
     MsgBox 1000000 / Miesiąc raportu
Zakończ, jeśli
Następny Miesiąc raportu

Dużo wydajniejszą metodą jest zapisanie wartości w Arkuszach(„Arkusz1”).Zakres(„A1”) w zmiennej o nazwie MójMiesiąc. W ten sposób kod odwołuje się do zmiennej MyMonth zamiast do arkusza roboczego:

Dim MyMonth jako liczba całkowita
MójMiesiąc = Zakres("A1").Wartość
Dla MiesiącRaportu = 1 do 12
Jeśli MójMiesiąc = Miesiąc Zgłoszenia Wtedy
MsgBox 1000000 / Miesiąc raportu
Zakończ, jeśli
Następny Miesiąc raportu

Rozważ wykorzystanie zmiennych do pracy z danymi w pamięci, w przeciwieństwie do bezpośredniego odwoływania się do arkuszy.

Unikaj nadmiernych odniesień

Wywołanie metody lub właściwości obiektu wymaga przejścia przez interfejs IDispatch komponentu OLE. Wywołania tych komponentów OLE wymagają czasu, więc zmniejszenie liczby odniesień do komponentów OLE może poprawić szybkość kodu makra.

Do wywoływania właściwości lub metod obiektu zazwyczaj używana jest metoda reprezentacji Object.Method  ,  czyli „.” symbol służy do wywoływania właściwości i metod.

Dlatego liczbę wywołań metod lub właściwości można ocenić na podstawie liczby symboli „.”. Im mniej „.” symbol, tym szybciej działa kod.

Na przykład poniższa instrukcja zawiera 3 symbole „.”.

ThisWorkbook.Sheet1.Range("A1").Value = 100

Poniższa instrukcja ma tylko jeden symbol „.”.

Activewindow.Top = 100

Oto kilka sztuczek, aby zmniejszyć liczbę symboli „.” biegać szybciej.

Po pierwsze, gdy musisz wielokrotnie odwoływać się do tego samego obiektu, możesz ustawić obiekt na zmienną, aby zmniejszyć liczbę wywołań. Na przykład poniższy kod wymaga dwóch wywołań na linię.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Ponieważ  do obiektu Sheets("Sheet1")  trzeba odwoływać się wielokrotnie, można najpierw ustawić dla niego zmienną  sht  , dzięki czemu każdy kod będzie musiał zostać wywołany tylko raz.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

Po drugie, jeśli nie chcesz deklarować zmiennej tymczasowej sht, możesz także użyć   wspomnianej wcześniej instrukcji With . Jak pokazano w poniższym przykładzie:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

Po trzecie,  gdy jest wiele pętli, staraj się zachować właściwości i metody poza pętlą.  Kiedy ponownie używasz wartości właściwości tego samego obiektu w pętli, możesz najpierw przypisać wartość właściwości do określonej zmiennej poza pętlą, a następnie użyć tej zmiennej w pętli, co może osiągnąć większą prędkość. Jak pokazano w poniższym przykładzie:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Każda pętla w tym przykładzie pobiera właściwość Value komórki Cells(1,2). Jeśli przypiszesz właściwość Value funkcji Cells(1.2) do zmiennej przed rozpoczęciem pętli, działanie będzie szybsze. Jak pokazano w poniższym przykładzie:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

Powyższy kod wywołuje  ThisWorkbook.Sheets("Sheet1")  przy każdym zapętleniu. Możesz to zrobić szybciej, używając  instrukcji With  w celu przeniesienia wywołania  ThisWorkbook.Sheets("Sheet1")  poza pętlę. Jak pokazano w poniższym przykładzie:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Unikaj używania typów wariantów

Początkujący zazwyczaj wolą używać zmiennych typu Variant, co ma tę zaletę, że jest mniej skomplikowane, ponieważ można zastosować dowolny typ danych bez problemu przepełnienia pamięci, jeśli dane są zbyt duże dla typów danych Integer lub Long. Jednak dane typu Varienmt wymagają więcej dodatkowej pamięci niż inne określone typy (2 bajty dla danych Integer, 4 bajty dla danych Long i 16 bajtów dla danych Variant), VBA wymaga więcej czasu na przetworzenie danych typu Variant niż inne określone typy danych. Jak pokazuje poniższy przykład.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

W powyższym kodzie linie od 8 do 13 wykonują 1 milion operacji dodawania, odejmowania, mnożenia i dzielenia zmiennych typu Variant, a linie od 17 do 22 wykonują 1 milion operacji dodawania, odejmowania, mnożenia i dzielenia zmiennych typu Integer. Na moim komputerze działanie zmiennej Variant trwało około  0,09375  sekundy, natomiast działanie zmiennej Integer trwało około  0,03125  sekundy. Wyniki mogą się różnić w zależności od komputera, ale  zmienne typu Variant są znacznie wolniejsze niż zmienne typu Integer .

Z tego powodu  zaleca się unikanie używania zmiennych Variant, gdy można jawnie użyć określonego typu danych .


Inteligentny arkusz 9.1.1

Inteligentny arkusz 9.1.1

Smartsheet to dynamiczna platforma robocza, która umożliwia zarządzanie projektami, tworzenie przepływów pracy i współpracę z zespołem.

SharePointa

SharePointa

SharePoint to internetowy system współpracy, który wykorzystuje różnorodne aplikacje do obsługi przepływu pracy, bazy danych „list” i inne komponenty sieciowe, a także funkcje zabezpieczeń zapewniające kontrolę nad współpracą grup biznesowych.

Wieczny kalendarz 1.0.38/1.0.36

Wieczny kalendarz 1.0.38/1.0.36

Van Nien Calendar to aplikacja do przeglądania kalendarza w telefonie, która pomaga szybko sprawdzić na telefonie datę księżycowo-słoneczną i uporządkować ważne prace.

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook to aplikacja biznesowa i produktywna opracowana przez Microsoft Corporation.

Kliknij w górę

Kliknij w górę

ClickUp to jedna z najwyżej ocenianych platform zwiększających produktywność dla każdej firmy. Duże firmy, takie jak Google, Booking.com, San Diego Padres i Uber, korzystają z ClickUp, aby zwiększyć produktywność w miejscu pracy.

Przeglądarka PDF-XChange 2.5.322.10

Przeglądarka PDF-XChange 2.5.322.10

PDF stał się powszechnie używanym formatem do czytania, tworzenia i wysyłania dokumentów tekstowych. Z kolei wzrosła liczba programów wykorzystywanych do tego typu dokumentacji. Przeglądarka PDF-XChange Viewer należy do rosnącej liczby przeglądarek plików PDF.

Apache Open Office

Apache Open Office

Apache OpenOffice oferuje kompletny zestaw aplikacji Office, które mogą konkurować z Microsoft 365, zwłaszcza w programach Excel, PowerPoint i Word. Pozwala efektywniej zarządzać projektami i obsługuje kilka formatów plików.

Pobierz iTaxviewer 1.8.7

Pobierz iTaxviewer 1.8.7

Oprogramowanie iTaxViewer jest obecnie najpopularniejszym oprogramowaniem do odczytu plików XML. To oprogramowanie jest aplikacją do odczytu elektronicznych deklaracji podatkowych w formacie XML Generalnego Departamentu Podatków.

Czytnik PDF Nitro

Czytnik PDF Nitro

Nitro PDF Reader to poręczny edytor plików PDF, który obejmuje wszystkie podstawowe zadania, które większość ludzi wykonuje codziennie z dokumentami PDF.

Czytnik Foxita 12

Czytnik Foxita 12

Foxit Reader to przede wszystkim czytnik plików PDF, który umożliwia także tworzenie plików PDF, podpisywanie ich, edycję i dodawanie adnotacji. Działa na systemach operacyjnych, dostępne są wtyczki do różnych programów z pakietu Microsoft Office.