Tạo và xóa UserForm

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,952
Không biết chủ đề này đã có chưa, nhưng hôm nay xin gữi các bạn 1 code đơn giản nhất dùng đề tạo và xóa form
Chèn 1 Module và cho code này vào:
PHP:
Public uf As Object
Sub CreateForm()
  Set uf = ThisWorkbook.VBProject.VBComponents.Add(3)
  With ThisWorkbook.VBProject.VBComponents(uf.Name).CodeModule
    .InsertLines 2, _
                     "Private Sub UserForm_Terminate()" & vbLf & _
                     "With ThisWorkbook.VBProject" & vbLf & _
                     ".VBComponents.Remove .VBComponents(uf.Name)" & vbLf & _
                     "End With" & vbLf & _
                     "Set uf = Nothing" & vbLf & _
                     "End Sub"
  End With
  VBA.UserForms.Add(uf.Name).Show
End Sub
Sau khi chạy code, 1 Form sẽ được tạo và Show... Khi thoát Form thì nó cũng tự hủy
Từ code đơn giản này ta có thể phát triển tùy thích, chẳng hạn tạo 1 Form tạm nào đó chỉ hiển thị khi chạy code, sau đó khi thoát form là tự xóa luôn ---> Như thế khi người ta nhìn vào code sẽ không khỏi ngạc nhiên vì trong cửa sổ lập trình chẳng nhìn thấy cái Form nào mà khi chạy code nó lại "lòi" ra
-------------------------------
(Tôi thắc mắc tại sao diễn đàn mình không có 1 box chuyên về Form And Control nhỉ?)
 

File đính kèm

Em cũng nghĩ về cái Update, vá lỗi phần mềm, có lẽ họ dùng phương pháp dạng này?
 
Upvote 0
Không biết chủ đề này đã có chưa, nhưng hôm nay xin gữi các bạn 1 code đơn giản nhất dùng đề tạo và xóa form
Chèn 1 Module và cho code này vào:
PHP:
Public uf As Object
Sub CreateForm()
Set uf = ThisWorkbook.VBProject.VBComponents.Add(3)
With ThisWorkbook.VBProject.VBComponents(uf.Name).CodeModule
.InsertLines 2, _
"Private Sub UserForm_Terminate()" & vbLf & _
"With ThisWorkbook.VBProject" & vbLf & _
".VBComponents.Remove .VBComponents(uf.Name)" & vbLf & _
"End With" & vbLf & _
"Set uf = Nothing" & vbLf & _
"End Sub"
End With
VBA.UserForms.Add(uf.Name).Show
End Sub
Sau khi chạy code, 1 Form sẽ được tạo và Show... Khi thoát Form thì nó cũng tự hủy
Từ code đơn giản này ta có thể phát triển tùy thích, chẳng hạn tạo 1 Form tạm nào đó chỉ hiển thị khi chạy code, sau đó khi thoát form là tự xóa luôn ---> Như thế khi người ta nhìn vào code sẽ không khỏi ngạc nhiên vì trong cửa sổ lập trình chẳng nhìn thấy cái Form nào mà khi chạy code nó lại "lòi" ra
-------------------------------
(Tôi thắc mắc tại sao diễn đàn mình không có 1 box chuyên về Form And Control nhỉ?)

Sao mình chạy thử thì bị lỗi tại dòng:
Set uf = ThisWorkbook.VBProject.VBComponents.Add(3)
 
Upvote 0
Sao mình chạy thử thì bị lỗi tại dòng:
Set uf = ThisWorkbook.VBProject.VBComponents.Add(3)
Quên chưa nhắc: Đối với các loại code có can thiệp và thay đổi các Object trong VBE thì ta phải check "Trust Access to Visual Basic"
Cụ thế:
- Vào menu Tools\Macro\Security
- Chuyển sang Tab Trusted Publishers
- Check vào mục "Trust access to Visual Basic Project"
Xem hình:


untitled.JPG


Làm xong anh chạy lại code thử xem!
 
Upvote 0
Thế thì hơi kẹt khi dùng máy khác, vì mặt định là không "check mục này"
 
Upvote 0
Thế thì hơi kẹt khi dùng máy khác, vì mặt định là không "check mục này"
Thì có sao đâu anh! Trước khi chạy anh mở Excel lên rồi SET, mất bao nhiêu thời gian đâu ---> Cũng giống như khi muốn chạy code trên 1 máy tính khác, anh vẫn phải tốn công Set lại Security cho Excel ở mức Medium hoặc Low đấy thôi (mặc định nó vẫn set ở mức High)
-------------------------------------
Chắc các bạn còn nhớ bài viết này: Dùng Class Module để tạo sự kiện người dùng
Hôm nay xin viết lại code của bài viết trên theo kiểu tự tạo và xóa form nhé:
Code trong Module
PHP:
Public NewForm As Object, NewClass As Object
Sub ShowForm()
  Set NewForm = ThisWorkbook.VBProject.VBComponents.Add(3)
  Set NewClass = ThisWorkbook.VBProject.VBComponents.Add(2)
  CreateForm
  AddCodes
  VBA.UserForms.Add (NewForm.Name)
  UserForms(1).Hide: UserForms(1).Show
End Sub
PHP:
Private Sub CreateForm()
  Dim NewCmd As MSForms.CommandButton
  Dim iR As Long, iC As Long, tPos As Long, lPos As Long
  With NewForm
    .Properties("Width") = 162
    .Properties("Height") = 162
    .Properties("Caption") = "COLOR PICKER"
    tPos = 6
    For iR = 1 To 7
      lPos = 6
      For iC = 1 To 8
        With .Designer.Controls.Add("forms.CommandButton.1")
          .Width = 18: .Height = 18
          .Left = lPos: .Top = tPos
        End With
        lPos = lPos + 18
      Next iC
      tPos = tPos + 18
    Next iR
  End With
End Sub
PHP:
Private Sub AddCodes()
    NewClass.CodeModule.InsertLines 2, _
      "Public WithEvents CB As CommandButton" & vbLf & _
       "Private Sub CB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)" & vbLf & _
         NewForm.Name & ". backcolor = CB.backcolor" & vbLf & _
       "End Sub"
    NewForm.CodeModule.InsertLines 2, _
       "Private Btts(1 To 56) As New " & NewClass.Name & vbLf & _
       "Private Sub UserForm_Initialize()" & vbLf & _
         "Dim Cmd As Control, iColor, i As Long" & vbLf & _
         "iColor = Array(1, 53, 52, 51, 49, 11, 55, 56, 9, 46, 12, 10, 14, 5, _" & vbLf & _
                         "47, 16, 3, 45, 43, 50, 42, 41, 13, 48, 7, 44, 6, 4, _" & vbLf & _
                         "8, 33, 54, 15, 38, 40, 36, 35, 34, 37, 39, 2, 17, 18, _" & vbLf & _
                         "19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32)" & vbLf & _
         "For Each Cmd In " & NewForm.Name & ".Controls" & vbLf & _
           "Cmd.BackColor = ThisWorkbook.Colors(iColor(i))" & vbLf & _
           "i = i + 1" & vbLf & _
           "Set Btts(i).CB = Cmd" & vbLf & _
         "Next" & vbLf & _
       "End Sub" & vbLf & _
       "Private Sub UserForm_Terminate()" & vbLf & _
         "With ThisWorkbook.VBProject" & vbLf & _
           ".VBComponents.Remove .VBComponents(NewForm.Name)" & vbLf & _
           ".VBComponents.Remove .VBComponents(NewClass.Name)" & vbLf & _
         "End With" & vbLf & _
       "End Sub"
End Sub
Mở file và chạy thử, chẳng có UserFirm nào mà khi chạy thì sẽ nhìn thấy thế này

untitled.JPG


Ẹc... Ẹc... Lý thú chứ
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tạo code, thì chắc xóa code được chứ anh
em đang muốn viết đoạn xóa code
chứ nhiều code người dùng muốn xóa - thì xóa sao?
 
Upvote 0
Tạo code, thì chắc xóa code được chứ anh
em đang muốn viết đoạn xóa code
chứ nhiều code người dùng muốn xóa - thì xóa sao?
Đương nhiên là được rồi ----> Trong file của tôi có code xóa Form và Class, vậy để xóa Module thì cũng tương tự
Ví dụ bạn có 1 Module tện là "Module1" và bạn muốn xóa Module này bằng code VBA, ta dùng code này:
PHP:
Sub DelModule()
  With ThisWorkbook.VBProject
    .VBComponents.Remove .VBComponents("Module1")
  End With
End Sub
Điều thú vị ở đây là cho dù code này nằm trong Module1 thì nó vẫn có khả năng tự xóa chính nó
-----------------------------
Nhân đây xin "đố" các bạn 1 vấn đề:
- Các bạn mở file ở bài #6 và chạy code, các bạn sẽ thấy khi di chuột qua các Button thì màu sắc có vẽ... giật giật
- Vậy các bạn thử nghĩ xem làm cách nào để giải quyết tình trạng này
(File tương tự tại bài Dùng Class Module để tạo sự kiện người dùng chẳng bị giật tí nào)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom