Userform Excel và các controls: Khái niệm, thuộc tính, phương thức tác động và các sự kiện

Liên hệ QC
Status
Không mở trả lời sau này.

ptm0412

Bad Excel Member
Thành viên BQT
Administrator
Tham gia
4/11/07
Bài viết
13,799
Được thích
36,302
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant

User form và các controls​

Bài này viết cho những ai chưa biết hoặc muốn biết về user form một cách căn bản, và cả những người đã từng tạo form những bỏ qua lý thuyết rất căn bản, nên form chạy bị lỗi, hoặc chỉ dùng cho mỗi 1 tình huống cụ thể.

User form bao gồm một nền chính và các thành phần bên trên gọi là các controls. Bản thân user form và các controls của nó có những thuộc tính (properties) và phương thức tác động (methods). Ngoài ra mỗi đối tượng như vậy sẽ có những sự kiện riêng biệt (events), và ứng với những sự kiện đó sẽ có những thủ tục cho từng sự kiện.

1. User form​

Trên cửa sổ VBA, nhấn chuột phải vào 1 workbook và chọn Insert User form.
1685934032381.png

Một user form trong tình trạng thiết kế sẽ có kèm một controls toolbox, chứa những controls thường dùng để thao tác.

1685934070741.png

a. Các thuộc tính thường dùng​

  • Caption
  • BackColor
  • Font
  • ForeColor
  • Height, Width
  • Picture
  • ShowModal
1685934173315.png

b. Các phương thức​

- Show: mở form từ câu lệnh bên ngoài form, cú pháp
UserForm1.Show
- Hide: Câu lệnh tạm ẩn form, thực hiện từ bên ngoài hoặc từ code của chính bên trong form, cú pháp
UserForm1.Hide, Me.Hide
- Unload: Câu lệnh đóng form, thực hiện từ bên ngoài hoặc từ code của chính bên trong form, cú pháp
Unload UserForm1, Unload Me
- Activate: Kích hoạt 1 user form đang bị ẩn hoặc đang bị che khuất bởi 1 user form khác
UserForm1.Activate

c. Các sự kiện​

  • Initialize: Sự kiện xảy ra trước khi vẽ form lên màn hình (draw hoặc render). Thủ tục cho sự kiện này là Private Sub UserForm_Initialize(). Thường trong sự kiện này người ta gắn những giá trị mặc định cho các textbox, hiện hoặc ẩn các control, gắn giá trị True/ False cho các control có giá trị boolean, gắn dữ liệu nguồn cho listbox, combobox, gắn caption ban đầu cho các label, button.
  • KeyUp, KeyDown, KeyPress: Sự kiện nhấn phím trên bàn phím khi form đang mở. KeyPress (KeyASCII) bao gồm các phím ký tự chữ và số có phân biệt hoa thường; KeyUp, KeyDown (KeyCode) bao gồm chữ, ký số và cả các phím chức năng. Trong KeyCode, chữ hoa chữ thường cùng 1 KeyCode. Như vậy khi cần lấy sự kiện tất cả các ký tự chữ, số và ký tự đạc biệt thì sử dụng KeyPress (ASCII), còn sự kiện phím chức năng thì dùng KeyUp, KeyDown
  • Tùy theo nhấn phím nào sẽ có hành động tương đương. Tuy nhiên KeyDown xảy ra trước KeyPress và trước KeyUp
  • Thí dụ
Mã:
Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Me.Caption = Chr(KeyAscii) & "(" & KeyAscii & ")"
End Sub

1685934417688.png

1685934465850.png

  • Click: Sự kiện xảy ra khi click chuột vào form (chỗ trống, không click vào các controls khác)
Thí dụ về sự kiện Click

Mã:
Private Sub UserForm_Click()
Randomize
    r = Int(Rnd() * 255) ‘ lấy 1 giá trị ngẫu nhiên trong khoảng 0 ~ 255 cho màu đỏ
    g = Int(Rnd() * 255) ‘ lấy 1 giá trị ngẫu nhiên trong khoảng 0 ~ 255 cho màu xanh lá
    b = Int(Rnd() * 255) ‘ lấy 1 giá trị ngẫu nhiên trong khoảng 0 ~ 255 cho màu xanh dương
    Me.BackColor = RGB(r, g, b) ‘ gắn màu cho nền User form bằng màu với hàm RGB khi thực hiện click chuột
End Sub

  • Terminate: Sự kiện xảy ra khi đóng form bằng nút X hoặc command button
Mã:
Private Sub UserForm_Terminate()
 MsgBox "Close your eyes and enjoy"
End Sub

  • Sự kiện di chuyển chuột (Mouse Move), ít dùng
  • Sự kiện nhấn chuột (Mouse Down và Mouse Up). Sự kiện này có tham số Button cho biết nhấn chuột trái hay phải (trái = 1, phải = 2), các tham số x và y là vị trí của con trỏ chuột trên form.
Code

Mã:
Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 1 Then
 MsgBox "left, x = " & X & ", y = " & Y
ElseIf Button = 2 Then
 MsgBox "right"
End If
End Sub

Kết quả nhấn chuột trái:
1685934649349.png

- MouseMove

Xảy ra khi di chuyển chuột trên form. Sự kiện này rất ít dùng, chỉ dùng trong trường hợp form chỉ để nhìn không thao tác, move mouse để đóng form cho nhanh.

- Sự kiện QueryClose
Xảy ra trước khi đóng form. Sự kiện này có tham số Cancel để chặn việc đóng form. Ngoài ra còn tham số CloseMode cho biết người dùng đóng form bằng cách nào:

vbFormControlMenu
0​
Người dùng đóng form bằng nút x​
vbFormCode
1​
Người dùng sử dụng code để đóng form​
vbAppWindows
2​
Người dùng tắt session window hiện tại​
vbAppTaskManager
3​
Người dùng nhấn End task trong Task manager​

Ứng dụng: Không cho đóng form bằng nút x (vô hiệu hóa nút x), mà phải dùng cách khác đã quy định.
Mã:
Private Sub UserForm_Click()
 Unload Me
End Sub
______________________
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 If CloseMode = 0 Then Cancel = True
 Me.Caption = "The Close box won't work! Click me!"
End Sub

Nếu nhấn x thì CloseMode = 0, Cancel sẽ = True và ngăn cản đóng form, và hiện thông báo trên tiêu đề form.
Nếu click trên form thì chạy thủ tục Click, CloseMode = 1 và đóng bình thường.

1685976916015.png
 
Lần chỉnh sửa cuối:
Lời khuyên cho các bạn muốn làm quen hoặc mới bắt đầu làm quen với UserForm.

Chịu khó thực tập, thử các chức năng của Form và các Controls cho thuần thục trước hii nghĩ đến các cách làm vặn vẹo.

Kinh nghiệm hỏi bài ở đây cho thấy hầu hết là chế biến đủ thứ cho "xịn" mà những kiến thức căn bản về Controls là số không tổ bố.
 
Upvote 0

2. Textbox:​

Là control chứa 1 giá trị chuỗi, số dạng chuỗi, ngày tháng dạng chuỗi

a. Các thuộc tính​

  • Autosize: Tự co giãn kích thước theo chiều dài chuỗi. Khi chọn Autosize = True, Text box xuất hiện chỉ vừa cho 1 ký tự, khi nhập đến đâu giãn ra đến đó
1686018260107.png
  • Width, Height: Chiều rộng và chiều cao
  • BackColor và ForeColor: Màu nền và màu chữ
  • ControlTipText: Tip gợi ý khi di chuyển chuột vào textbox
1686018293652.png
  • MaxLength: Chiều dài giới hạn của chuỗi trong textbox
  • Multiline = True: cho phép xuống dòng, kết hợp với ScrollBars = 2 cho phép cuộn bên trong textbox
  • ScrollBars: có 4 giá trị:
    • 0: Không có scrollbar
    • 1: có thanh cuộn ngang
    • 2: có thanh cuộn đứng
    • 3: có 2 thanh cuộn
1686018370059.png 1686018380825.png

  • PasswordChar: Ký tự hiển thị khi điền bất cứ giá trị nào vào textbox.
1686018411402.png

  • TabStop (True/False): Cho phép dùng phím tab hoặc enter để di chuyển đến
  • TabIndex: Thứ tự di chuyển đến khi nhấn tab, bắt đầu bằng 0
  • Text: Giá trị mặc định
  • Visible (True/False): Nhìn thấy hay không
  • Enabled: Cho phép sử dụng hay không với 2 giá trị True/ False. Sử dụng linh hoạt khi muốn chỉ cho phép sử dụng với điều kiện. Nếu = False thì vẫn thấy nhưng không nhập text hoặc sửa xóa text có sẵn được
Thí dụ chỉ khi đánh dấu vào checkbox1 thì mới được nhập liệu vào textbox1

Mã:
Private Sub CheckBox1_Click()
 Me.TextBox1.Enabled = CheckBox1.Value
End Sub

Muốn sự kiện này khớp với tình trạng khi mở form, sự kiện Initialze cần gắn vào giá trị tương đồng giữa 2 controls:

Mã:
Private Sub UserForm_Initialize()
 CheckBox1.Value = True
 TextBox1.Enabled = True
End Sub

1686018850560.png

b. Các phương thức​

Copy, Paste, SetFocus, Move (left, top, width, height)

c. Các sự kiện​

1686018951447.png

  • Change: Sự kiện khi thay đổi giá trị 1 phần hoặc toàn bộ (đang gõ thêm, xóa, sửa 1 vài ký tự hoặc xóa hết, hoặc paste 1 chuỗi vào). Gắn giá trị bằng code từ control khác cũng sẽ chạy code này. Do đó sự kiện này chỉ nên dùng khi tìm kiếm hoặc lọc, thêm 1 ký tự sẽ thu hẹp phạm vi tìm kiếm hoặc khiến danh sách lọc ngắn lại. Nếu dùng để kiểm tra dữ liệu nhập vào sẽ chạy liên tục không tốt. Ngoại lệ: Dùng để định dạng số hoặc ngày tháng với điều kiện nắm rất vững việc bẫy lỗi.
  • DblClick: Khi click đôi vào textbox
  • Enter: Sự kiện vừa focus vào
  • Exit: Sự kiện thoát ra khỏi textbox. Trong sự kiện này có tham số Cancel, nếu gán Cancel = True thì phải ở lại không cho đi. Thường dùng sự kiện này để kiểm soát kiểu dữ liệu nhập vào, nếu sai thì quay trở lại nhập cho đúng.
  • BeforeUpdate: Sự kiện ngay trước khi ra khỏi textbox. Trong sự kiện này có tham số Cancel, nếu gán Cancel = True thì phải ở lại không cho đi. Cũng dùng sự kiện này để kiểm soát kiểu dữ liệu nhập vào.
  • AfterUpdate: Sự kiện sau khi ra khỏi textbox. Sự kiện này không có tham số Cancel nên đi luôn. Dùng sự kiện này để tác động vào những control khác.
  • KeyPress, KeyUp, KeyDown tương tự sự kiện của form
  • Thí dụ sau dùng để kiểm tra thứ tự sự kiện
  • Mã:
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    TextBox1.Text = TextBox1.Text & "{KeyDown " & KeyCode & "}"
    End Sub
    '______________'
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    TextBox1.Text = TextBox1.Text & "<KeyPress " & KeyAscii & ">"
    End Sub
    '__________________'
    Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    TextBox1.Text = TextBox1.Text & "(KeyUp " & KeyCode & ")"
    End Sub
  • Kết quả khi nhấn phím a (thường): {KeyDown 65}<KeyPress 97>a(KeyUp 65)
 
Upvote 0

3. Label:​

Nhãn hiển thị trên form, thường dùng để định danh cho control khác
Thuộc tính thường dùng là Caption là chữ hiển thị, và có thể thay đổi trong quá trình chạy code. Ngoài ra cũng có thể ẩn hiện bằng cách thay đổi thuộc tính Visible
Sự kiện có thể dùng là sự kiện click

4. Combobox​

Là 1 danh sách để chọn với 1 mũi tên xổ xuống. Đặc điểm của combobox là có thể tạo dữ liệu nguồn là 1 danh sách nhiều cột mặc dù chỉ hiển thị trên combobox 1 cột.

1686103134004.png

a. Các thuộc tính:​

1686103227366.png

b. Các phương thức​

  • Các phương thức Clear, Cut, Move giống textbox
  • Phương thức RemoveItem nhằm xóa bớt 1 dòng
  • Phương thức SetFocus nhằm di chuyển nhanh đến combobox, bỏ qua thứ tự tab index.
  • Phương thức AddItem nhằm gắn thêm dòng cho dữ liệu nguồn của combobox. Nếu không dùng thuộc tính RowSource thì dùng vòng lặp Add từng item vào datasource.
Lưu ý:
Lệnh AddItem chỉ thêm 1 item với 1 giá trị cột đầu tiên.

c. Các sự kiện​

- Các sự kiện Change, BeforeUpdate, AfterUpdate, Enter, Exit giống như của textbox.
- Sự kiện click: Sự kiện chọn 1 giá trị trong danh sách xổ xuống. Có thể chọn bằng cách:
  • Xổ xuống chọn bằng chuột
  • Nhấn F4 xổ xuống chọn bằng bàn phím (mũi tên lên xuống và enter)
  • Gõ vài ký tự, khi thấy hiện ra đúng thì enter
1686104679684.png

d. Các thí dụ​

i. Gán dữ liệu bằng rowSource​

Gán vào thuộc tính RowSource = “=DSKH”, với DSKH là 1 danh sách đã được đặt tên (name range)

1686103335778.png

Gán bằng câu lệnh trong sự kiện Form_Initialize:

Mã:
Me.ComboBox1.RowSource = "DM!" & Sheet2.Range("DSKH").Address

Hoặc

Mã:
Me.ComboBox1.RowSource = "=DSKH”

ii. Gán dữ liệu bằng AddItem​

Mã:
Me.ComboBox1.Add “Khách hàng A”
Me.ComboBox1.Add “Khách hàng B”

Hoặc dùng vòng lặp

Mã:
For i = 1 to 10
    Me.combobox1.AddItem Cells(i, 1)
Next

iii. Click chọn một giá trị​

Mã:
Private Sub ComboBox1_Click()
  Me.TextBox1 = ComboBox1.Column(1)
End Sub

1686104838209.png
 
Lần chỉnh sửa cuối:
Upvote 0

5. Listbox​

Là một list dữ liệu nhiều dòng và có thể nhiều cột.

a. Các thuộc tính​

  • Giống combobox
  • Thuộc tính ẩn ListIndex: STT của dòng dữ liệu chọn, bắt đầu bằng 0
  • Thuộc tính ẩn ListCount: Số dòng dữ liệu
  • Thuộc tính ẩn List(Index, Column): Lấy giá trị tại dòng Index và cột Column, với thứ tự bắt đầu bằng 0

b. Các phương thức​

  • Các phương thức Clear, Cut, Move giống textbox
  • Phương thức AddItem nhằm gắn thêm dòng cho dữ liệu nguồn của combobox. Nếu không dùng thuộc tính RowSource thì dùng vòng lặp Add từng item vào datasource.
  • Phương thức RemoveItem nhằm xóa bớt 1 dòng
  • Phương thức SetFocus nhằm di chuyển nhanh đến listbox, bỏ qua thứ tự tab stop

c. Các sự kiện​

Các sự kiện Change, BeforeUpdate, AfterUpdate, Enter, Exit giống như của textbox.

d. Thí dụ gán dữ liệu​

i. Gán dữ liệu bằng rowSource​

Gán vào thuộc tính RowSource = “=Data” với điều kiện Data là name đã đặt cho vùng dữ liệu 10 cột trở xuống
Gán bằng câu lệnh trong sự kiện Form_Initialize:

Mã:
Me.ComboBox1.RowSource = "DM!" & Sheet2.Range("DSKH").Address
Hoặc
Mã:
Me.ComboBox1.RowSource = "=DSKH”

ii. Gán dữ liệu bằng AddItem​

Chỉ gán được 1 cột
Mã:
Me.ComboBox1.Add “Khách hàng A”
Me.ComboBox1.Add “Khách hàng B”
Hoặc dùng vòng lặp
Mã:
For i = 1 to 10
   Me.combobox1.AddItem Cells(i, 1)
Next

Lưu ý:
Nếu vùng dữ liệu nhiều hơn 10 cột, phải gán giá trị vùng dữ liệu vào 1 biến mảng (SourceArray), sau đó mới gắn
ListBox1.List = SourceArray


iii. Gán dữ liệu có điều kiện bằng AddItem​

Gán dữ liệu bằng Rowsource là 1 danh sách cứng. Dùng name động có thể giải quyết khi dữ liệu tăng thêm, nhưng giả sử chỉ muốn gán bằng những dòng dữ liệu thỏa điều kiện thí dụ chỉ gán theo 1 khách hàng đã chọn trước, thì dùng vòng lặp và dùng phương thức AddItem để gán khi dòng dữ liệu thỏa điều kiện cho 1 cột, dùng thêm ListIndex để gắn dữ liệu những cột còn lại

1686195528661.png

Mã:
Private Sub UserForm_Initialize()
Dim SArr()
SArr = Sheet4.Range("A2:F11").Value
For i = 1 To UBound(SArr, 1)
   If SArr(i, 3) = Me.ComboBox1.Text Then
   Me.ListBox1.AddItem i
   For j = 1 To 6
      If j < 5 Then
          Me.ListBox1.List(ListBox1.ListCount - 1, j) = SArr(i, j)
      Else
          Me.ListBox1.List(ListBox1.ListCount - 1, j) = Format(SArr(i, j), "#,###")
      End If
   Next
   End If
Next
End Sub

Lưu ý:
  • Lệnh AddItem chỉ thêm 1 item với 1 giá trị cột đầu tiên.
  • Gắn giá trị cho các cột khác bằng lệnh Me.ListBox1.List(ListBox1.ListCount - 1, j) = Abc chỉ gắn được tối đa 10 cột. Phải tạo 1 biến mảng (array), gắn giá trị mới cho dòng cột Array, sau đó gỡ Listbox1.List cũ ra, gắn Array có giá trị mới vào Listbox1.List.

iv. Thí dụ sự kiện click​

Dùng sự kiện click chọn dòng để lấy dữ liệu bỏ vào các textbox khác nhau

Mã:
Private Sub ListBox1_Click()
Dim STT As Long
STT = Me.ListBox1.ListIndex
Me.txtNgay = Me.ListBox1.List(STT, 1)
Me.txtSoCT = Me.ListBox1.List(STT, 2)
Me.txtDebit = Me.ListBox1.List(STT, 5)
Me.txtCredit = Me.ListBox1.List(STT, 6)
End Sub
1686195808300.png

Muốn định dạng số có phân cách hàng ngàn phải viết như sau cho 2 ô số tiền:

Mã:
Me.txtDebit = Format(Val(Replace(Me.ListBox1.List(STT, 5), ",", "")) + 0, "#,##0")
Me.txtCredit = Format(Val(Replace(Me.ListBox1.List(STT, 6), ",", "")) + 0, "#,##0")

Bất kể dấu phân cách hệ thống là gì.
 
Upvote 0

6. Radio button (option button)​

Là 1 dạng tùy chọn 1 trong 1 số các chọn lựa. Trên form có thể có nhiều Radio button nhưng chỉ 1 được chọn. Người ta sử dụng khi cần chọn hướng cho rẽ nhánh các thủ tục: Chọn cái nào thì thực hiện thủ tục theo hướng được chỉ định

1686887360091.png

Nếu cần chọn nhiều tùy chọn trong những nhóm khác nhau, thì sử dụng control Frame, mỗi frame là 1 khung chứa và trong mỗi frame được chọn 1 radio (chỉ 1)

1686887399366.png

7. Check box​

