Tạo Form bằng DialogSheet

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Mổi khi có nhu cầu tạo Form để làm công việc gì đó, chúng ta thường dùng UserForm mà quên rằng Excel có 1 công cụ khá đơn giản, đó là DialogSheet
Bài viết này không có tham vọng hướng dẩn tất cả về DialogSheet, chỉ dùng File ví dụ để minh họa đôi nét DialogSheet và các thuộc tính của nó
Tôi lấy đề tài điều khiển các dấu phân cách trong Tools\Options\International, mời các bạn tham khảo:
1> Tạo Form:
Mở 1 file Excel trắng, click phải vào tên sheet và chọn Insert\MS Excel 5.0 Dialog

attachment.php



2> Vẽ thêm các Control vào form
Ở đây tôi vẽ thêm 2 Label và 1 Shape (Rectangle) như hình:

attachment.php


3> Tiến hành viết code
Các bạn cứ viết sub bình thường, sau đó muốn Control nào gọi sub nào thì chi việc click phải vào Control và chon Assign Macro... nhé:
Đây là các sub có trong file
a) Sub để Show Form
PHP:
Sub ShowForm()
  DialogSheets("Dialog1").Show
End Sub
b) Sub để chạy code khi Form load
PHP:
Private Sub Form_Initialize()
  Dim DecSym As String, DigSym As String
  If Application.UseSystemSeparators Then
    DecSym = Application.International(xlDecimalSeparator)
    DigSym = Application.International(xlThousandsSeparator)
  Else
    DecSym = Application.DecimalSeparator
    DigSym = Application.ThousandsSeparator
  End If
  With DialogSheets("Dialog1")
    .Labels("LB1").Caption = UniConvert("Da61u pha6n ca1ch nga2n tre6n ma1y ba5n la2 da61u " & IIf(DigSym = ",", "pha63y", "cha61m"))
    .Labels("LB2").Caption = UniConvert("Da61u tha65p pha6n tre6n ma1y ba5n la2 da61u " & IIf(DecSym = ",", "pha63y", "cha61m"))
    .Shapes("RT1").TextFrame.Characters.Text = 1 & DigSym & 234 & DigSym & 567 & DecSym & 89
    .Focus = "BT1"
  End With
End Sub
Vấn đề là làm thế nào để DialogSheet hiểu rằng code trên sẽ chạy khi Form load?
Các bạn chỉ cần click phải vào tiêu đề của Dialogsheet, chọn Assign Macro... và gõ vào khung Macro Name dòng chữ Form_Initialize (tên sub mà bạn muốn chạy), bấm OK là xong!
attachment.php


Ở đây tôi dùng thêm hàm UniConvert để hổ trợ chuyển kiểu gõ VNI thành tiếng Việt có dấu:
PHP:
Private Function UniConvert(Text As String) As String
  Dim VNMethod, CharCode, i As Long
  UniConvert = Text
  VNMethod = Array("a81", "a82", "a83", "a84", "a85", "a61", "a62", "a63", "a64", "a65", "e61", _
      "e62", "e63", "e64", "e65", "o61", "o62", "o63", "o64", "o65", "o71", "o72", "o73", "o74", _
      "o75", "u71", "u72", "u73", "u74", "u75", "a1", "a2", "a3", "a4", "a5", "a8", "a6", "d9", _
      "e1", "e2", "e3", "e4", "e5", "e6", "i1", "i2", "i3", "i4", "i5", "o1", "o2", "o3", "o4", _
      "o5", "o6", "o7", "u1", "u2", "u3", "u4", "u5", "u7", "y1", "y2", "y3", "y4", "y5")
  CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
      ChrW(7849), ChrW(7851), ChrW(7853), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
      ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), ChrW(7899), ChrW(7901), ChrW(7903), _
      ChrW(7905), ChrW(7907), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), ChrW(7921), ChrW(225), _
      ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), ChrW(259), ChrW(226), ChrW(273), ChrW(233), ChrW(232), _
      ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), ChrW(7881), ChrW(297), ChrW(7883), _
      ChrW(243), ChrW(242), ChrW(7887), ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(250), ChrW(249), _
      ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
  For i = 0 To UBound(VNMethod)
    UniConvert = Replace(UniConvert, VNMethod(i), CharCode(i))
    UniConvert = Replace(UniConvert, UCase(VNMethod(i)), UCase(CharCode(i)))
  Next i
End Function

