Viết vòng For để tìm tên Form

Liên hệ QC

Miccpro

Thành viên thường trực
Tham gia
9/12/10
Bài viết
236
Được thích
10
Giả sử em có 1 file gồm N Form có tên là: frmA, frmB, frmC, ... và sheet1 để lưu các tên Form
Em muốn viết một code kiểu tìm kiếm tên Form trong file dạng
Mã:
For i = 1 to N (N có thể là số form hoặc là dòng cuối em lưu tên Form trên sheet1)
    If Form.Name = sheet1(i, 1) then
    'Thực hiện lệnh gì đó'
    End if
Next i
Em loay hoay mãi chưa làm được, mong các anh chị giúp đỡ
 
Bạn dùng VBComponents để duyệt qua các đối tượng: form, module...
MSForm = 3

Mã:
    Dim c As Object
    For Each c In ThisWorkbook.VBProject.VBComponents
        If c.Type = 3 Then
            Debug.Print c.Name
        End If
    Next


Screen Shot 2019-11-15 at 10.54.35 AM.png
 
Upvote 0
Bạn dùng VBComponents để duyệt qua các đối tượng: form, module...
MSForm = 3

Mã:
    Dim c As Object
    For Each c In ThisWorkbook.VBProject.VBComponents
        If c.Type = 3 Then
            Debug.Print c.Name
        End If
    Next


View attachment 228380
Cảm ơn bác đã giúp đỡ, cho em hỏi thêm xíu nữa là làm sao biết được Form nào đang hoạt động không ạ?
 
Upvote 0
Cảm ơn bác đã giúp đỡ, cho em hỏi thêm xíu nữa là làm sao biết được Form nào đang hoạt động không ạ?

Có nhiều cách. Dùng vòng lặp duyệt qua các VBA.Userforms. Nhưng thực tế bài toán cuối cùng bạn muốn là làm cái gì để xử lý một lần cho nhanh.
 
Upvote 0
Có nhiều cách. Dùng vòng lặp duyệt qua các VBA.Userforms. Nhưng thực tế bài toán cuối cùng bạn muốn là làm cái gì để xử lý một lần cho nhanh.
Em đang làm một cái ClassModule các sự kiện MouseMove cho Commandbutton để thay đổi màu. Có 1 sheet em lưu các màu cho từng Form tương ứng, sau đó nếu form nào hoạt động và trùng tên với cột A thì kích hoạt màu đó ạ
 
Upvote 0
Em đang làm một cái ClassModule các sự kiện MouseMove cho Commandbutton để thay đổi màu. Có 1 sheet em lưu các màu cho từng Form tương ứng, sau đó nếu form nào hoạt động và trùng tên với cột A thì kích hoạt màu đó ạ

Nếu vậy thì cần gì vòng lặp nhỉ.
Khi cái Userform nào khởi chạy (UserForm_Initialize) thì bạn đã có thể lấy tên form đó rồi: Me.Name

Trong Class, bạn có thể dùng hàm này để lấy tên UserForm từ cái nút đang bấm (ActiveControl).
Dùng Do..Loop để lấy cái nơi chứa cuối cùng của control vì cái control có thể nằm trong một cái Frame,...
Vd: Parent thứ 1 của commandbutton là Frame1, Parent của Frame 1 là Userform => Lặp dể lấy cái Parent cuối cùng này (Userform)
Cách khác thì tôi chưa biết :) .

Mã:
Function GetParentUF(ctrl As MSForms.Control) As Object
    Set GetParentUF = ctrl
    On Error Resume Next
    Do
        Set GetParentUF = GetParentUF.Parent
    Loop Until Err
    On Error GoTo 0
End Function

Kiểm tra thử:

Mã:
Sub test
    Dim frm As Ọbject
    Set frm = GetParentUF(CommandButton1)
    Debug.print frm.Name
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bác @ongke0711 hướng dẫn hơi thiếu sót.

Cần khai báo thư viện mới có thể viết được hằng số kia ra VBE

Thư viện VBIDE
C:\xxxxxxxxxxxxxx\Microsoft Shared\VBA\VBAx\VBExEXT.OLB
Microsoft Visual Basic for Applications Extensibility x.x

Đối với một người học Code bước căn bản để học nhanh nhất các thư viện là khai báo Thư viện.
Sau khi thuần thục thì ta có thể bỏ qua bước này.

Tuy nhiên khai báo là một chuyện , ta cần check xem thư viện đó có tồn tại trên máy hiện tại không.

Để thêm một thư viện ta có thể làm như sau:
ThisWorkbook.VBProject.References.AddFromFile "C:\xxxxxxxxxxxxxx\Microsoft Shared\VBA\VBAx\VBExEXT.OLB"

Cách thêm ở trên sẽ gặp lỗi nếu đường dẫn các máy khác nhau có thể khác nhau.

Vì vậy ta nên khai báo theo cách thêm Guid là cách tốt nhất vì Guid của một Thư viện không bao giờ sai khác:
ThisWorkbook.VBProject.References.AddFromGuid "{0002E157-0000-0000-C000-000000000046}", Major:=5, Minor:=3

Khai báo biến sẽ không gặp lỗi nếu đã khai báo thư viện:
Dim VBComps as VBIDE.VBComponents, VBComp as VBIDE.VBComponent

Và nếu VBA bị khóa thì không sao lấy được các object và thuộc tính VBComponent.
Vì vậy ta cần:

If ThisWorkbook.VBProject.Protection = 1 Then Exit Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom