Bagaimana saya bisa secara otomatis menjalankan 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
di mana "H5"
sel tertentu sedang dipantau dan Macro
merupakan nama makro.
Apakah ada cara yang lebih baik?
excel
vba
automation
namin
sumber
sumber
Jawaban:
Kode Anda terlihat cukup bagus.
Berhati-hatilah, karena panggilan Anda ke
Range("H5")
adalah perintah pintasan keApplication.Range("H5")
, yang setara denganApplication.ActiveSheet.Range("H5")
. Ini bisa baik-baik saja, jika satu-satunya perubahan adalah perubahan pengguna - yang paling umum - tetapi nilai sel lembar kerja mungkin berubah jika bukan lembar aktif melalui perubahan programatik, misalnya 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 menggunakan
Me.Range("H5")
, jika event handler 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...
sumber
H5
diubah dari lembar lain, katakanlahsheet2
maka fungsi di atas tidak berfungsi. tolong bantu dalam hal ini.ActiveSheet
dan kapan pun Anda tidak secara eksplisit menentukan bahwa itu adalah Excel yang Anda kerjakan, Excel mengasumsikanApplication
.Worksheet_Change
acara harus ditempatkan), yangRange
tidak memenuhi syarat tidak defaultActiveSheet
tetapi merujuk ke lembar yang berisi kode. Oleh karena itu, kode dalam jawaban ini secara efektif sama dengan kode dalam pertanyaan. (Catatan: Kembali pada tahun 2009 ketika jawaban ini ditulis, mungkin berbeda, tapi saya cukup yakin tidak.)Tangani
Worksheet_Change
acara atauWorkbook_SheetChange
acara tersebut.Penangan kejadian mengambil argumen "Target As Range", sehingga Anda dapat memeriksa apakah rentang yang berubah termasuk sel yang Anda minati.
sumber
Target.Address = Range("H5").Address
,. Apakah ada cara yang lebih mudah?Not (Intersect(Target, Range("H5")) Is Nothing)
. Apakah ini cara Anda melakukannya?Target.Address = Range("H5").Address
) tidak akan berfungsi jika sel Anda hanya bagian dari rentang yang diubah. Komentar kedua masih mengalami masalah yang dijelaskan oleh Mike Rosenblum.Saya menghabiskan banyak waktu untuk meneliti ini dan mempelajari cara kerjanya, setelah benar-benar mengacaukan pemicu acara. Karena ada begitu banyak info yang tersebar, saya memutuskan untuk membagikan apa yang menurut saya berfungsi semua di satu tempat, langkah demi langkah sebagai berikut:
1) Buka VBA Editor, di bawah Proyek VBA (YourWorkBookName.xlsm) buka Objek Microsoft Excel dan pilih Lembar yang akan terkait dengan peristiwa perubahan.
2) Tampilan kode default adalah "Umum". Dari daftar drop-down di 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 yang Anda perhatikan perubahannya (B3, dalam kasus saya). Namun, jangan letakkan Makro Anda (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 tarik-turun 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 "Kemudian" matikan acara sehingga ketika Anda memanggil makro Anda, itu tidak memicu kejadian dan mencoba menjalankan Worksheet_Change ini lagi dalam siklus yang tidak pernah berakhir yang membuat Excel crash dan / atau mengacaukan semuanya:
Application.EnableEvents = False
5) Panggil makro Anda
Call YourMacroName
6) Hidupkan kembali peristiwa sehingga perubahan berikutnya (dan setiap / 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 akan mengaktifkan / menonaktifkan peristiwa dari Modul yang menciptakan masalah dan memungkinkan pemicu perubahan, menonaktifkan peristiwa, menjalankan makro Anda, dan mengaktifkan kembali peristiwa.
sumber
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
sumber
Saya memiliki sel yang ditautkan ke database 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 apa pun tetapi contoh di atas entah bagaimana tidak berfungsi untuk saya. Saya pikir masalahnya adalah karena kejadian internal excel tidak dipicu, tapi itu dugaan saya.
Saya melakukan hal berikut,
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
sumber