10 Cara Mempercepat Makro Anda

Apabila makro Excel anda menjadi semakin mantap dan kompleks, anda mungkin mendapati bahawa ia kehilangan prestasi. Apabila membincangkan makro, perkataan prestasi biasanya sinonim dengan kelajuan . Kelajuan ialah seberapa cepat prosedur VBA anda melaksanakan tugas yang dimaksudkan. Berikut ialah sepuluh cara untuk membantu memastikan makro Excel anda berjalan pada tahap prestasi optimumnya.

Menghentikan pengiraan helaian

Adakah anda tahu bahawa setiap kali sel yang mempengaruhi sebarang formula dalam hamparan anda ditukar atau dimanipulasi, Excel mengira semula keseluruhan lembaran kerja? Dalam lembaran kerja yang mempunyai sejumlah besar formula, tingkah laku ini boleh memperlahankan makro anda secara drastik.

Anda boleh menggunakan sifat Application.Calculation untuk memberitahu Excel untuk bertukar kepada mod pengiraan manual. Apabila buku kerja berada dalam mod pengiraan manual, buku kerja tidak akan mengira semula sehingga anda mencetuskan pengiraan secara eksplisit dengan menekan kekunci F9.

Letakkan Excel ke dalam mod pengiraan manual, jalankan kod anda, dan kemudian tukar semula ke mod pengiraan automatik.

Sub Makro1()
Permohonan.Pengiraan = xlManual Pengiraan
 'Letakkan kod makro anda di sini
Permohonan.Pengiraan = xlPengiraanAutomatik
Tamat Sub

Menetapkan mod pengiraan kembali kepada xlCalculationAutomatic secara automatik akan mencetuskan pengiraan semula lembaran kerja, jadi tidak perlu menekan kekunci F9 selepas makro anda berjalan.

Melumpuhkan pengemaskinian skrin helaian

Anda mungkin perasan bahawa apabila makro anda dijalankan, skrin anda berkelipan agak banyak. Kelipan ini ialah Excel cuba melukis semula skrin untuk menunjukkan keadaan semasa lembaran kerja. Malangnya, setiap kali Excel melukis semula skrin, ia mengambil sumber memori.

Anda boleh menggunakan sifat Application.ScreenUpdating untuk melumpuhkan kemas kini skrin sehingga makro anda selesai. Melumpuhkan pengemaskinian skrin menjimatkan masa dan sumber, membolehkan makro anda berjalan lebih pantas sedikit. Selepas kod makro anda selesai dijalankan, anda boleh menghidupkan semula pengemaskinian skrin.

Sub Makro1()
Permohonan.Pengiraan = xlManual Pengiraan
Aplikasi.ScreenUpdating = Palsu
 'Letakkan kod makro anda di sini
Permohonan.Pengiraan = xlPengiraanAutomatik
Aplikasi.ScreenUpdating = Benar
Tamat Sub

Selepas anda menetapkan sifat ScreenUpdating kembali kepada True, Excel akan mencetuskan lukisan semula skrin secara automatik.

Mematikan kemas kini bar status

Bar status Excel, yang muncul di bahagian bawah tetingkap Excel, biasanya memaparkan kemajuan tindakan tertentu dalam Excel. Jika makro anda berfungsi dengan banyak data, bar status akan menggunakan beberapa sumber.

Adalah penting untuk ambil perhatian bahawa mematikan pengemaskinian skrin adalah berasingan daripada mematikan paparan bar status. Bar status akan terus dikemas kini walaupun anda melumpuhkan pengemaskinian skrin. Anda boleh menggunakan sifat Application.DisplayStatusBar untuk melumpuhkan sementara sebarang kemas kini bar status, meningkatkan lagi prestasi makro anda:

Sub Makro1()
Permohonan.Pengiraan = xlManual Pengiraan
Aplikasi.ScreenUpdating = Palsu
Application.DisplayStatusBar = Palsu
 'Letakkan kod makro anda di sini