Là dạng tùy chọn Yes/No, có 2 giá trị là True/ False. Khác với Ratio button, có thể check 1 hoặc nhiều checkbox trên form mà không cần bỏ trong Frame

1686887434810.png

8. Tab hoặc Multi page​

Là dạng cấu trúc form nhiều trang dạng tab. Với form có kích thước giới hạn thì 1 form nhiều tab sẽ làm được nhiều chức năng hơn

1686887484495.png
 
Lần chỉnh sửa cuối:
Upvote 0

9. ScrollBar (thanh trượt)​

Là control điều khiển tăng giảm một giá trị số bằng cách kéo thanh trượt

a. Các thuộc tính​

  • Min value: giá trị nhỏ nhất, là giá trị khi trượt hết qua trái hoặc xuống dưới
  • Max value: giá trị lớn nhất, là giá trị khi trượt hết qua phải hoặc lên trên
  • Small change: Mức tăng giảm khi nhấn 2 đầu mũi tên
  • Large change: Mức tăng, giảm khi click giữa thanh trượt
  • Value: giá trị hiện tại

b. Các phương thức​

  • Move
  • SetFocus

c. Các sự kiện​

  • Chủ yếu sử dụng sự kiện change
  • Các sự kiện khác tương tự textbox
Code cho sự kiện change: Hiển thị giá trị thanh trượt vào 1 textbox

Mã:
Private Sub ScrollBar1_Change()
 Me.ScrollValue = ScrollBar1
End Sub

Code khi thay đổi giá trị textbox khiến cho thanh trượt di chuyển:
Mã:
Private Sub ScrollValue_Change()
   Me.ScrollBar1 = ScrollValue
End Sub

1687317753881.png

10. Spin button​

Là control điều khiển tăng giảm một giá trị số bằng cách nhấn các nút mũi tên. Một lần nhấn chỉ thay đổi 1 số chênh lệch là small change, không kéo nhanh được như thanh trượt

a. Các thuộc tính​

  • Min value: giá trị nhỏ nhất, là giá trị chặn bên dưới
  • Max value: giá trị lớn nhất, là giá trị chặn bên trên
  • Small change: Mức tăng giảm khi nhấn 2 đầu mũi tên
  • Value: giá trị hiện tại
  • Không có Large change

b. Các phương thức​

  • Move
  • SetFocus

c. Các sự kiện​

  • Chủ yếu sử dụng sự kiện change
  • Các sự kiện khác ít dùng
1687317873101.png

11. RefEdit​

Là control cho phép người dùng click chọn trên bảng tính và lấy địa chỉ vùng chọn. Giá trị trả về là địa chỉ dạng chuỗi, không phải range.

1687317905644.png

12. ToggleButton​

Là control hình dạng là Button nhưng có 2 giá trị True/False. Khi nhấn 1 cái sẽ chìm xuống và nhấn cái nữa sẽ nổi lên. Giá trị khi chìm xuống là True, khi nổi lên là False
Control này tương tự như checkbox: Có thể nhấn chìm cùng lúc nhiều nút, nhưng nếu khéo dùng thì có thể sử dụng như Optionbutton: Chỉ chọn đồng thời được 1 cái.
Control này có thể dùng như 1 cách trang trí cho form bớt đơn điệu thay cho Option button
Khi nhấn chìm xuống, có giá trị True, khi nổi lên có giá trị False.


1687318017498.png
Code để chỉ nhấn 1 trong 2 cái, đồng thời thiết lập khi mở form có 1 cái mặc định đã nhấn:

Mã:
Private Sub Payment_Click()
Receipt.Value = Not Payment.Value
End Sub
‘---------------
Private Sub Receipt_Click()
Payment.Value = Not Receipt.Value
End Sub
‘-----------
Private Sub UserForm_Initialize()
Receipt.Value = True
End Sub

13. Command button​

Là nút lệnh. Khi nhấn sẽ thực thi thủ tục CommandButton_Click, trong đó là nội dung các câu lệnh cần thực hiện.

a. Các thuộc tính​

  • Caption: Chuỗi hiển thị trên nút
  • Visible: Nếu bằng False sẽ không nhìn thấy
  • Enabled: Nếu = False, thì vẫn nhìn thấy nhưng không nhấn đựợc
1687318137814.png

  • Accelerator: Ký tự sẽ gạch dưới và dùng làm phím tắt (Alt + ký tự tắt)
1687318169248.png

b. Sự kiện​

Sự kiện click, Mouse move, MouseUp, MouseDown. Tùy tình huống sẽ chọn sự kiện phù hợp.

c. Thí dụ​

Dùng sự kiện click để ghi dữ liệu sau khi chỉnh sửa:

Mã:
Private Sub BtnSave_Click()
Dim Rw As Long
Rw = ListBox1.List(STT, 0)
Sheet4.Range("Data").Cells(Rw, 1) = txtNgay
Sheet4.Range("Data").Cells(Rw, 2) = txtSoCT
Sheet4.Range("Data").Cells(Rw, 5) = Val(Replace(txtDebit, ",", ""))
Sheet4.Range("Data").Cells(Rw, 6) = Val(Replace(txtCredit, ",", ""))
End Sub
Ghi chú:
Giá trị của txtDebit và txtCredit là Text nên phải dùng hàm Val

1687318250763.png

Thí dụ sự kiện MouseDown và MouseUp để xem lại password
Mã:
Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 Me.Passw.PasswordChar = ""
End Sub
'----------
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
 Me.Passw.PasswordChar = "*"
End Sub

1687318392880.png 1687318414082.png
 
Upvote 0
Đến đây là tạm chấm dứt bài viết về khái niệm các control thông dụng. Những control không có sẵn trên Control toolbox là không thông dụng hoặc cao cấp, sẽ phải tìm hiểu sau.
Khi đã có các khái niệm cơ bản như trên đây rồi, các bạn hãy theo dõi tiếp chủ đề Tạo User form
 
Upvote 0
Đến đây là tạm chấm dứt bài viết về khái niệm các control thông dụng. Những control không có sẵn trên Control toolbox là không thông dụng hoặc cao cấp, sẽ phải tìm hiểu sau.
Khi đã có các khái niệm cơ bản như trên đây rồi, các bạn hãy theo dõi tiếp chủ đề Tạo User form
Chừ thì các thành viên có thể đưa thêm những điều thú vị liên quan đến chủ đề anh nhỉ?
 
Upvote 0

5. Listbox​

Là một list dữ liệu nhiều dòng và có thể nhiều cột.

d. Thí dụ gán dữ liệu​

i. Gán dữ liệu bằng rowSource​

Gán vào thuộc tính RowSource = “=Data” với điều kiện Data là name đã đặt cho vùng dữ liệu 10 cột trở xuống
Gán bằng câu lệnh trong sự kiện Form_Initialize:

Mã:
Me.ComboBox1.RowSource = "DM!" & Sheet2.Range("DSKH").Address
Hoặc
Mã:
Me.ComboBox1.RowSource = "=DSKH”

ii. Gán dữ liệu bằng AddItem​

Chỉ gán được 1 cột
Mã:
Me.ComboBox1.Add “Khách hàng A”
Me.ComboBox1.Add “Khách hàng B”
Hoặc dùng vòng lặp
Mã:
For i = 1 to 10
   Me.combobox1.AddItem Cells(i, 1)
Next

Lưu ý:
Nếu vùng dữ liệu nhiều hơn 10 cột, phải gán giá trị vùng dữ liệu vào 1 biến mảng (SourceArray), sau đó mới gắn
ListBox1.List = SourceArray


iii. Gán dữ liệu có điều kiện bằng AddItem​

Gán dữ liệu bằng Rowsource là 1 danh sách cứng. Dùng name động có thể giải quyết khi dữ liệu tăng thêm, nhưng giả sử chỉ muốn gán bằng những dòng dữ liệu thỏa điều kiện thí dụ chỉ gán theo 1 khách hàng đã chọn trước, thì dùng vòng lặp và dùng phương thức AddItem để gán khi dòng dữ liệu thỏa điều kiện cho 1 cột, dùng thêm ListIndex để gắn dữ liệu những cột còn lại

View attachment 291184

Mã:
Private Sub UserForm_Initialize()
Dim SArr()
SArr = Sheet4.Range("A2:F11").Value
For i = 1 To UBound(SArr, 1)
   If SArr(i, 3) = Me.ComboBox1.Text Then
   Me.ListBox1.AddItem i
   For j = 1 To 6
      If j < 5 Then
          Me.ListBox1.List(ListBox1.ListCount - 1, j) = SArr(i, j)
      Else
          Me.ListBox1.List(ListBox1.ListCount - 1, j) = Format(SArr(i, j), "#,###")
      End If
   Next
   End If
Next
End Sub

Lưu ý:
  • Lệnh AddItem chỉ thêm 1 item với 1 giá trị cột đầu tiên.
  • Gắn giá trị cho các cột khác bằng lệnh Me.ListBox1.List(ListBox1.ListCount - 1, j) = Abc chỉ gắn được tối đa 10 cột. Phải tạo 1 biến mảng (array), gắn giá trị mới cho dòng cột Array, sau đó gỡ Listbox1.List cũ ra, gắn Array có giá trị mới vào Listbox1.List.

iv. Thí dụ sự kiện click​

Dùng sự kiện click chọn dòng để lấy dữ liệu bỏ vào các textbox khác nhau

Mã:
Private Sub ListBox1_Click()
Dim STT As Long
STT = Me.ListBox1.ListIndex
Me.txtNgay = Me.ListBox1.List(STT, 1)
Me.txtSoCT = Me.ListBox1.List(STT, 2)
Me.txtDebit = Me.ListBox1.List(STT, 5)
Me.txtCredit = Me.ListBox1.List(STT, 6)
End Sub
View attachment 291186

Muốn định dạng số có phân cách hàng ngàn phải viết như sau cho 2 ô số tiền:

Mã:
Me.txtDebit = Format(Val(Replace(Me.ListBox1.List(STT, 5), ",", "")) + 0, "#,##0")
Me.txtCredit = Format(Val(Replace(Me.ListBox1.List(STT, 6), ",", "")) + 0, "#,##0")

Bất kể dấu phân cách hệ thống là gì.
ListBox còn 1 kiểu gán dữ liệu nữa đó là ListBox.List = Array

6. Ratio button​

Là 1 dạng tùy chọn 1 trong 1 số các chọn lựa. Trên form có thể có nhiều Ratio button nhưng chỉ 1 được chọn. Người ta sử dụng khi cần chọn hướng cho rẽ nhánh các thủ tục: Chọn cái nào thì thực hiện thủ tục theo hướng được chỉ định

Sao không gọi là OptionButton như VBA nó gọi cho thuận tiện?! Cái tên Ratio nghe lạ hoắc luôn! Mà dường như nó có tên là Radio Button thì phải chứ nhỉ?

1687850728867.png 1687851920519.png
 
Lần chỉnh sửa cuối:
Upvote 0
anh có thể hướng dẫn thêm về phần chèn hình ảnh vào trong userform không ạ?
Khi chèn 1 hình ảnh vào UserForm hay Control mà có thể chèn được hình ảnh, thì bắt buộc ảnh nguồn đó không phải là định dạng .png (hoặc một số định dạng khác mà tôi chưa biết). Mở Properties của nó ra, chọn vào mục Picture, bấm vào nút [...] để browse thư mục chứa ảnh, chọn ảnh muốn chèn và bấm Open, thế là xong.

1687851437588.png
 
Upvote 0
ListBox còn 1 kiểu gán dữ liệu nữa đó là ListBox.List = Array
Đúng vậy, dù chưa kể ra thành 1 phương thức nhưng cũng đã nhắc trong dòng chữ đỏ.

1687855110244.png

Sao không gọi là OptionButton như VBA nó gọi cho thuận tiện?! Cái tên Ratio nghe lạ hoắc luôn! Mà dường như nó có tên là Radio Button thì phải chứ nhỉ?
Đúng vậy, đã sửa ratio thành radio và thêm mở ngoặc option button.
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom