Giúp sửa code để chỉ chạy trên file chứa code

hunglam123

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
31 Tháng ba 2020
Bài viết
180
Được thích
40
Điểm
35
Tuổi
32
Chào cả Nhà GPE. Em có dùng code sau đế nhấn Nút Delete xóa 1 hàng 4 cột cùng lúc. Code thì chạy Ok. Nhưng chỉ đúng khi em mở đúng 1 file này trên máy tính. Còn em mở thêm file khác ( Không đóng file chạy code ) thì khi em nhấn Delete thì code nó cũng xóa 1 hàng 4 cột .
Em muốn code chỉ hoạt động trên file chứa code khi trên máy tính có nhiều file, Các file khác nhấn Delete thì như mặc định chỉ xóa mỗi ô đang chọn
Em xin chân thành cảm ơn


Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveSheet.Name = "data" Then
                If Not Intersect(Target, Range("A1:D100")) Is Nothing Then
                    Application.OnKey "{DELETE}", "chaycode"  ' nhan delete xoa dong
                Else
                    Application.OnKey "{DELETE}"
                End If
                
            
Else
     Application.OnKey "{DELETE}"
End If
End Sub

Private Sub Worksheet_Deactivate()
Application.OnKey "{DELETE}"
End Sub


Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,356
Được thích
1,248
Điểm
560
Bạn sửa
Mã:
Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
thành
Mã:
Sub chaycode()
Dim i As Long
with thisworkbook.activesheet
i = .Selection.Row
.Range("A" & i & ":D" & i).ClearContents
end with
End Sub
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,145
Được thích
4,716
Điểm
860
Chào cả Nhà GPE. Em có dùng code sau đế nhấn Nút Delete xóa 1 hàng 4 cột cùng lúc. Code thì chạy Ok. Nhưng chỉ đúng khi em mở đúng 1 file này trên máy tính. Còn em mở thêm file khác ( Không đóng file chạy code ) thì khi em nhấn Delete thì code nó cũng xóa 1 hàng 4 cột .
Em muốn code chỉ hoạt động trên file chứa code khi trên máy tính có nhiều file, Các file khác nhấn Delete thì như mặc định chỉ xóa mỗi ô đang chọn
Em xin chân thành cảm ơn


Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveSheet.Name = "data" Then
                If Not Intersect(Target, Range("A1:D100")) Is Nothing Then
                    Application.OnKey "{DELETE}", "chaycode"  ' nhan delete xoa dong
                Else
                    Application.OnKey "{DELETE}"
                End If
               
           
Else
     Application.OnKey "{DELETE}"
End If
End Sub

Private Sub Worksheet_Deactivate()
Application.OnKey "{DELETE}"
End Sub


Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
Nếu có file hy vọng sẽ giúp được.
Bạn sửa
Mã:
Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
thành
Mã:
Sub chaycode()
Dim i As Long
with thisworkbook.activesheet
i = .Selection.Row
.Range("A" & i & ":D" & i).ClearContents
end with
End Sub
Tôi thấy cách này cũng chưa ổn, đang ở workbook khác nhấn phím delete nó vẫn chạy code (Mặc dù nó tác động lên Thisworkbook)
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,356
Được thích
1,248
Điểm
560
Đúng rồi bác @giaiphap , sửa lại thành
Mã:
Sub chaycode()
Dim i As Long
if not thisworkbook is activeworkbook then exit sub
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,145
Được thích
4,716
Điểm
860
Đúng rồi bác @giaiphap , sửa lại thành
Mã:
Sub chaycode()
Dim i As Long
if not thisworkbook is activeworkbook then exit sub
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
Tôi thấy cũng chưa ổn, sang workbook khác nhấn Delete không có tác dụng xóa dữ liệu trong ô đang chọn. Tôi muốn thấy file vì có lẽ dùng ClassModule sẽ ổn hơn.
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,356
Được thích
1,248
Điểm
560
Xin lỗi các bác, do không có file nên mình chỉ đoán. Thấy sai nhiều quá nên mới tạo file thử. Chỉ thêm code workbook là được:
Code trên sheet data:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveSheet.Name = "data" Then
                If Not Intersect(Target, Range("A1:D100")) Is Nothing Then
                    Application.OnKey "{DELETE}", "chaycode"  ' nhan delete xoa dong
                Else
                    Application.OnKey "{DELETE}"
                End If
                
            
Else
     Application.OnKey "{DELETE}"
End If
End Sub

Private Sub Worksheet_Deactivate()
Application.OnKey "{DELETE}"
End Sub
Code trên workbook:
Mã:
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Application.OnKey "{DELETE}"
End Sub
Code module
Mã:
Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,145
Được thích
4,716
Điểm
860
Xin lỗi các bác, do không có file nên mình chỉ đoán. Thấy sai nhiều quá nên mới tạo file thử. Chỉ thêm code workbook là được:
Code trên sheet data:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If ActiveSheet.Name = "data" Then
                If Not Intersect(Target, Range("A1:D100")) Is Nothing Then
                    Application.OnKey "{DELETE}", "chaycode"  ' nhan delete xoa dong
                Else
                    Application.OnKey "{DELETE}"
                End If
               
           
Else
     Application.OnKey "{DELETE}"
End If
End Sub

Private Sub Worksheet_Deactivate()
Application.OnKey "{DELETE}"
End Sub
Code trên workbook:
Mã:
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Application.OnKey "{DELETE}"
End Sub
Code module
Mã:
Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
Giả sử file chứa code là a, bây giờ ta mở file a và file b. Chọn file a, chọn sheet data, chọn ô A1 (Ô này có sẳn dữ liệu nhé), chọn file b, nhấn Delete (Chạy ngon), chọn lại file a, nhấn Delete...
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,356
Được thích
1,248
Điểm
560
Để hoàn chỉnh có lẽ cần phải sửa cả loạt auto_open, workbook_windowactivate, có thể cả beforeclose nữa. Mình thì ghét mấy cái thủ tục sự kiện nên chẳng mấy khi sờ đến nó.
 

hunglam123

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
31 Tháng ba 2020
Bài viết
180
Được thích
40
Điểm
35
Tuổi
32
Giả sử file chứa code là a, bây giờ ta mở file a và file b. Chọn file a, chọn sheet data, chọn ô A1 (Ô này có sẳn dữ liệu nhé), chọn file b, nhấn Delete (Chạy ngon), chọn lại file a, nhấn Delete...
rất mong anh hãy giúp đỡ. Mình mò từ hôm qua đến giờ vẫn chưa được. Mà tại sao mình làm file này mà file kia là có tác dụng là sao nhĩ
Bài đã được tự động gộp:

vẫn chưa có ai làm được anh ạ. Mong anh ra tay giúp đỡ
Bài đã được tự động gộp:

Bạn sửa
Mã:
Sub chaycode()
Dim i As Long
i = Selection.Row
Range("A" & i & ":D" & i).ClearContents
End Sub
thành
Mã:
Sub chaycode()
Dim i As Long
with thisworkbook.activesheet
i = .Selection.Row
.Range("A" & i & ":D" & i).ClearContents
end with
End Sub
cảm ơn bạn. Vẫn chưa được bạn ơi
 

songmai

Thành viên chính thức
Tham gia ngày
6 Tháng tám 2007
Bài viết
93
Được thích
38
Điểm
670
rất mong anh hãy giúp đỡ. Mình mò từ hôm qua đến giờ vẫn chưa được. Mà tại sao mình làm file này mà file kia là có tác dụng là sao nhĩ
Bài đã được tự động gộp:


vẫn chưa có ai làm được anh ạ. Mong anh ra tay giúp đỡ
Bài đã được tự động gộp:


cảm ơn bạn. Vẫn chưa được bạn ơi
Bạn khai báo thêm một biến:
Public MyBook As String

Sau đó tại thủ tục chaycode thêm điều kiện:
If ActiveWorkbook.Name = MyBook Then

Và them một sự kiện Workbook:
Private Sub Workbook_Open()
MyBook = ThisWorkbook.Name
End Sub

thì code sẽ chỉ chạy trên file chứa code
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,145
Được thích
4,716
Điểm
860
Bạn khai báo thêm một biến:
Public MyBook As String

Sau đó tại thủ tục chaycode thêm điều kiện:
If ActiveWorkbook.Name = MyBook Then

Và them một sự kiện Workbook:
Private Sub Workbook_Open()
MyBook = ThisWorkbook.Name
End Sub

thì code sẽ chỉ chạy trên file chứa code
Bạn chọn sheet data, chọn ô A1 (ô này có dữ liệu nhé), save file, đóng file. Mở file lên (không nhấn gì cả nhé), bây giờ nhấn delete...
Khi giúp cho chủ topic này thì phải suy nghĩ kỷ nhé, chủ topic này khó tính lắm. Code phải hoàn hảo tuyệt đối.
 

songmai

Thành viên chính thức
Tham gia ngày
6 Tháng tám 2007
Bài viết
93
Được thích
38
Điểm
670
Bạn chọn sheet data, chọn ô A1 (ô này có dữ liệu nhé), save file, đóng file. Mở file lên (không nhấn gì cả nhé), bây giờ nhấn delete...
Khi giúp cho chủ topic này thì phải suy nghĩ kỷ nhé, chủ topic này khó tính lắm. Code phải hoàn hảo tuyệt đối.
Hihi. Quên nói vụ code chỉ có tác dụng sau khi đóng và chạy lại. Dù sao không đến nỗi bạn ấy không biết điều đó, nhỉ?
 

ppc0312

whom?
Tham gia ngày
2 Tháng tư 2008
Bài viết
624
Được thích
319
Điểm
735
Giải pháp nhanh gọn nhất, là tắt excel khởi động lại và mở file mới là yên tâm không có code nào chạy được
Nếu làm code cũng theo hướng tương tự
(trả lời riêng cho chủ topic)
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,400
Được thích
1,403
Điểm
560
Chào cả Nhà GPE. Em có dùng code sau đế nhấn Nút Delete xóa 1 hàng 4 cột cùng lúc. Code thì chạy Ok. Nhưng chỉ đúng khi em mở đúng 1 file này trên máy tính. Còn em mở thêm file khác ( Không đóng file chạy code ) thì khi em nhấn Delete thì code nó cũng xóa 1 hàng 4 cột .
Em muốn code chỉ hoạt động trên file chứa code khi trên máy tính có nhiều file, Các file khác nhấn Delete thì như mặc định chỉ xóa mỗi ô đang chọn
Em xin chân thành cảm ơn
---------

Bạn thử code dưới cho Workbook

---------
PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  Dim I As Boolean
  On Error Resume Next
  I = Not Intersect(Selection, ThisWorkbook.Sheets("data").Range("A1:D100")) Is Nothing
  Call SetKey(I)
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  Dim I As Boolean
  On Error Resume Next
  I = Not Intersect(Target, ThisWorkbook.Sheets("data").Range("A1:D100")) Is Nothing
  Call SetKey(I)
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
  Dim I As Boolean
  On Error Resume Next
  If Wn.Caption Like ThisWorkbook.Name & " *" Then
    I = Not Intersect(Selection, ThisWorkbook.Sheets("data").Range("A1:D100")) Is Nothing
  End If
  Call SetKey(I)
End Sub
Private Sub SetKey(I As Boolean)
  If Not I Then
      Application.OnKey "{DELETE}"
  Else
      Application.OnKey "{DELETE}", "'" & ThisWorkbook.Name & "'!chaycode"
  End If
End Sub
 

songmai

Thành viên chính thức
Tham gia ngày
6 Tháng tám 2007
Bài viết
93
Được thích
38
Điểm
670
Giải pháp nhanh gọn nhất, là tắt excel khởi động lại và mở file mới là yên tâm không có code nào chạy được
Nếu làm code cũng theo hướng tương tự
(trả lời riêng cho chủ topic)
Bạn ơi, bạn chạy thử file của bạn chủ topic rồi mới thấy. Sau khi code đã vào trạng thái chờ, bạn mở bất kỳ file nào ra, bấm phím Delete thì khối A&dòng hiện hành: D&Dòng hiện hành của vùng A1:D100 của sheet hiện hành (của file mới mở đó) cũng bị xóa sạch, trong khi bạn ấy chỉ muốn code chỉ tác dụng với sheet data của file chứa code của bạn ấy thôi. Thế bạn ấy mới nhờ giúp đấy.
 
Lần chỉnh sửa cuối:

hunglam123

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
31 Tháng ba 2020
Bài viết
180
Được thích
40
Điểm
35
Tuổi
32
Giải pháp nhanh gọn nhất, là tắt excel khởi động lại và mở file mới là yên tâm không có code nào chạy được
Nếu làm code cũng theo hướng tương tự
(trả lời riêng cho chủ topic)
trả lời như bạn thế mình lên đây hỏi làm gì. vấn đề là lúc làm việc là mở nhiều file , mà mình chỉ muốn Code chĩ chạy file có code thôi. Chẳng lẻ chỉ mở đúng 1 file thôi hả.
 

hunglam123

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
31 Tháng ba 2020
Bài viết
180
Được thích
40
Điểm
35
Tuổi
32
---------

Bạn thử code dưới cho Workbook

---------
PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  Dim I As Boolean
  On Error Resume Next
  I = Not Intersect(Selection, ThisWorkbook.Sheets("data").Range("A1:D100")) Is Nothing
  Call SetKey(I)
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  Dim I As Boolean
  On Error Resume Next
  I = Not Intersect(Target, ThisWorkbook.Sheets("data").Range("A1:D100")) Is Nothing
  Call SetKey(I)
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
  Dim I As Boolean
  On Error Resume Next
  If Wn.Caption Like ThisWorkbook.Name & " *" Then
    I = Not Intersect(Selection, ThisWorkbook.Sheets("data").Range("A1:D100")) Is Nothing
  End If
  Call SetKey(I)
End Sub
Private Sub SetKey(I As Boolean)
  If Not I Then
      Application.OnKey "{DELETE}"
  Else
      Application.OnKey "{DELETE}", "'" & ThisWorkbook.Name & "'!chaycode"
  End If
End Sub
Mở file khác lên nó vẫn áp dụng code luôn a. Em chỉ muốn file nào có code thì áp dụng file đó. Các file còn lại Như bình thường
Bài đã được tự động gộp:

Bạn ơi, bạn chạy thử file của bạn chủ topic rồi mới thấy. Sau khi code đã vào trạng thái chờ, bạn mở bất kỳ file nào ra, bấm phím Delete thì khối A&dòng hiện hành: D&Dòng hiện hành của vùng A1:D100 của sheet hiện hành (của file mới mở đó) cũng bị xóa sạch, trong khi bạn ấy chỉ muốn code chỉ tác dụng với sheet data của file chứa code của bạn ấy thôi. Thế bạn ấy mới nhờ giúp đấy.
đúng rồi bạn. bạn đó trả lời tắt đi mở lại. thì mình cần gì lên đây hỏi nữ chứ. trả lời như Muối bỏ Biển
Bài đã được tự động gộp:

Bạn khai báo thêm một biến:
Public MyBook As String

Sau đó tại thủ tục chaycode thêm điều kiện:
If ActiveWorkbook.Name = MyBook Then

Và them một sự kiện Workbook:
Private Sub Workbook_Open()
MyBook = ThisWorkbook.Name
End Sub

thì code sẽ chỉ chạy trên file chứa code
bạn cho mình Code hoàn chỉnh cái
Bài đã được tự động gộp:

Bạn chọn sheet data, chọn ô A1 (ô này có dữ liệu nhé), save file, đóng file. Mở file lên (không nhấn gì cả nhé), bây giờ nhấn delete...
Khi giúp cho chủ topic này thì phải suy nghĩ kỷ nhé, chủ topic này khó tính lắm. Code phải hoàn hảo tuyệt đối.
Test rất kỷ trong phòng thí nghiệm, tât cả mọi tình huống, phải chuẩn xác 100% thì mới gọi code Đúng, còn 99.9 % cũng chưa được Duyệt
 
Top Bottom