Pertanyaan secara otomatis mengeksekusi makro Excel pada perubahan sel


Bagaimana saya bisa secara otomatis mengeksekusi makro Excel setiap kali nilai dalam sel tertentu berubah?

Saat ini, kode kerja saya adalah:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

dimana "H5" adalah sel tertentu yang dipantau dan Macro adalah nama makro.

Apakah ada cara yang lebih baik?


76
2018-01-03 17:33


asal


Jawaban:


Kode Anda terlihat bagus.

Namun, berhati-hatilah, untuk panggilan Anda Range("H5") adalah perintah pintasan untuk Application.Range("H5"), yang setara dengan Application.ActiveSheet.Range("H5"). Ini bisa baik-baik saja, jika satu-satunya perubahan adalah perubahan pengguna - yang paling umum - tetapi mungkin bagi nilai sel lembar kerja untuk berubah ketika bukan lembar aktif melalui perubahan terprogram, mis. VBA.

Dengan pemikiran ini, saya akan memanfaatkan Target.Worksheet.Range("H5"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

Atau Anda bisa menggunakannya Me.Range("H5"), jika pengendali event ada di halaman kode untuk lembar kerja yang dimaksud (biasanya):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

Semoga ini membantu...


98
2018-01-06 01:59



Tangani Worksheet_Change acara atau Workbook_SheetChange peristiwa.

Penangan acara mengambil argumen "Target As Range", sehingga Anda dapat memeriksa apakah rentang yang berubah termasuk sel yang Anda minati.


7
2018-01-03 17:36



Saya lebih suka cara ini, tidak menggunakan sel tetapi rentang

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If

3
2018-01-04 11:58



Saya menghabiskan banyak waktu untuk meneliti hal ini dan mempelajari cara kerjanya, setelah benar-benar mengacaukan acara tersebut. Karena ada begitu banyak info yang tersebar, saya memutuskan untuk membagikan apa yang saya temukan untuk bekerja di satu tempat, selangkah demi selangkah sebagai berikut:

1) Buka VBA Editor, di bawah VBA Project (YourWorkBookName.xlsm) buka Microsoft Excel Object dan pilih Sheet yang akan diubah oleh peristiwa perubahan.

2) Tampilan kode default adalah "Umum." Dari daftar drop-down di bagian tengah atas, pilih "Worksheet."

3) Private Sub Worksheet_SelectionChange sudah ada sebagaimana mestinya, biarkan saja. Salin / Tempel kode Mike Rosenblum dari atas dan ubah referensi .Range ke sel tempat Anda menonton untuk perubahan (B3, dalam kasus saya). Jangan tempatkan Macro Anda, namun (saya menghapus kata "Makro" setelah "Lalu"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

atau dari daftar drop-down di kiri atas, pilih "Ubah" dan di ruang antara Sub Pribadi dan Sub Akhir, tempel If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) Pada baris setelah "Lalu" matikan acara sehingga ketika Anda memanggil makro Anda, itu tidak memicu peristiwa dan mencoba untuk menjalankan Worksheet_Change ini lagi dalam siklus tidak pernah berakhir yang crash Excel dan / atau mengacaukan semuanya:

Application.EnableEvents = False

5) Hubungi makro Anda

Call YourMacroName

6) Hidupkan kembali kejadian-kejadian sehingga perubahan berikutnya (dan semua peristiwa lainnya) memicu:

Application.EnableEvents = True

7) Akhiri blok If dan Sub:

    End If
End Sub

Seluruh kode:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

Ini membuat acara berputar on / off dari Modul yang menciptakan masalah dan cukup memungkinkan pemicu perubahan, mematikan acara, menjalankan makro Anda, dan mengaktifkan kembali acara.


2
2017-07-11 22:51



Saya memiliki sel yang terhubung ke basis data saham online dan sering diperbarui. Saya ingin memicu makro setiap kali nilai sel diperbarui.

Saya percaya ini mirip dengan perubahan nilai sel oleh program atau pembaruan data eksternal tetapi contoh di atas entah bagaimana tidak bekerja untuk saya. Saya pikir masalahnya adalah karena kejadian internal excel tidak dipicu, tapi itu tebakan saya.

Saya melakukan yang berikut ini,

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub

0
2018-04-20 16:46