• Thứ Hai, 10/10/2005 08:46 (GMT+7)

    Câu hỏi :
    Khi đang trong 1 “user form” của Excel (vd: con trỏ đang nằm trong 1 Listbox hay Textbox của Form), làm sao có thể chọn 1 cell trên sheet chứa Form đó và nội dung của cell tự động được dán vào phần tử được chọn của User Control (giống như khi dùng option Insert -> Function ta có thể chọn các cell đưa vào trong các hộp của Function làm tham số)?

    Trả lời :
    Có 3 vấn đề chính liên quan đến yêu cầu của bạn:

     1. Ở chế độ mặc định, “User Form” hoạt động theo chế độ “Modal”, nghĩa là khi “User Form” đang làm việc, nó chỉ cho phép bạn tương tác với nó (bạn không thể làm gì ngoài cửa sổ User Form). Để có thể chuyển con trỏ làm việc về cell mong muốn trên worksheet trong lúc User Form đang hiển thị, bạn cần thiết lập chế độ Non-Modal cho User Form. Để thiết lập chế độ này, bạn hãy hiển thị cửa sổ thuộc tính của User Form, tìm đến thuộc tính ShowModal và thiết lập giá trị thành False.

     2. Trong User Form có thể có nhiều phần tử nhập liệu (thí dụ như TextBox, ComboBox...), bạn cần khai báo & quản lý biến miêu tả phần tử nào đang “focus” (con trỏ làm việc đang nằm trên nó) để khi bạn chọn cell trong worksheet, máy mới có thể dán nội dung sang phần tử “focus” của User Form một cách chính xác. Thí dụ nếu form có 2 textbox tên là TextBox1 và TextBox2, bạn có thể khai báo & quản lý 2 biến trạng thái kết hợp với chúng như sau:

     Khai báo biến trạng thái focus của từng phần tử trong form

     Public TextBox1F As Boolean

     Public TextBox2F As Boolean
     
     Thủ tục khởi động form

     Private Sub UserForm_Initialize()

     TextBox1F = False

     TextBox2F = False
     ...

     End Sub
     
     Thủ tục xử lý nhấn chuột trên TextBox1 -> focus về nó

     Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

     TextBox1F = True

     TextBox2F = False

     End Sub
     
     Thủ tục xử lý nhấn chuột trên TextBox2 -> focus về nó

     Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

     TextBox1F = False

     TextBox2F = True

     End Sub

     3. Trong Sheet1 của Excel (hay bất kỳ Sheet nào) có 1 thủ tục xử lý sự kiện chọn cell tên là SelectionChange(), mỗi lần người dùng chọn 1 cell mới, thủ tục này sẽ chạy. Bạn có thể viết code trong thủ tục này để copy nội dung của cell đang chọn sang phần tử đang focus trên User Form như sau:

     Thủ tục xử lý việc chọn cell mới trong Worksheet

     Private Sub Worksheet_SelectionChange(ByVal Target As Range)

     If UserForm1.TextBox1F Then

     copy thông tin cần thiết từ cell sang phần tử focus

     UserForm1.TextBox1.Text = Selection.Offset(0, 0).Text

     ElseIf UserForm1.TextBox2F Then

     copy thông tin cần thiết từ cell sang phần tử focus

     UserForm1.TextBox2.Text = Selection.Offset(0, 0).Text

     End If

     End Sub
    Chuyên mục: Lập trình