Worksheet_BeforeRightClick không chạy!

  • Thread starter Thread starter ThuNghi
  • Ngày gửi Ngày gửi
Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tôi có viết 1 code theo sự kiện Right Click thì mở form trên excel 2007, nhưng mà hay bị tình trạng là right click thì không chịu mở form. Làm vài lần thì excel báo sai và phải recovery lại. Hay đóng file mở lại thì không bị nữa.
Code sự kiện như sau:
PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
  If Target.Address = "$D$5" Then
     Cancel = True
     FormDMKH.Show
   End If
   'If Target.Column > 2 Then
   If Target.Column >= 2 And Target.Row > 9 And Target.Row < 16 Then
     Cancel = True
     FormDMMH.Show
   End If
End Sub
Tôi không biết do form bị lỗi hay code lỗi. Mở form bằng gia công (vào VBA) thì vẫn OK.
Nhờ các bạn hướng dẫn giúp, do là hiện tại không lưu được trạng thái trên nên kg có file sai mà up.
Tôi đã làm thêm 1 code trang thái, nếu mở form không được thì chạy mà không ăn thua.
PHP:
Sub TrangThai()
With Application
  .EnableEvents = True
End With
End Sub
Xin cám ơn.
 
Tôi có viết 1 code theo sự kiện Right Click thì mở form trên excel 2007, nhưng mà hay bị tình trạng là right click thì không chịu mở form. Làm vài lần thì excel báo sai và phải recovery lại. Hay đóng file mở lại thì không bị nữa.
Code sự kiện như sau:
PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
  If Target.Address = "$D$5" Then
     Cancel = True
     FormDMKH.Show
   End If
   'If Target.Column > 2 Then
   If Target.Column >= 2 And Target.Row > 9 And Target.Row < 16 Then
     Cancel = True
     FormDMMH.Show
   End If
End Sub
Tôi không biết do form bị lỗi hay code lỗi. Mở form bằng gia công (vào VBA) thì vẫn OK.
Nhờ các bạn hướng dẫn giúp, do là hiện tại không lưu được trạng thái trên nên kg có file sai mà up.
Tôi đã làm thêm 1 code trang thái, nếu mở form không được thì chạy mà không ăn thua.
PHP:
Sub TrangThai()
With Application
  .EnableEvents = True
End With
End Sub
Xin cám ơn.
Bác thử dùng cái này xem sao?

PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
  If Target.Address = "$D$5" Then
     Cancel = True
     FormDMKH.Show
   ElseIf Target.Column >= 2 And Target.Row > 9 And Target.Row < 16 Then
     Cancel = True
     FormDMMH.Show
   End If
End Sub
 
Upvote 0
Bác thử dùng cái này xem sao?
PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
  If Target.Address = "$D$5" Then
     Cancel = True
     FormDMKH.Show
   ElseIf Target.Column >= 2 And Target.Row > 9 And Target.Row < 16 Then
     Cancel = True
     FormDMMH.Show
   End If
End Sub
Cám ơn nhiều, để test vài lần thử xem. Mình đổi lại như sau liệu có logich?
PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
  If Target.Address = "$D$5" Then
    Cancel = True
    FormDMKH.Show
  ElseIf Target.Column = 2 Then
    If Target.Row > 9 Then
      If Target.Row < 16 Then
        Cancel = True
        FormDMMH.Show
      End If
    End If
  End If
End Sub
 
Upvote 0
1. Đoạn code đầu bài #1 hình như thiếu 1 cái End If thì phải?
2. Code bài #1: Logic gì mà If > 2 rồi lại If >= 2, quá khổ sở, mà lại sai logic. Đã >2 thì sẽ không bao giờ thoả =2. vậy thì rightClick B10:B15 không có tác dụng, mà tác dụng cho đâu đâu ấy.
3. Logic kiểu bài #3, VBA đọc chắc cũng hiểu, nhưng người đọc thấy nó sao sao ấy. Hoặc như boyxin, hoặc là vầy:

PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
  If Target.Address = "$D$5" Or (Target.Column = 2 And Target.Row > 9 And Target.Row < 16 ) Then
     Cancel = True
     FormDMKH.Show
   End If
End Sub

Hoặc là:

PHP:
If Not Intersect (Target, Union(Range("D5"), Range("B10:B15"))) Is Nothing Then
 
Lần chỉnh sửa cuối:
Upvote 0
Sorry, 2 Form khác nhau,
Code sẽ là vầy: (dùng Else thay cho ElseIf cho rõ ràng)

PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$D$5" Then
    Cancel = True
    FormDMKH.Show
Else
    If Not Intersect(Target, Range("B10:B15")) Is Nothing Then
        Cancel = True
        FormDMMH.Show
    End If
End If
End Sub
 
Upvote 0
Mình đọc bài của Ptm0412 hiểu ra rằng bạn dùng 2 Form để chọn 2 loại DM. Tại sao bạn lại không dồn chúng làm 1 cho gọn nhỉ
 
Upvote 0
Mình đọc bài của Ptm0412 hiểu ra rằng bạn dùng 2 Form để chọn 2 loại DM. Tại sao bạn lại không dồn chúng làm 1 cho gọn nhỉ
2 form trên chọn 2 DM khác nhau, số cột và cách tìm cũng khác nhau, em nghĩ nếu cho vào chung thì phải thêm một nút chọn nữa. Và phải viết code mở thêm form, vậy nên em cho riêng để còn dễ kiểm tra và chỉnh sửa.
Em chỉ thắc mắc là chạy code theo sự kiện hay bị vô hiệu thôi. Em chưa tìm ra nguyên nhân, vì có máy bị, máy không. Và các máy đều có cài KIS. Em nghĩ chắc là do KIS phá file nhúng OLE hay là file Ex2007 có tuỳ chọn Auto Recovery. Em đang loại suy.
Cám ơn các Anh nhiều.
 
Upvote 0
He He!!! Đôi khi dân "anh chị" cũng có lúc lẩn thẩn nhỉ!!! Khi gọi Form bằng sự kiện ta lấy thuộc tính Target để sử lý, khi Form show thì đâu có di chuyển trên sheet nên khi trả về thì Activecell chính là Target chứ. Vậy khi ở cột nào thì ta biết gọi Form gì rồi và khi trả về vô tư bảo nó trả giá trị ta chọn vào Activecell. ThuNghi nói vậy đôi khi chọn nút cũng mệt.
Mình thấy bài Data Selector của anh Duyệt rất chuẩn mực cho dạng này, bạn tham khảo xem.
 
Upvote 0
Sealand nói đúng rồi, 1 form dùng mấy chuyện chẳng được.

Có 2 cách:

1. Dùng 1 biến public đại khái như sau:

PHP:
Public DM 
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$D$5" Then
    DM = "KH"
    Cancel = True
    FormDM.Show
Else
    If Not Intersect(Target, Range("B10:B15")) Is Nothing Then
        DM = "MH"
        Cancel = True
        FormDM.Show
    End If
End If
End Sub

Code của Form:

PHP:
Private Sub UserForm_Activate()
If DM = "KH" Then
    ''Code thiết lập Caption, RowSource, .. cho Khách hàng
Else
    ''Code thiết lập Caption, RowSource, .. cho Mặt hàng
End If
End Sub
1 thí dụ đây;1 form vừa nhập kho vừa xuất kho. Cái combobox, khi xuất kho thì list khách hàng, khi nhập kho thì list nhà cung cấp.

2. Dùng Property FormDM.Tag

Code tương tự.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom