Dùng VBA tạo Private Sub Worksheet_Change(ByVal Target As Range) chèn vào Worksheet

Liên hệ QC

DNam

Thành viên chính thức
Tham gia
8/11/07
Bài viết
75
Được thích
81
Nghề nghiệp
Xây dựng
Xin chào tất cả bà con GPE.

Xin mọi người giúp cho có cách nào sử dụng mã VBA để chèn Private Sub Worksheet_Change(ByVal Target As Range) vào cho Sheet1 không? Cám ơn cộng đồng GPE rất rất nhiều..
 
Bạn có thể nói rõ hơn ko? Mình chẳng hiểu bạn nói gì cả?
Chèn dòng lệnh đó là ý làm sao?
 
Upvote 0
Cám ơn bạn Pozsi đã quan tâm.

Ý mình là dùng macro để tự động tạo sự kiện change cho Sheet1 thay vì phải vào cửa sổ VBA (từ Excel bấm Alt+F11), DblClick vào Sheet1 rồi chọn Worksheet và sự kiện Change.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bạn Pozsi đã quan tâm.

Ý mình là dùng macro để tự động tạo sự kiện change cho Sheet1 thay vì phải vào cửa sổ VBA (từ Excel bấm Alt+F11), DblClick vào Sheet1 rồi chọn Worksheet và sự kiện Change.
Cho hỏi: Mục đích sử dụng của bạn là gì vậy? Trước giờ chưa thấy dạng yêu cầu này
(biết mục đích, có khi có cách khác hay hơn)
 
Upvote 0
Cho hỏi: Mục đích sử dụng của bạn là gì vậy? Trước giờ chưa thấy dạng yêu cầu này
(biết mục đích, có khi có cách khác hay hơn)

Chào Anh ndu96081631!

Mục đích của em là: tạo một số tiện ích hỗ trợ người dùng excel khi muốn sử dụng sự kiện change nào đó cho sheet.. có tên nào đó (ở đây em hỏi cho sheet1 để cho tiện) thì chỉ cần vào menu và chọn tạo sự kiện và chọn sheet cần tạo là sự kiện đó tự chèn vào sheet. Cám ơn Anh nhiều và rất mong nhận được sự giúp đỡ của Anh.
 
Upvote 0
Chào Anh ndu96081631!

Mục đích của em là: tạo một số tiện ích hỗ trợ người dùng excel khi muốn sử dụng sự kiện change nào đó cho sheet.. có tên nào đó (ở đây em hỏi cho sheet1 để cho tiện) thì chỉ cần vào menu và chọn tạo sự kiện và chọn sheet cần tạo là sự kiện đó tự chèn vào sheet. Cám ơn Anh nhiều và rất mong nhận được sự giúp đỡ của Anh.
Làm vậy chi cho cực!
Bạn cứ viết code cho sự kiện Worksheet_Change nhưng cộng thêm 1 điều kiện nào đó để chạy code (chẳng hạn là checkbox) ---> Nếu điều kiện thỏa mản (chẳng hạn là người dùng check vào checkbox) thì code chạy, ngược lại thì chẳng làm gì cả
----------------
Chứ yêu cầu như bạn tôi không biết có viết được không... Nhưng giả sử có viết được thì tôi nghĩ code cũng chẳng đơn giản tí nào (phức tạp quá làm sao bạn sửa khi có trục trặc?)
 
Upvote 0
Anh ndu96081631 ơi!

Sở dĩ em không viết trực tiếp trên Worksheet_Change được là vì Workbook đó không phải do mình tạo ra (người dùng sử dụng Workbook bất kỳ, chỉ khi cần tiện ích thì chọn thôi), phần menu và code xử lý trong sự kiện thì em đã làm xong rồi. Cám ơn Anh nhiều và mong nhận được ý kiến của Anh.
 
Upvote 0
Anh ndu96081631 ơi!

Sở dĩ em không viết trực tiếp trên Worksheet_Change được là vì Workbook đó không phải do mình tạo ra (người dùng sử dụng Workbook bất kỳ, chỉ khi cần tiện ích thì chọn thôi), phần menu và code xử lý trong sự kiện thì em đã làm xong rồi. Cám ơn Anh nhiều và mong nhận được ý kiến của Anh.

Bạn hãy đọc bài số #2 và #4 trong bài viết Class module - Kỹ thuật Tạo và Wrap đối tượng của tôi.

Vấn đề của bạn rất đơn giản với điều kiện phải học Class Module.
 
Upvote 0
Cám ơn Trời, cảm ơn Cao thủ TuanVNUNI!

Em đã làm theo phương pháp của anh, thật là tuyệt vời, trên cả sự mong đợi.
Chỉ có điều phải sử dụng biến toàn cục (Option Explicit_nhưng không sao, em đã khắc phục việc khai báo các biến của em lại).

Em sử dụng code của anh và chỉ cần thêm vào Select case ActiveSheet.Name là có thể chọn áp dụng sự kiện (Worksheet_Change hoặc Worksheet_SelectionChange) cho Worksheet nào mình muốn. Áp dụng cho tất cả các Workbook bất kỳ.

Chân thành cảm ơn anh. Chúc anh luôn vui!--=0
 
Upvote 0
Cám ơn Trời, cảm ơn Cao thủ TuanVNUNI!

Em đã làm theo phương pháp của anh, thật là tuyệt vời, trên cả sự mong đợi.
Chỉ có điều phải sử dụng biến toàn cục (Option Explicit_nhưng không sao, em đã khắc phục việc khai báo các biến của em lại).

Em sử dụng code của anh và chỉ cần thêm vào Select case ActiveSheet.Name là có thể chọn áp dụng sự kiện (Worksheet_Change hoặc Worksheet_SelectionChange) cho Worksheet nào mình muốn. Áp dụng cho tất cả các Workbook bất kỳ.

Chân thành cảm ơn anh. Chúc anh luôn vui!--=0
ban cho minh xin file với. Cảm ơn bạn nhiều.
 
Upvote 0
ban cho minh xin file với. Cảm ơn bạn nhiều.
Bước 1: bạn cho code này vào module
Mã:
Public dim_WsChange As WsChange 'khai bao su kien thao tac tren sheet
Public Sub KhoiTaoLaiSuKien()
    If dim_WsChange Is Nothing Then
        Set dim_WsChange = New WsChange'<=chỗ này khai báo class
        dim_WsChange.CreateApp Application'<= chỗ này khởi tạo sự kiện
    End If
End Sub
Bước 2: tạo 1 class module đổi tên thành "WsChange"
chèn code này vào
Mã:
'=========================================================================
'              CLASS SU KIEN THAO TAC VOI BANG TINH
'=========================================================================
Option Explicit
Private WithEvents ExcelApp As Excel.Application
Public Sub CreateApp(ByVal AppExcel As Excel.Application)
    If ExcelApp Is Nothing Then Set ExcelApp = AppExcel
End Sub
Private Sub Class_Initialize()
    If Not ExcelApp Is Nothing Then Set ExcelApp = Nothing
End Sub
Private Sub Class_Terminate()
    If Not ExcelApp Is Nothing Then Set ExcelApp = Nothing
End Sub
Private Sub ExcelApp_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    msgbox "Ban vua thuc hien thao tac DoubleClick"
End Sub

Private Sub ExcelApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    msgbox "Ban vua thuc hien thao tac SheetChange"
End Sub

Private Sub ExcelApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    msgbox "Ban vua thuc hien thao tac SheetSelectionChange"
   
End Sub
Private Sub ExcelApp_SheetActivate(ByVal Sh As Object)
    msgbox "Ban vua thuc hien thao tac SheetActivate"
End Sub
Bước 3: làm xong hết 2 bước trên thì chạy sub KhoiTaoLaiSuKien
Bước 4: Nhấn "tạch tạch" trên sheet
 
Upvote 0
Thầy Mutants Men cho em thắc mắc tí được không ạ? Em cũng mới nghe đến Class nên hỏi củ chuối mong thầy đừng cười. Em làm theo các bước thầy hướng dẫn phía trên thì ok, nhưng hình như mỗi lần tạo sheet mới phải chạy lại Sub KhoiTaoLaiSuKien đúng không thầy? Nếu đúng vậy thì có cách nào tạo sheet mới mà các sự kiện vẫn y nguyên như sheet cũ, không cần chạy lại Sub KhoiTaoLaiSuKien không ạ?
 
Upvote 0
Thầy Mutants Men cho em thắc mắc tí được không ạ? Em cũng mới nghe đến Class nên hỏi củ chuối mong thầy đừng cười. Em làm theo các bước thầy hướng dẫn phía trên thì ok, nhưng hình như mỗi lần tạo sheet mới phải chạy lại Sub KhoiTaoLaiSuKien đúng không thầy? Nếu đúng vậy thì có cách nào tạo sheet mới mà các sự kiện vẫn y nguyên như sheet cũ, không cần chạy lại Sub KhoiTaoLaiSuKien không ạ?
mình không phải là giáo viên cũng chưa từng dạy ai nên đừng gọi là thầy bạn nhé.
hình như mỗi lần tạo sheet mới
ý bạn là tạo Sheet mới hay tắt File rồi mở lại?
mình đã thử, chạy code xong,
+ Tạo Sheet mới trong 1 file -> vẫn chạy được
+ File/New -> vẫn chạy được
còn bạn tắt excel đi rồi mở lại đương nhiên là không chạy được rồi muốn chạy được thì bạn chép code này thêm vào
Mã:
Private Sub Auto_Open()
         KhoiTaoLaiSuKien 
End Sub
Private Sub Auto_Close()
         If Not dim_WsChange is nothing then Set dim_WsChange = nothing
End Sub
 
Upvote 0
Em giải quyết bằng Workbook_Open rồi ạ. Cảm ơn thầy Mutants Men nhiều :)
 
Lần chỉnh sửa cuối:
Upvote 0
chào cả nhà, e mới nghiên cứu VBA, có đoạn code này e compile mà báo lỗi "Sub or funcion not define" cả nhà giúp e với, e có kèm theo file

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, picname As String
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect([G9], Target) Is Nothing Then
Set Rng = Sheet(1).Range(Sheet(1).[B8], Sheet(1).[B1000].End(x1Up))
picname = ThisWorkbook.Path & "\Hinh\" & Rng.Find(Target).Offset(, 14)
Sheet (2), Shapes([I5].Address).Delete
[I5].Select
With ActiveSheet.Picture.Insert(picname)
'.Name = Target.Offset (1,0).Address
.Name = [I5].Address
'. Left = Target.Offset (1,0).Left: Top = target.Offset (1,0).Top
'. Left = [I5].Left: Top = [I5].Top
Width = 100 '(pixcels)
Height = 150 ' (pixcels)
End With
ActiveSheet.Shapes("$I$5").IncrementTop 30#
ActiveSheet.Shapes("$I$5").IncrementLeft 0
End If
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Ho so quan ly nhan vien.xlsm
    21.2 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom