bỏ qua thủ tục hiện Form khi không có thao tác nào trên cell trước Active cell (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

quoc nhat

Thành viên tiêu biểu
Tham gia
8/3/12
Bài viết
567
Được thích
43
Nghề nghiệp
cán bộ ngành y tế
Thầy cô giúp em với
Em đang bó tay khi viết lại đoạn code trong sự kiện Worksheet_SelectionChange()
Code như sau:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect(Target, [I63:I68]) Is Nothing Then
UserForm8.Show
Cancel = True
End If
End Sub

Code sau sửa lại như thế nào khi:
1. không thao tác nào trên các cell (B63:B68) mà select tới I63:I68 thì bỏ qua thủ tục hiện form 2.Ngược lại( Nếu có thao tác trên B63:B68 khi select qua I63:I68 thì mới cho hiện form
Chỉ giùm em với
Em cảm ơn nhiều!
 
Lần chỉnh sửa cuối:
Thầy cô giúp em với
Em đang bó tay khi viết lại đoạn code trong sự kiện Worksheet_SelectionChange()
Code như sau:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect(Target, [I63:I68]) Is Nothing Then
UserForm8.Show
Cancel = True
End If
End Sub

Code sau sửa lại như thế nào khi:
1. không thao tác nào trên các cell (B63:B68) mà select tới I63:I68 thì bỏ qua thủ tục hiện form 2.Ngược lại( Nếu có thao tác trên B63:B68 khi select qua I63:I68 thì mới cho hiện form
Chỉ giùm em với
Em cảm ơn nhiều!
Bạn thử nghiệm thế này:
1. Khai báo 1 biến toàn cục HasChanged (hoặc sử dụng name cũng được) để đánh dấu việc có thay đổi trên vùng B63:B68.
2. Sử dụng sự kiện Worksheet_Change: Nếu có sự thay đổi giá trị trong vùng B63:B68 thì thay đổi trạng thái của biến HasChanged.
3. Sử dụng sự kiện Worksheet_SelectionChange: Nếu Target nằm trong vùng I63:I68 thì dựa vào trạng thái của biến HasChanged để quyết định có hiện Form hay không.

Tôi gợi ý như vậy có lẽ bạn tự viết code được chứ?!
 
Upvote 0
Bạn thử nghiệm thế này:
1. Khai báo 1 biến toàn cục HasChanged (hoặc sử dụng name cũng được) để đánh dấu việc có thay đổi trên vùng B63:B68.
2. Sử dụng sự kiện Worksheet_Change: Nếu có sự thay đổi giá trị trong vùng B63:B68 thì thay đổi trạng thái của biến HasChanged.
3. Sử dụng sự kiện Worksheet_SelectionChange: Nếu Target nằm trong vùng I63:I68 thì dựa vào trạng thái của biến HasChanged để quyết định có hiện Form hay không.

Tôi gợi ý như vậy có lẽ bạn tự viết code được chứ?!
Anh hiểu rộng biết nhiều giúp em với chứ em có biết lập trình gì đâu ( đang học hỏi mà anh)
Em vọc mãi bao giờ mới ra được giờ.
Giúp em luôn đi anh
Em cảm ơn nhiều
 
Upvote 0
Anh hiểu rộng biết nhiều giúp em với chứ em có biết lập trình gì đâu ( đang học hỏi mà anh)
Em vọc mãi bao giờ mới ra được giờ.
Giúp em luôn đi anh
Em cảm ơn nhiều
Thầy cô giúp em một tay với
Đầu năm xem như là lì xì cho em đi
em cảm ơn nhiều
 
Upvote 0
Thầy cô giúp em với
Em đang bó tay khi viết lại đoạn code trong sự kiện Worksheet_SelectionChange()
Code như sau:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect(Target, [I63:I68]) Is Nothing Then
UserForm8.Show
Cancel = True
End If
End Sub

Code sau sửa lại như thế nào khi:
1. không thao tác nào trên các cell (B63:B68) mà select tới I63:I68 thì bỏ qua thủ tục hiện form 2.Ngược lại( Nếu có thao tác trên B63:B68 khi select qua I63:I68 thì mới cho hiện form
Chỉ giùm em với
Em cảm ơn nhiều!

Tôi đọc bài của bạn từ lâu nhưng tôi rất dị ứng với kiểu nói chung chung.
Thao tác là gì?

1. click B63 rồi Enter đã là thao tác chưa?
2. click B63 rồi nhập dữ liệu hoặc sửa dữ liệu, đó mới là thao tác?
3. Nếu click B63 và sửa/nhập dữ liệu rồi cả ngày không "đụng" tới B63: B68, I63:I68, cuối ngày mới click I63 thì cái thao tác click B63 và sửa/nhập dữ liệu có còn tác dụng không? Tức chỉ xử lý click I63 ngay sau khi click B63 và sửa/nhập dữ liệu hay xử lý cả khi trước khi click I63 có những "thao tác" khác?
4. Khi click B63 và sửa/nhập dữ liệu rồi click I63 thì hiện Form. Thế bây giờ sau khi đóng Form ta lại click tiếp vào I64 hoặc click I64 sau khi nhập/sửa dữ liệu ở "chỗ khác" thì cái click B63 và sửa/nhập dữ liệu lúc trước còn hiệu lực hay không? Hay là sau khi "thao tác" trên B63: B68 và hiện Form (do chọn ô trong I63:I68) thì "xí xóa" cái "thao tác" kia và muốn hiện Form sau đó thì lại phải "thao tác" tiếp trên B63: B68? Bởi nếu không thì chỉ cần click B63 và sửa/nhập dữ liệu 1 lần rồi sau đó 1000 lần click I63:I68 là 1000 lần hiện Form?
5. Có sự tương ứng không? Vd. nếu click B63 và sửa/nhập dữ liệu thì click I64:I68 có hiện Form không hay chỉ hiện khi click I63 (ô cùng dòng)?

Nhiều người thích đoán rồi viết, rồi chưa đúng ý thì sửa. Tôi không ham cái trò chơi như thế.
Rỗi hơi nên viết vài dòng như thế.
 
Upvote 0
Tôi đọc bài của bạn từ lâu nhưng tôi rất dị ứng với kiểu nói chung chung.
Thao tác là gì?

1. click B63 rồi Enter đã là thao tác chưa?
2. click B63 rồi nhập dữ liệu hoặc sửa dữ liệu, đó mới là thao tác?
3. Nếu click B63 và sửa/nhập dữ liệu rồi cả ngày không "đụng" tới B63: B68, I63:I68, cuối ngày mới click I63 thì cái thao tác click B63 và sửa/nhập dữ liệu có còn tác dụng không? Tức chỉ xử lý click I63 ngay sau khi click B63 và sửa/nhập dữ liệu hay xử lý cả khi trước khi click I63 có những "thao tác" khác?
4. Khi click B63 và sửa/nhập dữ liệu rồi click I63 thì hiện Form. Thế bây giờ sau khi đóng Form ta lại click tiếp vào I64 hoặc click I64 sau khi nhập/sửa dữ liệu ở "chỗ khác" thì cái click B63 và sửa/nhập dữ liệu lúc trước còn hiệu lực hay không? Hay là sau khi "thao tác" trên B63: B68 và hiện Form (do chọn ô trong I63:I68) thì "xí xóa" cái "thao tác" kia và muốn hiện Form sau đó thì lại phải "thao tác" tiếp trên B63: B68? Bởi nếu không thì chỉ cần click B63 và sửa/nhập dữ liệu 1 lần rồi sau đó 1000 lần click I63:I68 là 1000 lần hiện Form?
5. Có sự tương ứng không? Vd. nếu click B63 và sửa/nhập dữ liệu thì click I64:I68 có hiện Form không hay chỉ hiện khi click I63 (ô cùng dòng)?

Nhiều người thích đoán rồi viết, rồi chưa đúng ý thì sửa. Tôi không ham cái trò chơi như thế.
Rỗi hơi nên viết vài dòng như thế.
EM xin lỗi anh Siwtom và các thầy cô .Cảm ơn anh vì đã có những nhận xét trong cách trình bày câu hỏi của em, Đôi khi diển đạt theo ý muốn là rất khó mà anh.
Cho em diển đạt lại bài của mình và xin được sự giúp đỡ của anh, anh nhé:
- khi có sự chỉnh sửa hoặc nhập dữ liệu ở B63 khi select tới i63 cho hiện Form còn nếu không thì bỏ qua không hiện Form. (chọn dữ liệu trên form và nhập dữ liệu xuống B63 và khi đó vị trí con trỏ đang nằm ở I63 mình sẽ nhập trực tiếp số lượng vào) nhập xọng I63 nhấn phím Enter hoặc phím Tab sẽ select tới B64 vì c ác cell khác đã bị khóa chỉ trừ B63:B68 và I63:I68
- Ở các dòng B64-I64, B65-I65, B66-I66, B67-I67, B68-I68 cũng tương tự.
Nếu sửa hoặc nhập dữ liệu ở B64 chẳng hạn mà không select tới cột I cùng dòng thì cũng không cho hiện Form.
Không biết em diển đạt như thế các anh chị có hiểu và giúp em không
Mong nhận được sự giúp đỡ của các thầy cô và các anh chị
Cảm ơn mọi người
 
Lần chỉnh sửa cuối:
Upvote 0
EM xin lỗi anh Siwtom và các thầy cô .Cảm ơn anh vì đã có những nhận xét trong cách trình bày câu hỏi của em, Đôi khi diển đạt theo ý muốn là rất khó mà anh.
Cho em diển đạt lại bài của mình và xin được sự giúp đỡ của anh, anh nhé:
- khi có sự chỉnh sửa hoặc nhập dữ liệu ở B63 khi select tới i63 cho hiện Form còn nếu không thì bỏ qua không hiện Form. (chọn dữ liệu trên form và nhập dữ liệu xuống B63 và khi đó vị trí con trỏ đang nằm ở I63 mình sẽ nhập trực tiếp số lượng vào) nhập xọng I63 nhấn phím Enter hoặc phím Tab sẽ select tới B64 vì c ác cell khác đã bị khóa chỉ trừ B63:B68 và I63:I68
- Ở các dòng B64-I64, B65-I65, B66-I66, B67-I67, B68-I68 cũng tương tự.
Nếu sửa hoặc nhập dữ liệu ở B64 chẳng hạn mà không select tới cột I cùng dòng thì cũng không cho hiện Form.
Không biết em diển đạt như thế các anh chị có hiểu và giúp em không
Mong nhận được sự giúp đỡ của các thầy cô và các anh chị
Cảm ơn mọi người

Chỗ xanh xanh tôi không hiểu. Thứ tự là: Chọn B63 --> sửa/nhập dữ liệu --> Enter --> chọn I63 --> hiện Form?. Vậy thì phải hiểu: "chọn dữ liệu trên form và nhập dữ liệu xuống B63" như thế nào? Vì tôi hiểu là Form đã hiển thị ("chọn dữ liệu trên form") và code nhập dữ liệu đã chọn xuống sheet xuống B63. Và "chọn dữ liệu trên form" là chọn ở đâu trên Form? Chọn cái đã được gõ vào TextBox nào đó? Mà đã là "chọn dữ liệu trên form và nhập dữ liệu xuống B63" thì có nghĩa là Form đang hiển thị thì "vị trí con trỏ đang nằm ở I63 mình sẽ nhập trực tiếp số lượng vào" phải hiểu thế nào? Tức Form đang hiển thị và ta cứ nhấn một loạt phím thì trên sheet ở ô I63 sẽ xuất hiện dữ liệu?

Có lẽ tôi chậm hiểu quá. Vậy bạn hãy nói rõ cho tôi. Giả sử Form chưa hiển thị. Ta chọn B63 và sửa/nhập dữ liệu? Nếu đúng thế thì sau đó ta chọn I63 thì sẽ hiển thị Form? Nếu đúng thế thì bạn trình bầy các bước tiếp theo cho rõ.
 
Upvote 0
Chỗ xanh xanh tôi không hiểu. Thứ tự là: Chọn B63 --> sửa/nhập dữ liệu --> Enter --> chọn I63 --> hiện Form?. Vậy thì phải hiểu: "chọn dữ liệu trên form và nhập dữ liệu xuống B63" như thế nào? Vì tôi hiểu là Form đã hiển thị ("chọn dữ liệu trên form") và code nhập dữ liệu đã chọn xuống sheet xuống B63. Và "chọn dữ liệu trên form" là chọn ở đâu trên Form? Chọn cái đã được gõ vào TextBox nào đó? Mà đã là "chọn dữ liệu trên form và nhập dữ liệu xuống B63" thì có nghĩa là Form đang hiển thị thì "vị trí con trỏ đang nằm ở I63 mình sẽ nhập trực tiếp số lượng vào" phải hiểu thế nào? Tức Form đang hiển thị và ta cứ nhấn một loạt phím thì trên sheet ở ô I63 sẽ xuất hiện dữ liệu?

Có lẽ tôi chậm hiểu quá. Vậy bạn hãy nói rõ cho tôi. Giả sử Form chưa hiển thị. Ta chọn B63 và sửa/nhập dữ liệu? Nếu đúng thế thì sau đó ta chọn I63 thì sẽ hiển thị Form? Nếu đúng thế thì bạn trình bầy các bước tiếp theo cho rõ.
Ý em thế này thầy Siwtom ạ:
Em gõ một ký tự "a" chẳng hạn vào B63 nhấn Enter sẽ Select đến I63 (Em đặt trong Option Exel ...> Edit>> Mover selection After Enter = Right ) khi đó Form sẽ hiện lên ( vì trong sự kiện Worksheet_SelectionChange() em đặt thủ tục hiện Form khi select đến I63:I68) . trên Form tìm kiếm: Textbox sẽ lấy ký tự vào nhập vào B63 (Activecell), trên Listbox sẽ hiện thị( tìm kiếm) tất cả những thuốc có ký tự đầu là "a" chọn thuốc đúng nhất trên Listbox của Form sau đó nhấn nút "chọn thuốc này" Form sẽ tắt và mã thuốc của thuốc vừa chọn trên Form sẽ được nhập xuống B63 lúc nãy mĩnh đã nhập chữ "a".Khi đó con trỏ đang ở vị trí I63 vậy ta chỉ cần nhập số lượng vào. Xong nhấn Enter lúc này sẽ select đến B64 cũng tương tự như vậy (khi nãy em có trình bày là các cell không liên quan đã bị khóa protect chỉ có chỉnh sửa/nhập dữ liệu được ở B63:B68, I63:I68)
Mục đích câu hỏi của em là nếu không thay đổi/ nhập dữ liệu ở B63:B68 mà nhấn Enter luôn thì không cho hiện form tìm kiếm trên.
Em gửi File đính kèm cho thầy dể hiểu
Mong thầy hiểu và giúp đõ em
Em cảm ơn thầy
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ý em thế này thầy Siwtom ạ:
Em gõ một ký tự "a" chẳng hạn vào B63 nhấn Enter sẽ Select đến I63 (Em đặt trong Option Exel ...> Edit>> Mover selection After Enter = Right ) khi đó Form sẽ hiện lên ( vì trong sự kiện Worksheet_SelectionChange() em đặt thủ tục hiện Form khi select đến I63:I68) . trên Form tìm kiếm: Textbox sẽ lấy ký tự vào nhập vào B63 (Activecell), trên Listbox sẽ hiện thị( tìm kiếm) tất cả những thuốc có ký tự đầu là "a" chọn thuốc đúng nhất trên Listbox của Form sau đó nhấn nút "chọn thuốc này" Form sẽ tắt và mã thuốc của thuốc vừa chọn trên Form sẽ được nhập xuống B63 lúc nãy mĩnh đã nhập chữ "a".Khi đó con trỏ đang ở vị trí I63 vậy ta chỉ cần nhập số lượng vào. Xong nhấn Enter lúc này sẽ select đến B64 cũng tương tự như vậy (khi nãy em có trình bày là các cell không liên quan đã bị khóa protect chỉ có chỉnh sửa/nhập dữ liệu được ở B63:B68, I63:I68)
Mục đích câu hỏi của em là nếu không thay đổi/ nhập dữ liệu ở B63:B68 mà nhấn Enter luôn thì không cho hiện form tìm kiếm trên.
Mong thầy hiểu và giúp đõ em
Em cảm ơn thầy

Đưa file đó lên đây xem nào,

Và mô tả kỹ xem ,

và tham khảo ở đây, .. sao không nhập kiểu giống thế cho tiện hơn,
http://www.giaiphapexcel.com/forum/...-tạo-combo-box-thông-minh&p=513138#post513138
 
Upvote 0
Upvote 0
Em lỡ theo cái này rồi bây giờ thay đổi thấy khó làm quen lắm anh ạ

Vậy thì thay đổi lại đi có sao,

Còn vẫn thích cái như hiện tại, thì dùng code sau

Thay toàn bộ code trong sheet code hiện tại thành, là được, bạn tự kiểm tra lại dùng cho thích hợp với code của mình (tự chịu trách nhiệm về các kết quả, vì tôi chỉ thêm chức năng cho hiển hay không hiển thị form - nội dung khác là code cũ của bạn)

PHP:
Public MyBBChange As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    MyBBChange = Not Intersect(Target, [B63:B68]) Is Nothing
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not MyBBChange Then Exit Sub
    Application.ScreenUpdating = False
    If Not Intersect(Target, [I63:I68]) Is Nothing Then
        UserForm1.Show
    End If
    MyBBChange = False
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Ý em thế này thầy Siwtom ạ:
Em gõ một ký tự "a" chẳng hạn vào B63 nhấn Enter sẽ Select đến I63 (Em đặt trong Option Exel ...> Edit>> Mover selection After Enter = Right ) khi đó Form sẽ hiện lên ( vì trong sự kiện Worksheet_SelectionChange() em đặt thủ tục hiện Form khi select đến I63:I68) . trên Form tìm kiếm: Textbox sẽ lấy ký tự vào nhập vào B63 (Activecell), trên Listbox sẽ hiện thị( tìm kiếm) tất cả những thuốc có ký tự đầu là "a" chọn thuốc đúng nhất trên Listbox của Form sau đó nhấn nút "chọn thuốc này" Form sẽ tắt và mã thuốc của thuốc vừa chọn trên Form sẽ được nhập xuống B63 lúc nãy mĩnh đã nhập chữ "a".Khi đó con trỏ đang ở vị trí I63 vậy ta chỉ cần nhập số lượng vào. Xong nhấn Enter lúc này sẽ select đến B64 cũng tương tự như vậy (khi nãy em có trình bày là các cell không liên quan đã bị khóa protect chỉ có chỉnh sửa/nhập dữ liệu được ở B63:B68, I63:I68)
Mục đích câu hỏi của em là nếu không thay đổi/ nhập dữ liệu ở B63:B68 mà nhấn Enter luôn thì không cho hiện form tìm kiếm trên.
Em gửi File đính kèm cho thầy dể hiểu
Mong thầy hiểu và giúp đõ em
Em cảm ơn thầy

Ngay chuyện trình bầy mà bạn cũng không làm chính xác được?

Em gõ một ký tự "a" chẳng hạn vào B63 nhấn Enter sẽ Select đến I63

Khi nhập xong B63 và Enter thì C63 sẽ được chọn chứ đâu phải I63? Mà thôi, cho là 7 Enter nhé.

trên Form tìm kiếm: Textbox sẽ lấy ký tự vào nhập vào B63 (Activecell)

Khi select tới I63 và Form hiện lên thì I63 là ActiveCell chứ nhỉ, đâu có là B63?
--------------
Thôi tôi thử làm xem đúng ý chưa.

Chọn Bxyz (xyz = 63..68) --> sửa/nhập liệu --> Enter mỏi tay tới Ixyz hoặc click vào Ixyz --> hiện Form --> Trong UserForm_Initialize nhập Bxyz vào TextBox --> làm các việc của bạn --> nhấn nút "chọn thuốc này" --> giá trị "ở đâu đó" sẽ được nhập xuống Bxyz đồng thời "tắt" Form --> nhập liệu vào Ixyz đang Active (nếu không thích thì thôi)

Muốn hiện Form thì lại chọn Bxyz mới và bắt đầu cuộc chơi mới

code cho sheet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Intersect(Target, Range("B63:B68")) Is Nothing Then RowSelect = Target.Row
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row = RowSelect And Target.Column = 9 Then
        UserForm1.Show
    End If
End Sub

module
Mã:
Public RowSelect As Long

UserForm
Mã:
Private Sub CommandButton1_Click()
    ActiveSheet.Cells(RowSelect, 2) = "ở đâu đó" vd. TextBox1.Text
    RowSelect = 0
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    TextBox1.Text = ActiveSheet.Cells(RowSelect, 2)
End Sub
--------------
"Ở đâu đó". Vd. khi chọn (click) mục trong ListBox thì "nhồi" dữ liệu ở dòng chọn vào TextBox1, sau đó khi nhấn nút "chọn thuốc này" thì "ở đâu đó" thay bằng TextBox1.Text
----------------
Tôi không hiểu cách của bạn lắm. Theo tôi thì: chọn ô trong B63:B68 --> lập tức hiện Form --> nhập từ nào đó vào TextBox1 --> làm các việc tìm kiếm để xác định tên thuốc --> nhập vào vd. TextBox2 số lượng cho thuốc đã xác định --> nhấn nút "chọn thuốc này" --> code sẽ "đập" xuống sheet vào ô chọn ở cột B tên thuốc còn vào cột I cùng dòng số lượng + xóa TextBox1 và TextBox2 --> lại có thể bắt đầu cuộc chơi mới --> khi nhấn nút "chọn thuốc này" thì dữ liệu sẽ được đập xuống cột B và I ở dòng tiếp theo --> chơi chán nhập liệu thì nhấn nút Close và bây giờ mới đóng Form
 
Upvote 0
Vậy thì thay đổi lại đi có sao,

Còn vẫn thích cái như hiện tại, thì dùng code sau

Thay toàn bộ code trong sheet code hiện tại thành, là được, bạn tự kiểm tra lại dùng cho thích hợp với code của mình (tự chịu trách nhiệm về các kết quả, vì tôi chỉ thêm chức năng cho hiển hay không hiển thị form - nội dung khác là code cũ của bạn)

PHP:
Public MyBBChange As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    MyBBChange = Not Intersect(Target, [B63:B68]) Is Nothing
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not MyBBChange Then Exit Sub
    Application.ScreenUpdating = False
    If Not Intersect(Target, [I63:I68]) Is Nothing Then
        UserForm1.Show
    End If
    MyBBChange = False
End Sub
hì, cảm ơn anh vì lời nhắc nhở trên
Đúng ý em rồi anh, cảm ơn anh nhiều
 
Upvote 0
Ngay chuyện trình bầy mà bạn cũng không làm chính xác được?



Khi nhập xong B63 và Enter thì C63 sẽ được chọn chứ đâu phải I63? Mà thôi, cho là 7 Enter nhé.



Khi select tới I63 và Form hiện lên thì I63 là ActiveCell chứ nhỉ, đâu có là B63?
--------------
Thôi tôi thử làm xem đúng ý chưa.

Chọn Bxyz (xyz = 63..68) --> sửa/nhập liệu --> Enter mỏi tay tới Ixyz hoặc click vào Ixyz --> hiện Form --> Trong UserForm_Initialize nhập Bxyz vào TextBox --> làm các việc của bạn --> nhấn nút "chọn thuốc này" --> giá trị "ở đâu đó" sẽ được nhập xuống Bxyz đồng thời "tắt" Form --> nhập liệu vào Ixyz đang Active (nếu không thích thì thôi)

Muốn hiện Form thì lại chọn Bxyz mới và bắt đầu cuộc chơi mới

code cho sheet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Not Intersect(Target, Range("B63:B68")) Is Nothing Then RowSelect = Target.Row
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row = RowSelect And Target.Column = 9 Then
        UserForm1.Show
    End If
End Sub

module
Mã:
Public RowSelect As Long

UserForm
Mã:
Private Sub CommandButton1_Click()
    ActiveSheet.Cells(RowSelect, 2) = "ở đâu đó" vd. TextBox1.Text
    RowSelect = 0
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    TextBox1.Text = ActiveSheet.Cells(RowSelect, 2)
End Sub
--------------
"Ở đâu đó". Vd. khi chọn (click) mục trong ListBox thì "nhồi" dữ liệu ở dòng chọn vào TextBox1, sau đó khi nhấn nút "chọn thuốc này" thì "ở đâu đó" thay bằng TextBox1.Text
----------------
Tôi không hiểu cách của bạn lắm. Theo tôi thì: chọn ô trong B63:B68 --> lập tức hiện Form --> nhập từ nào đó vào TextBox1 --> làm các việc tìm kiếm để xác định tên thuốc --> nhập vào vd. TextBox2 số lượng cho thuốc đã xác định --> nhấn nút "chọn thuốc này" --> code sẽ "đập" xuống sheet vào ô chọn ở cột B tên thuốc còn vào cột I cùng dòng số lượng + xóa TextBox1 và TextBox2 --> lại có thể bắt đầu cuộc chơi mới --> khi nhấn nút "chọn thuốc này" thì dữ liệu sẽ được đập xuống cột B và I ở dòng tiếp theo --> chơi chán nhập liệu thì nhấn nút Close và bây giờ mới đóng Form
Chắc em gửi File đính kèm muộn nên thầy chưa xem File của em rồi
dạ không phải Enter mỏi tay đâu thầy. Thầy Protec sheet lại hộ em 1 lần nũa là được mà
"Theo tôi thì: chọn ô trong B63:B68 --> lập tức hiện Form --> nhập từ nào đó vào TextBox1 --> làm các việc tìm kiếm để xác định tên thuốc --> nhập vào vd. TextBox2 số lượng cho thuốc đã xác định --> nhấn nút "chọn thuốc này" --> code sẽ "đập" xuống sheet vào ô chọn ở cột B tên thuốc còn vào cột I cùng dòng số lượng + xóa TextBox1 và TextBox2 --> lại có thể bắt đầu cuộc chơi mới --> khi nhấn nút "chọn thuốc này" thì dữ liệu sẽ được đập xuống cột B và I ở dòng tiếp theo --> chơi chán nhập liệu thì nhấn nút Close và bây giờ mới đóng Form"
Cách trên của thầy em đã nghĩ đến nhưng chưa nghĩ được code
Thôi thì để từ từ em suy nghĩ đã thầy còn bây giờ em làm theo cách cũ đã
Cảm ơn thầy đã giúp đỡ em
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng như bác Siwtom nói trên, bạn nên nhập kèm số lượng luôn,

Thử file mới, cho phép nhập số lượng kèm luôn - nhanh hơn , thể hiện ở các điểm sau

+ Hiện thị Form nhập khi B63 .. B68 thay đổi - chú ý lên sửa lại option nhập cho Edit Cell với Enter di chuyển là Down

+ Nhập luôn cả số lượng tại B63...B68, ví dụ nhập a10 --> 10 sẽ dành cho textbox số lượng hộp thoại, ký tự "a" để tìm thuốc (xem comment ở tiêu đề cột B bảng này)

+ Nhập luôn số lượng, Dĩ nhiên text box số lượng bạn có thể sửa lại

+ Trong module đã thay hàm FilterArray2D... thành FilterArr khỏi Dic to Dic nhỏ, đơn giản code so với hàm cũ

+ code thay đổi , chắc Quoc Nhat đọc code sẽ hiểu
 

File đính kèm

Upvote 0
Cũng như bác Siwtom nói trên, bạn nên nhập kèm số lượng luôn,

Thử file mới, cho phép nhập số lượng kèm luôn - nhanh hơn , thể hiện ở các điểm sau

+ Hiện thị Form nhập khi B63 .. B68 thay đổi - chú ý lên sửa lại option nhập cho Edit Cell với Enter di chuyển là Down

+ Nhập luôn cả số lượng tại B63...B68, ví dụ nhập a10 --> 10 sẽ dành cho textbox số lượng hộp thoại, ký tự "a" để tìm thuốc (xem comment ở tiêu đề cột B bảng này)

+ Nhập luôn số lượng, Dĩ nhiên text box số lượng bạn có thể sửa lại

+ Trong module đã thay hàm FilterArray2D... thành FilterArr khỏi Dic to Dic nhỏ, đơn giản code so với hàm cũ

+ code thay đổi , chắc Quoc Nhat đọc code sẽ hiểu
Cảm ơn anh nhiều lắm
Theo ý kiến và bài tham khảo trên của anh em sẽ triển khai theo cách của anh và thầy Siwtom đã nói trên.
Một lần nữa cảm ơn anh chị thầy cô và GPE
 
Upvote 0

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

Back
Top Bottom