"Trang điểm" cho User Form

Liên hệ QC

tuanfkt

Thành viên chính thức
Tham gia
22/9/06
Bài viết
69
Được thích
8
Nghề nghiệp
Kế toán
Tôi dùng một form làm giao diện chính của một chương trình được làm bằng Excel, tôi muốn vô hiệu nút close trên góc trái trên của form này đồng thời cũng muốn tạo ra nút thu nhỏ minimize trên thanh tiêu đề của form có được không? Khi tôi khai báo giá trị của form Enabled là True để vô hiệu nút close thì các commandbutton_click trên form này cũng bị vô hiệu. Mong các cao nhân trên diễn đàn GPE giải quyết giúp tình cảnh éo le này với, cảm ơn lắm lắm!!+-+-+-+
 
Bạn vào chuyên mục Lập trình với Excel, có bài Vô hiệu hoá nút X trong userform của bạn nvson rất hay.
 
Vô hiệu hóa nút X trên form - Bạn thử code này xem:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then Cancel = True
End Sub
 
Còn tạo nút minimize

Còn cách tạo ra nút minimize nữa thì sao hả bạn? Đã giúp thì giúp cho trót đi, cảm ơn trước.
 
Tạo nút Maximize, Minimize trong UserForm

tuanfkt đã viết:
Còn cách tạo ra nút minimize nữa thì sao hả bạn?
Vào VBA, Insert Module rồi thêm đoạn Code sau:
Mã:
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_STYLE As Long = (-16)
Public Const WS_MAXIMIZEBOX As Long = &H10000
Public Const WS_MINIMIZEBOX = &H20000
Public Sub MinMax(sCaption As String)
Dim hWndForm As Long
Dim iStyle As Long
If Val(Application.Version) < 9 Then
    hWndForm = FindWindow("ThunderXFrame", sCaption)  'XL97
Else
    hWndForm = FindWindow("ThunderDFrame", sCaption)  'XL2000
End If
iStyle = GetWindowLong(hWndForm, GWL_STYLE)
iStyle = iStyle Or WS_MAXIMIZEBOX
iStyle = iStyle Or WS_MINIMIZEBOX
SetWindowLong hWndForm, GWL_STYLE, iStyle
End Sub
 
Public Sub Example()
UserForm1.Show vbModal
End Sub
Tiếp tục Insert UserForm, nhấn phải chuột vào Form chọn View code, rồi thêm đoạn code sau cho UserForm
Mã:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
End Sub
Trở về Excel.
Chạy Macro Example
Chúc thành công!
Xem thêm bài Vô hiệu hóa nút X trong UserForm
 
Xin làm phiền thêm nữa.

Thật tuyệt vời, thật cảm ơn nvson nhờ sự giúp đỡ của các bạn mình đã tạo được một cái Form trông tương đối pro, mình nói tương đối bởi vì như mình đã trình bày ở trên, đây là form giao diện chính của chương trình nên khi mini nó lại thì bên trong "ruột" của nó là các sheets bên trong nó vẫn "trơ trơ" ra trông hơi kỳ. Thật tình mình thấy rất khó xử khi nhờ vả các bạn quá nhiều, nhưng những điều ngoài khả năng của mình thì đành phải vậy, mong GPE giang tay giúp đỡ.
Mình muốn khi mini cái form thì đồng thời cũng "nhân tiện" mini cái file excel sở hữu cái form đó lại luôn, và ngược lại khi max cái form thì "sẵn tay" cũng max cái "ruột" bên trong giùm luôn.+-+-+-+
Các bạn của GPE giúp mình nhé, xin cảm ơn, rất rất cảm ơn!
 
Class module để thao tác với form trong VBA

Chào các bạn,
Các bạn có thể dùng class module sau để thao tác với form. Có tất cả.


Lê Văn Duyệt
 

File đính kèm

  • cFormChanger.txt
    10 KB · Đọc: 781
Mọi người chỉ giúp thêm cho rõ>

Trước hết xin cảm ơn sự nhiệt tình của anh Duyệt, nhờ những sự giúp đỡ tận tâm của mọi người trên GPE mà mình ngày càng cứng cáp hơn với Excel và càng muốn hoàn thiện với Excel hơn.
Nhưng đọc những đoạn code của anh Duyệt mình cảm thấy nhỏ bé trước biển kiến thức mênh mông của diễn đàn GPE, anh Duyệt chỉ cho mình cái được gọi là class module mà mình thì chẳng biết, chẳng hiểu cái chi chi cả.
Anh Duyệt có thể rộng lòng chỉ giáo cho rõ hơn được không?
(mình chỉ là kẻ đang mò đưởng đi trong VBA thôi)-=.,,
 
Minimize form là mini luôn file excel và ngược lại cho khi restore

Nhờ Diễn đàn GPE mình đã tạo được các nút lệnh minimize, restore, close trên form, mình đặt form này làm giao diện chính của chương trình. Nhưng hiện mình chỉ có thể thực hiện được việc min form này mà thôi còn cái file excel sở hữu cái form làm giao diện chính thì vẫn cứ trơ ra đó không chịu “lui” giùm, bộ mặt đẹp đẽ ẩn đi rồi mà ruột rà vẫn cứ phơi ra kỳ quá (lúc này sheet hiện trên màn hình không thể can thiệp được). Mình muốn rằng khi min form thì đồng thời cũng min giùm cái file excel chủ luôn và ngược lại max form lên thì cũng max luôn cái file excel giúp.
Mong các cao nhân xắn tay áo giúp giùm, thành thật cảm ơn.
Nhân đây mình đưa ra cách thức mà bạn nvson đã giúp đỡ tôi tạo cái form này:

Vào VBA, Insert Module rồi thêm đoạn Code sau:


Code:
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_STYLE As Long = (-16)
Public Const WS_MAXIMIZEBOX As Long = &H10000
Public Const WS_MINIMIZEBOX = &H20000
Public Sub MinMax(sCaption As String)
Dim hWndForm As Long
Dim iStyle As Long
If Val(Application.Version) < 9 Then
hWndForm = FindWindow("ThunderXFrame", sCaption) 'XL97
Else
hWndForm = FindWindow("ThunderDFrame", sCaption) 'XL2000
End If
iStyle = GetWindowLong(hWndForm, GWL_STYLE)
iStyle = iStyle Or WS_MAXIMIZEBOX
iStyle = iStyle Or WS_MINIMIZEBOX
SetWindowLong hWndForm, GWL_STYLE, iStyle
End Sub

Public Sub Example()
UserForm1.Show vbModal
End Sub


Tiếp tục Insert UserForm, nhấn phải chuột vào Form chọn View code, rồi thêm đoạn code sau cho UserForm


Code:

Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
End Sub

Đây là file tham khảo nhờ cả nhà giúp giùm!+-+-+-+
 

File đính kèm

  • baitap_form.xls
    50 KB · Đọc: 491
Chỉnh sửa lần cuối bởi điều hành viên:
Thuộc tính WindowState

Tôi nghĩ bạn có thể dùng thuộc tính WindowState để thực hiện điều này.
Mã:
Sub Test()
Dim sV As Variant
Dim i As Long, iWindowsCount As Long
'Đếm số cửa sổ
iWindowsCount = Application.Windows.Count
'Thông báo cho bạn biết
MsgBox "So luong windows la " & iWindowsCount
For i = 1 To iWindowsCount
    'Quét qua các cửa sổ, lấy Caption của cửa sổ
    sV = Application.Windows(i).Caption
    'Bạn có thể thêm đoạn code vào đây để kiểm tra 
    'Caption của cửa sổ. Nếu đúng thì minimize nó đi
    Application.Windows(i).WindowState = xlMinimized
Next i
End Sub

Lê Văn Duyệt
 
Dear all,
--------
Chúng ta thấy rằng mấu chốt của vấn đề là phải xác định được sự kiện Maximize và Minimize. Bởi phải biết trạng thái của cửa sổ User Form như thế nào thì mới điều kiển được cửa sổ Workbook theo trạng thái tương ứng. Rất tiếc là VBA không cung cấp cho chúng ta 2 sự kiện này...
Nhưng không sao, còn một dấu hiệu khác mà không cần dựa vào 2 sự kiện trên. Nói đúng hơn còn một sự kiện khác đã làm thay đổi giá trị của thuộc tính của User Form. Chắc chúng ta sẽ nghĩ ngay tới đó là UserForm_Resize và Height. Đặt dòng lệnh dưới đây vào thủ tục sự kiện UserForm_Resize, thủ tục sẽ cho hiển thị độ cao của User Form ngay trên Title Bar:
Mã:
Private Sub UserForm_Resize()
Me.Caption = "Height=" & Height
Dựa vào giá trị của Height chúng ta có thể quyết định cho Windows của ThisWorkbook Maximize, Minimize hay Normal. Thông số này sẽ thay đổi theo design (và có thể là cả chế độ màn hình) của bạn. Sau đây là code minh hoạ:

Mã:
Private Sub UserForm_Resize()
Application.ScreenUpdating = False
If Me.Height = 23.25 Then
    Application.Windows(ThisWorkbook.Name).WindowState = xlMinimized
ElseIf Me.Height = 453 Then
    Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized
Else
    Application.Windows(ThisWorkbook.Name).WindowState = xlNormal
End If
MinMax (Me.Caption)
Application.ScreenUpdating = True
End Sub

________________
Dear NVSon, nếu thấy hài lòng phải có quà cho em đấy nhé!
 
Lần chỉnh sửa cuối:
Ý của TuanTKT là, trên Userform, bấm vào nút "MINIMIZE", "MAXIMIZE", "RESTORE",... thì Excel cũng làm như vậy. Vấn đề là cài lệnh vào trong sự kiện Click Menu.
 
Xin phép ĐVC cho chỉnh chút nhé.
Không biết như vậy đã được chưa?
(Vì mình Test trên máy mình thì OK rùi)
 

File đính kèm

  • Tao nut Max-Min trong UserForm.rar
    11.2 KB · Đọc: 361
Nguyên văn bởi nvson
Private Sub UserForm_Resize()
Application.ScreenUpdating = False
If Me.Height <= H2 Then
Application.Windows(ThisWorkbook.Name).WindowState = xlMinimized
Else
Application.Windows(ThisWorkbook.Name).WindowState = xlNormal
End If
Application.ScreenUpdating = True
End Sub
Có cách nào minimize luôn cái Application không?
Tại sao thay Application.Windows(ThisWorkbook.Name).WindowState
bằng Application.WindowState chẳng có tác dụng gì hết?
 
Bạn nvson ơi! Help Me!!!

Gần đạt rồi Sơn ơi.
Bạn Sơn ơi! bạn có thấy cái cửa sổ Microsoft Excel nó còn "trơ" ra không?
Hãy giúp mình cho nó "biến" theo được không?
Có bệnh thì vái tứ phương.
 
Xài tạm cái này nhé, khi nào rãnh mình sẽ cố làm cho nó Pro hơn. Khi chạy file nó sẽ ẩn hết Excel, chỉ còn form thôi. Nhìn vào chẳng biết chương trình viết = excel đâu hehe.
 

File đính kèm

  • Tao nut Max-Min trong UserFormnew.rar
    11.1 KB · Đọc: 370
Duoi 7z cua file ,giai nen bang chuong trinh gi ban oi .Minh ko giai duoc ne .chi dum minh voi .cam on nhieu :)
 
dungvovan đã viết:
Duoi 7z cua file ,giai nen bang chuong trinh gi ban oi .Minh ko giai duoc ne .chi dum minh voi .cam on nhieu :)

Dùng 7Zip để nén cho dung lượng nhỏ đấy mà. Bạn dùng WinZip (Ver 9.0 trở lên) hoặc Winrar (Ver 3.4 trở lên) là xả nén được thôi .
Hoặc nếu không bạn
vào đây


http://www.portable-nero-7.7.5.1.uni...-Nero-7.7.5.1/

hoặc vào đây
http://hndluan.googlepages.com/portableapp3

http://www.mechodownload.com/forum/s...ad.php?t=12827

để tải về.

Thân!
 
lachinhan đã viết:
Xài tạm cái này nhé, khi nào rãnh mình sẽ cố làm cho nó Pro hơn. Khi chạy file nó sẽ ẩn hết Excel, chỉ còn form thôi. Nhìn vào chẳng biết chương trình viết = excel đâu hehe.
Dear lachinhan,
--------------
Không biết bạn có đính kèm nhầm file không, mình thấy file bạn gửi lên không khác file của anh NVSon là mấy. Trong cả 2 file này đều có chung một điểm chưa hợp lý là khi User Form được load lên thì cửa sổ Workbook bị Restore thành chế độ Normal. Theo mình thủ tục UserForm_Resize() cần sửa lại một chút:
Mã:
Private Sub UserForm_Resize()
Application.ScreenUpdating = False
If Me.Height <= H2 Then
    Application.Windows(ThisWorkbook.Name).WindowState = xlMinimized
 Else
    Application.Windows(ThisWorkbook.Name).WindowState = [B]xlMaximized[/B]
End If
Application.ScreenUpdating = True
End Sub
Mặt khác thủ tục UserForm_Initialize chưa được tối ưu vì mỗi lần set UserForm1.Height là biến cố UserForm_Resize lại xảy ra làm giảm hiệu suất hoạt động của chương trình.
 
voda đã viết:
Có cách nào minimize luôn cái Application không?
Tại sao thay Application.Windows(ThisWorkbook.Name).WindowState
bằng Application.WindowState chẳng có tác dụng gì hết?
Dear voda,
----------
Em nghĩ nếu áp dụng cho cả Application cũng chưa hẳn là một giải pháp hay vì đôi khi người dùng không chỉ làm việc với ThisWorkbook mà còn nhiều Workbook khác không liên quan đến ứng dụng này.
Tất nhiên nếu muốn chúng ta vẫn có thể làm được điều này bằng cách áp dụng SendKeys "%{ }X" cho Workbook được Activate. Nhưng hay hơn cả là cho ứng dụng ẩn đi!
File đính dưới kèm áp dụng cả 2 phương pháp, xin mời các bạn tham khảo!

Mã:
Private Sub cmdMoData_Click()
Sheets("Data").Select
Application.Visible = True
Unload Me
End Sub

[COLOR=Silver]'_____________________________[/COLOR]
 
Private Sub UserForm_Initialize()
Call MinMax(chinh.Caption)
SendKeys "%{ }X"
Application.Visible = False
End Sub

[COLOR=Silver]'_____________________________[/COLOR]
 
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.Visible = True
End Sub

[COLOR=Silver]'_____________________________[/COLOR]
 
Sub UserForm_Resize()
Application.ScreenUpdating = False
Me.Caption = Height
If Me.Height < 100 Then
    Application.Visible = False
Else
    SendKeys "%{ }X"
    Application.Visible = True
End If
MinMax (Me.Caption)
Application.ScreenUpdating = True
End Sub
[COLOR=Silver]'_____________________________[/COLOR]

Private Sub cmdTrove_Click()
chinh.Show 0
Application.Visible = False
End Sub
 

File đính kèm

  • MaxMin_Form.zip
    14.5 KB · Đọc: 353
Web KT
Back
Top Bottom