4> Chạycode
Bấm Alt + F8, chọn ShowForm, các bạn sẽ thấy giao diện form thế này:

attachment.php


Nó sẽ thể hiện đúng kiểu dấu phân cách đang được thiết lập trên máy tính của bạn
5> Nâng cấp:
Code trên chỉ cho ta biết được các thiết lập về dấu phân cách. Giờ ta nâng cấp thêm bằng cách vẽ thêm 1 số control vào DialogSheet để có thể điều khiển luôn các thiết lập này... Đại khái giao diện form như sau:

attachment.php



(xem file DialogSheetForm_02.xls)

Lưu ý về các thuộc tính:
- Để gán 1 chuổi vào EditBox, ta viết:
PHP:
DialogSheets("Tên sheet").EditBoxes("Tên EditBox").Text = "Gì gì đó"
- Để gán 1 chuổi vào Label, ta viết:
PHP:
DialogSheets("Tên sheet").Labels("Tên Label").Caption = "Gì gì đó"
- Gán giá trị cho Checkbox
PHP:
DialogSheets("Tên sheet").CheckBoxes("Tên CheckBox").Value= True 'hoặc False
- Điều khiển thuộc tính Enable cho object
PHP:
DialogSheets("Tên sheet").EditBoxes("Tên EditBox").Enabled = True 'hoặc False
- Set Focus cho control
PHP:
DialogSheets("Tên sheet").Focus = "Tên Control"

Sơ lược vài nét về DialogSheet, mời xem file đính kèm và tự khám phá thêm. Nếu khéo léo, các bạn có thể thiết kế 1 DialogSheet hoành tráng không kém UserForm đâu
(Các bạn vào menu Format\Sheet\Unhide để cho hiện DialogSheet nhé)
 

File đính kèm

  • untitled1.JPG
    untitled1.JPG
    36.6 KB · Đọc: 833
  • untitled2.JPG
    untitled2.JPG
    32.6 KB · Đọc: 800
  • untitled3.JPG
    untitled3.JPG
    46.4 KB · Đọc: 788
  • untitled4.JPG
    untitled4.JPG
    13.4 KB · Đọc: 784
  • untitled5.JPG
    untitled5.JPG
    26 KB · Đọc: 776
  • DialogSheetForm_01.xls
    45 KB · Đọc: 405
  • DialogSheetForm_02.xls
    56 KB · Đọc: 321
Theo cách chỉ dẫn như trên, tôi có thể thiết kế và gọi Dialog tùy thích. Nhưng có một vấn đề khác là, nếu như disable macro thi nút lệnh vẫn gọi được Dialog. Có ai bít xin chỉ giáo dùm!
 
Theo cách chỉ dẫn như trên, tôi có thể thiết kế và gọi Dialog tùy thích. Nhưng có một vấn đề khác là, nếu như disable macro thi nút lệnh vẫn gọi được Dialog. Có ai bít xin chỉ giáo dùm!
Disalbe maco rồi thì còn gọi được cái gì nữa chứ ---> Mọi code đều bị "khóa" bạn à!
 
Kính gửi: các Anh, Chị!
Lâu lâu tôi mới có việc cần sử dụng đến DialogSheet và gặp đang vướng mắc với EditBox.
Mong Anh, Chị hướng dẫn cách thiết lập đặt con trỏ chuột vào EditBox này ngay khi Dialog hiển thị. Đồng thời có cách nào thiết lập TabIndex đối với từng Control trong DialogSheet giống như các control trong UserForm không?
 
Sao bạn không d
Kính gửi: các Anh, Chị!
Lâu lâu tôi mới có việc cần sử dụng đến DialogSheet và gặp đang vướng mắc với EditBox.
Mong Anh, Chị hướng dẫn cách thiết lập đặt con trỏ chuột vào EditBox này ngay khi Dialog hiển thị. Đồng thời có cách nào thiết lập TabIndex đối với từng Control trong DialogSheet giống như các control trong UserForm không?
Sao bạn không dùng thử Forms có sẳn trong Excel.

Form_1.GIF Form_2.GIF
 
Cám ơn Anh!
Chỉ là em đang cần 1 form đơn giản sử dụng Tiếng Việt (có rất nhiều cách để áp dụng Form tiếng việt trong VBA, tuy nhiên yêu cầu Form không quá phức tạp nên em chọn DialogSheet + vba) nhưng đang vướng phần "Set Cursor" cho phần nhập dữ liệu EditBox.
 
Web KT
Back
Top Bottom