Permohonan.Pengiraan = xlPengiraanAutomatik
Aplikasi.ScreenUpdating = Benar
Application.DisplayStatusBar = Benar
Tamat Sub

Memberitahu Excel untuk mengabaikan acara

Anda boleh melaksanakan makro sebagai prosedur acara, memberitahu Excel untuk menjalankan kod tertentu apabila lembaran kerja atau buku kerja berubah.

Kadangkala, makro standard membuat perubahan yang akan mencetuskan prosedur acara. Sebagai contoh, jika anda mempunyai makro standard yang memanipulasi beberapa sel pada Helaian1, setiap kali sel pada helaian itu ditukar, makro anda perlu menjeda semasa acara Worksheet_Change berjalan.

Anda boleh menambah satu lagi tahap peningkatan prestasi dengan menggunakan sifat EnableEvents untuk memberitahu Excel supaya mengabaikan acara semasa makro anda berjalan.

Tetapkan sifat EnableEvents kepada False sebelum menjalankan makro anda. Selepas kod makro anda selesai dijalankan, anda boleh menetapkan sifat EnableEvents kembali kepada Benar.

Sub Makro1()
Permohonan.Pengiraan = xlManual Pengiraan
Aplikasi.ScreenUpdating = Palsu
Application.DisplayStatusBar = Palsu
Application.EnableEvents = Palsu
 'Letakkan kod makro anda di sini
Permohonan.Pengiraan = xlPengiraanAutomatik
Aplikasi.ScreenUpdating = Benar
Application.DisplayStatusBar = Benar
Application.EnableEvents = Benar
Tamat Sub

Menyembunyikan pemisah halaman

Setiap kali makro anda mengubah suai bilangan baris, mengubah suai bilangan lajur atau mengubah persediaan halaman lembaran kerja, Excel terpaksa mengambil masa mengira semula pemisah halaman yang ditunjukkan pada helaian.

Anda boleh mengelakkan tingkah laku ini dengan hanya menyembunyikan pemisah halaman sebelum memulakan makro anda.

Tetapkan sifat helaian DisplayPageBreaks kepada False untuk menyembunyikan pemisah halaman. Jika anda ingin terus memaparkan pemisah halaman selepas makro anda dijalankan, tetapkan sifat helaian DisplayPageBreaks kembali kepada Benar.

Sub Makro1()
Permohonan.Pengiraan = xlManual Pengiraan
Aplikasi.ScreenUpdating = Palsu
Application.DisplayStatusBar = Palsu
Application.EnableEvents = Palsu
Activesheet.DisplayPageBreaks = Palsu
 'Letakkan kod makro anda di sini
Permohonan.Pengiraan = xlPengiraanAutomatik
Aplikasi.ScreenUpdating = Benar
Application.DisplayStatusBar = Benar
Application.EnableEvents = Benar
Activesheet.DisplayPageBreaks = Benar
Tamat Sub

Menggantung kemas kini jadual pangsi

Jika makro anda memanipulasi jadual pangsi yang mengandungi sumber data yang besar, anda mungkin mengalami prestasi yang lemah apabila melakukan perkara seperti menambah atau mengalihkan medan pangsi secara dinamik.

Anda boleh meningkatkan prestasi makro anda dengan menggantung pengiraan semula jadual pangsi sehingga semua perubahan medan pangsi telah dibuat. Hanya tetapkan harta PivotTable.ManualUpdate kepada True untuk menangguhkan pengiraan semula, jalankan kod makro anda dan kemudian tetapkan harta PivotTable.ManualUpdate kembali kepada False untuk mencetuskan pengiraan semula.

Sub Makro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Letakkan kod makro anda di sini
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
Tamat Sub

Mengelakkan salinan dan tampal

Adalah penting untuk diingat bahawa walaupun Perakam Makro menjimatkan masa dengan menulis kod VBA untuk anda, ia tidak selalu menulis kod yang paling cekap. Contoh utama ialah cara Perakam Makro menangkap sebarang tindakan salin dan tampal yang anda lakukan semasa merakam.

Anda boleh memberikan makro anda sedikit rangsangan dengan memotong orang tengah dan melakukan salinan terus dari satu sel ke sel destinasi. Kod ganti ini menggunakan argumen Destinasi untuk memintas papan keratan dan menyalin kandungan sel A1 terus ke sel B1.

Julat("A1"). Salin Destinasi:=Julat("B1")

Jika anda perlu menyalin nilai sahaja (bukan pemformatan atau formula), anda boleh meningkatkan prestasi dengan lebih baik dengan mengelakkan kaedah Salin semuanya. Hanya tetapkan nilai sel destinasi kepada nilai yang sama yang terdapat dalam sel sumber. Kaedah ini adalah kira-kira 25 kali lebih pantas daripada menggunakan kaedah Salin:

Julat("B1").Nilai = Julat("A1").Nilai

Jika anda perlu menyalin hanya formula dari satu sel ke sel lain (bukan nilai atau pemformatan), anda boleh menetapkan formula sel destinasi kepada formula yang sama yang terkandung dalam sel sumber:

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

Menggunakan pernyataan Dengan

Apabila merakam makro, anda selalunya akan memanipulasi objek yang sama lebih daripada sekali. Anda boleh menjimatkan masa dan meningkatkan prestasi dengan menggunakan pernyataan Dengan untuk melakukan beberapa tindakan pada objek tertentu dalam satu pukulan.

Pernyataan Dengan yang digunakan dalam contoh berikut memberitahu Excel untuk menggunakan semua perubahan pemformatan pada satu masa:

    Dengan Julat("A1").Fon
    .Berani = Benar
    .Italik = Benar
    .Garis bawah = xlUnderlineStyleSingle
    Tamat Dengan

Membiasakan diri menggunting tindakan ke dalam pernyataan With bukan sahaja memastikan makro anda berjalan lebih pantas tetapi juga memudahkan anda membaca kod makro anda.

Mengelakkan kaedah Pilih

Perakam Makro gemar menggunakan kaedah Pilih untuk memilih objek secara eksplisit sebelum mengambil tindakan ke atasnya. Secara umumnya tidak perlu memilih objek sebelum bekerja dengannya. Malah, anda boleh meningkatkan prestasi makro secara mendadak dengan tidak menggunakan kaedah Pilih.

Selepas merakam makro anda, biasakan mengubah kod yang dijana untuk mengalih keluar kaedah Pilih. Dalam kes ini, kod yang dioptimumkan akan kelihatan seperti berikut:

    Helaian("Helaian1"). Julat("A1").FormulaR1C1 = "1000"
    Helaian("Helaian2"). Julat("A1").FormulaR1C1 = "1000"
    Helaian("Helaian3"). Julat("A1").FormulaR1C1 = "1000"

Ambil perhatian bahawa tiada apa yang sedang dipilih. Kod ini hanya menggunakan hierarki objek untuk menggunakan tindakan yang diperlukan.

Mengehadkan perjalanan ke lembaran kerja

Satu lagi cara untuk mempercepatkan makro anda ialah mengehadkan jumlah kali anda merujuk data lembaran kerja dalam kod anda. Ia sentiasa kurang cekap untuk merebut data dari lembaran kerja berbanding dari memori. Maksudnya, makro anda akan berjalan lebih pantas jika mereka tidak perlu berulang kali berinteraksi dengan lembaran kerja.

Sebagai contoh, kod mudah berikut memaksa VBA untuk terus kembali ke Helaian("Helaian1"). Julat("A1") untuk mendapatkan nombor yang diperlukan untuk perbandingan yang dilakukan dalam pernyataan Jika:

Untuk ReportMonth = 1 Hingga 12
     Jika Julat("A1").Nilai = LaporanBulan Kemudian
     MsgBox 1000000 / Bulan Laporan
Tamat Jika
Bulan Laporan Seterusnya

Kaedah yang lebih cekap ialah menyimpan nilai dalam Helaian("Helaian1").Julat("A1") kepada pembolehubah yang dipanggil Bulan Saya. Dengan cara ini, kod merujuk pembolehubah MyMonth dan bukannya lembaran kerja:

Malapkan MyMonth sebagai Integer
MyMonth = Julat("A1").Nilai
Untuk ReportMonth = 1 Hingga 12
Jika MyMonth = ReportMonth Kemudian
MsgBox 1000000 / Bulan Laporan
Tamat Jika
Bulan Laporan Seterusnya

Pertimbangkan untuk memanfaatkan pembolehubah untuk berfungsi dengan data dalam ingatan berbanding merujuk terus lembaran kerja.

Elakkan Rujukan Berlebihan

Apabila memanggil kaedah atau sifat objek, ia perlu melalui antara muka IDispatch komponen OLE. Panggilan ke komponen OLE ini mengambil masa, jadi mengurangkan bilangan rujukan kepada komponen OLE boleh meningkatkan kelajuan kod makro.

Untuk penyebutan sifat atau kaedah objek, kaedah perwakilan  Object.Method  biasanya digunakan, iaitu, "." simbol digunakan untuk memanggil sifat dan kaedah.

Oleh itu, bilangan kaedah atau panggilan harta boleh dinilai mengikut bilangan simbol ".". Semakin kurang "." simbol, lebih cepat kod berjalan.

Sebagai contoh pernyataan berikut mengandungi 3 simbol ".".

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

Pernyataan berikut hanya mempunyai satu simbol ".".

Activewindow.Top = 100

Berikut ialah beberapa helah untuk mengurangkan bilangan simbol "." untuk berlari lebih laju.

Pertama, apabila anda perlu merujuk kepada objek yang sama berulang kali, anda boleh menetapkan objek kepada pembolehubah untuk mengurangkan bilangan panggilan. Sebagai contoh, kod berikut memerlukan dua panggilan setiap talian.

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

Oleh kerana  objek Sheets("Sheet1")  perlu dirujuk berulang kali, ia boleh ditetapkan kepada pembolehubah  sht  terlebih dahulu, supaya setiap kod hanya perlu dipanggil sekali.

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

Kedua, jika anda tidak mahu mengisytiharkan pembolehubah sementara sht, anda juga boleh menggunakan  pernyataan Dengan  yang dinyatakan sebelum ini. Seperti yang ditunjukkan dalam contoh berikut:

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

Ketiga,  apabila terdapat banyak gelung, cuba simpan sifat dan kaedah di luar gelung.  Apabila menggunakan semula nilai sifat objek yang sama dalam gelung, anda boleh mula-mula menetapkan nilai sifat kepada pembolehubah yang ditentukan di luar gelung, dan kemudian menggunakan pembolehubah dalam gelung, yang boleh mencapai kelajuan yang lebih pantas. Seperti yang ditunjukkan dalam contoh berikut:

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

Setiap gelung dalam contoh ini mendapat sifat Nilai sel Sel(1,2). Jika anda memperuntukkan sifat Nilai Sel(1.2) kepada pembolehubah sebelum gelung bermula, anda akan mendapat larian yang lebih pantas. Seperti yang ditunjukkan dalam contoh berikut:

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

Kod di atas memanggil  ThisWorkbook.Sheets("Sheet1")  setiap kali ia gelung. Anda boleh melakukan ini dengan lebih pantas dengan menggunakan  pernyataan Dengan  untuk mengalihkan panggilan ke  ThisWorkbook.Sheets("Sheet1")  di luar gelung. Seperti yang ditunjukkan dalam contoh berikut:

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

Elakkan Menggunakan Jenis Varian

Pemula biasanya lebih suka menggunakan pembolehubah jenis Varian, yang mempunyai kelebihan menjadi kurang rumit kerana sebarang jenis data boleh digunakan tanpa masalah limpahan memori jika data terlalu besar untuk jenis data Integer atau Long. Walau bagaimanapun, data jenis Varienmt memerlukan lebih banyak ruang memori tambahan daripada jenis yang ditentukan lain (2 bait untuk data Integer, 4 bait untuk data Panjang dan 16 bait untuk data Varian), VBA memerlukan lebih banyak masa untuk memproses data jenis Varian daripada jenis lain yang ditentukan daripada data. Seperti yang ditunjukkan oleh contoh berikut.

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

Dalam kod di atas, baris 8 hingga 13 melakukan 1 juta operasi penambahan, penolakan, pendaraban dan pembahagian pembolehubah Varian, dan baris 17 hingga 22 melakukan 1 juta operasi penambahan, penolakan, pendaraban dan pembahagian pembolehubah Integer. Pada komputer saya, pengendalian pembolehubah Varian mengambil masa kira-kira  0.09375  saat, manakala pengendalian pembolehubah Integer mengambil masa kira-kira  0.03125  saat. Hasilnya mungkin berbeza dari satu komputer ke komputer, tetapi  Pembolehubah Varian adalah lebih perlahan daripada pembolehubah Integer .

Atas sebab ini,  adalah disyorkan untuk mengelak daripada menggunakan pembolehubah Varian apabila anda boleh menggunakan jenis data yang ditentukan secara eksplisit .


Lembaran Pintar 9.1.1

Lembaran Pintar 9.1.1

Smartsheet ialah platform kerja dinamik yang membolehkan anda mengurus projek, membina aliran kerja dan bekerjasama dengan pasukan anda.

SharePoint

SharePoint

SharePoint ialah sistem kerjasama berasaskan web yang menggunakan pelbagai aplikasi aliran kerja, pangkalan data "senarai" dan komponen web lain, serta ciri keselamatan untuk memberi kawalan kepada Kumpulan perniagaan bekerjasama.

Kalendar Kekal 1.0.38/1.0.36

Kalendar Kekal 1.0.38/1.0.36

Kalendar Van Nien ialah aplikasi melihat kalendar pada telefon anda, membantu anda melihat tarikh lunisolar dengan cepat pada telefon anda, sekali gus mengatur kerja penting anda.

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook ialah aplikasi perniagaan dan produktiviti yang dibangunkan oleh Microsoft Corporation.

ClickUp

ClickUp

ClickUp ialah salah satu platform produktiviti yang dinilai tertinggi untuk mana-mana perniagaan. Perniagaan besar seperti Google, Booking.com, San Diego Padres dan Uber semuanya menggunakan ClickUp untuk meningkatkan produktiviti tempat kerja.

PDF-XChange Viewer 2.5.322.10

PDF-XChange Viewer 2.5.322.10

PDF telah menjadi format yang biasa digunakan untuk membaca, mencipta dan menghantar dokumen teks. Seterusnya, terdapat peningkatan dalam bilangan program yang digunakan untuk jenis dokumentasi ini. PDF-XChange Viewer ialah antara jumlah penonton PDF yang semakin meningkat.

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice menawarkan suite lengkap aplikasi Office yang menyaingi Microsoft 365, terutamanya dalam Excel, PowerPoint dan Word. Ia membolehkan anda mengurus projek anda dengan lebih berkesan, dan menyokong beberapa format fail.

Muat turun iTaxviewer 1.8.7

Muat turun iTaxviewer 1.8.7

Perisian iTaxViewer ialah perisian membaca fail XML yang paling popular hari ini. Perisian ini adalah aplikasi untuk membaca pengisytiharan cukai elektronik dalam format XML Jabatan Percukaian Am.

Pembaca PDF Nitro

Pembaca PDF Nitro

Nitro PDF Reader ialah editor PDF berguna yang merangkumi semua tugas asas yang kebanyakan orang lakukan setiap hari dengan dokumen PDF.

Pembaca Foxit 12

Pembaca Foxit 12

Foxit Reader terutamanya pembaca PDF, dan juga membolehkan anda membuat fail PDF, menandatanganinya, mengeditnya dan menambah anotasi. Ia berfungsi pada sistem pengendalian, terdapat pemalam untuk pelbagai program daripada pakej Microsoft Office.