Vấn đề Zoom control khi Maximized, Minimized, Normal trong form (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Xin vui lòng cho hỏi, khi Max hay Normal cửa sổ của Form, có code nào zoom các control trong form theo tỷ lệ có được không?
Tôi đã tìm mãi trên Google mà chưa thấy.
Xin cám ơn mọi sự hướng dẫn và giúp đỡ.
 
Bởi vậy mới nói là nó còn tùy thuộc vào màn hình người dùng đang chạy nữa ---> Màn hình sư phụ không bị nhưng màn hình em đang dùng thì lại có vấn đề (màn hình em đang dùng thuộc dạng màn hình rộng, độ phân giải hiện hành = 1280 x 800)
Em cũng thấy nó như vậy. Qua sử dụng em thấy điều chỉnh độ phân giải màn hình cũng có nhược điểm, do không tương thích, và có những máy độ phân giải giống như của Thầy 1280*800 khi chỉnh về 800*600 thì nó không bun ra hết màn hình mà nó co nhỏ 1 chút xíu.....
 
Upvote 0
Nói về set màn hình Wide thì có 1 Option là Maintain Aspect Ratio or not.
 
Upvote 0
Cám ơn các Thầy đã tận tâm hướng dẫn. Em thấy ví dụ Zoom trong Excel Help cũng thật thú vị. Không biết có ứng dụng gì được không.
 

File đính kèm

Upvote 0
Chứ còn viết code kiểu thay đổi kích thước các control, em cho là không mấy hiệu quả ---> Chỉ mới có nhiêu đó control mà code của sư phụ đã dài thòng lòng rồi ---> Em đang nghĩ với 1 form có chừng 5 page + vài chục control thì... Ẹc... Ẹc... vã mồ hôi
Tôi đang nghĩ đến 1 dạng rút gọn code bằng vòng lặp duyệt qua từng control, nhưng còn đang bí chỗ này: Làm cách nào để biết Form đang ở trạng thái maximize?
Nếu gán được 1 biến FormState dạng boolean đại khái là form maximized thì true, ngược lại thì False, ta có thể làm như sau:

PHP:
Sub CtrlResize2()
With Fm1
    Msize = .Width
    Mrate2 = Msize / 600
    FormState = "bí chỗ này"
For Each Ctl In .Controls
    With Ctl
        On Error Resume Next
        .Top = .Top * IIf( FormState = True, 1 / Mrate2, Mrate2)
        .Left = .Left * IIf(FormState = True, 1 / Mrate2, Mrate2)
        .Height = .Height * IIf(FormState = True, 1 / Mrate2, Mrate2)
        .Width = .Width * IIf(FormState = True, 1 / Mrate2, Mrate2)
        .Font.Size = .Font.Size * IIf(FormState = True, 1 / Mrate2, Mrate2)
    End With
Next
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Minh Thien bổ xung 1 chút sẽ hay hơn:

Trên đầu vùng viết Code bạn thêm dòng:

Public H_save, W_save

Bổ xung code UserForm_Zoom 2 dòng lệnh màu xanh:

Private Sub UserForm_Zoom(Percent As Integer)
Dim MyResult As Double

If Percent > 99 Then
ScrollBars = fmScrollBarsBoth
ScrollLeft = 0
ScrollTop = 0

MyResult = Width * Percent / 100
ScrollWidth = MyResult

MyResult = Height * Percent / 100
ScrollHeight = MyResult
Else
ScrollBars = fmScrollBarsNone
ScrollLeft = 0
ScrollTop = 0
End If
Me.Height = H_save * Percent / 100
Me.Width = W_save * Percent / 100

End Sub

Như vậy, thì cách giải quyết vấn đề của Minh Thien dần có hướng đơn giản hơn.
 
Upvote 0
Tôi đang nghĩ đến 1 dạng rút gọn code bằng vòng lặp duyệt qua từng control, nhưng còn đang bí chỗ này: Làm cách nào để biết Form đang ở trạng thái maximize?
Nếu gán được 1 biến FormState dạng boolean đại khái là form maximized thì true, ngược lại thì False, ta có thể làm như sau:

PHP:
Sub CtrlResize2()
With Fm1
    Msize = .Width
    Mrate2 = Msize / 600
    FormState = "bí chỗ này"
For Each Ctl In .Controls
    With Ctl
        On Error Resume Next
        .Top = .Top * IIf( FormState = True, 1 / Mrate2, Mrate2)
        .Left = .Left * IIf(FormState = True, 1 / Mrate2, Mrate2)
        .Height = .Height * IIf(FormState = True, 1 / Mrate2, Mrate2)
        .Width = .Width * IIf(FormState = True, 1 / Mrate2, Mrate2)
        .Font.Size = .Font.Size * IIf(FormState = True, 1 / Mrate2, Mrate2)
    End With
Next
End With
End Sub
Sư phụ ơi, nếu minhthien đã phát hiện ra code zoom như ở trên thì em nghĩ không cần vòng lập nào ---> Đã kiểm tra, khi form zoom là toàn bộ control trên form cũng tự động chỉnh kích thước tương ứng ---> Quá khỏe!
Vấn đề còn lại là dựa vào độ phân giải màn hình để tìm tỉ lệ zoom thích hợp
 
Upvote 0
Sư phụ ơi, nếu minhthien đã phát hiện ra code zoom như ở trên thì em nghĩ không cần vòng lập nào ---> Đã kiểm tra, khi form zoom là toàn bộ control trên form cũng tự động chỉnh kích thước tương ứng ---> Quá khỏe!
Vấn đề còn lại là dựa vào độ phân giải màn hình để tìm tỉ lệ zoom thích hợp

Đồng ý với ndu, nhưng vẫn tức, lý do là không hiểu cơ chế load form của excel như thế nào: thấy khi vừa mở form lên, form resize chạy 3 lần!

Một cái tức nữa: chả hiểu Minhthien sưu tầm code ở đâu mà rất kkkkhó hiểu:

PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0     ' chỗ này cho  bằng không để làm gì?'
H2 = UserForm1.Height  ' tại sao không gán bằng không phứt?'
UserForm1.Height = H1  ' cho bằng không rồi quay lại bằng giá trị cũ?'
End Sub

Còn nữa:
PHP:
Private Sub UserForm_Resize()
    If Me.Height <= H2 Then
        Application.WindowState = xlMinimized
    Else
        Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized  ' xlNormal'
    End If
End Sub

1. Íp iếc làm quái gì trong khi H2 luôn luôn "empty"? (vì có khai báo biến Public đâu). Và nếu có khai báo public, thì ở trên đã cho H2 = 0 mất rồi, xuống đâu thì If sẽ luôn luôn False, cái window nào đó lúc nào cũng Maximize! (???)

2. Tại sao gom 2 cái Normal và Maximize làm 1 để gán cùng 1 windowstate?

Túm lại là tức vỡ đầu! Stress thế này chắc Minhthien phải đền "cái gì đó" thôi.

Bi giờ lại siu tầm code zoom ở đâu nữa, chả biết ai đó cải tiến code zoom này có bị vỡ đầu như mình không! Mình thì Xin kiếu!
 
Lần chỉnh sửa cuối:
Upvote 0
Đồng ý với ndu, nhưng vẫn tức, lý do là không hiểu cơ chế load form của excel như thế nào: thấy khi vừa mở form lên, form resize chạy 3 lần!

Một cái tức nữa: chả hiểu Minhthien sưu tầm code ở đâu mà rất kkkkhó hiểu:

PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0     ' chỗ này cho  bằng không để làm gì?'
H2 = UserForm1.Height  ' tại sao không gán bằng không phứt?'
UserForm1.Height = H1  ' cho bằng không rồi quay lại bằng giá trị cũ?'
End Sub
Còn nữa:
PHP:
Private Sub UserForm_Resize()
    If Me.Height <= H2 Then
        Application.WindowState = xlMinimized
    Else
        Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized  ' xlNormal'
    End If
End Sub
1. Íp iếc làm quái gì trong khi H2 luôn luôn "empty"? (vì có khai báo biến Public đâu). Và nếu có khai báo public, thì ở trên đã cho H2 = 0 mất rồi, xuống đâu thì If sẽ luôn luôn False, cái window nào đó lúc nào cũng Maximize! (???)

2. Tại sao gom 2 cái Normal và Maximize làm 1 để gán cùng 1 windowstate?

Túm lại là tức vỡ đầu! Stress thế này chắc Minhthien phải đền "cái gì đó" thôi.

Bi giờ lại siu tầm code zoom ở đâu nữa, chả biết ai đó cải tiến code zoom này có bị vỡ đầu như mình không! Mình thì Xin kiếu!
Ủa ---> Sư phụ nói đến code nào vậy? File tại bài 23 có code thế này cơ mà:
PHP:
Private Sub UserForm_Initialize()
  SpinButton1.Min = 10
  SpinButton1.Max = 400
  SpinButton1.Value = 100
  Label1.Caption = SpinButton1.Value
  CommandButton1.Caption = "Zoom it!"
End Sub
PHP:
Private Sub UserForm_Zoom(Percent As Integer)
  Dim MyResult As Double
  If Percent > 99 Then
    ScrollBars = fmScrollBarsBoth
    ScrollLeft = 0
    ScrollTop = 0
    MyResult = Width * Percent / 100
    ScrollWidth = MyResult
    MyResult = Height * Percent / 100
    ScrollHeight = MyResult
  Else
    ScrollBars = fmScrollBarsNone
    ScrollLeft = 0
    ScrollTop = 0
  End If
End Sub
Và code này nằm trong Help của Excel thôi sư phụ à!
 
Lần chỉnh sửa cuối:
Upvote 0
Anh đang nói code trong file bài #8, là cái file anh dùng để cải tiến suốt từ đó đến giờ, và nhức đầu vì nó.
Còn file bài #23 thì đã nói là "Xin Kiếu"
 
Upvote 0
Đồng ý với ndu, nhưng vẫn tức, lý do là không hiểu cơ chế load form của excel như thế nào: thấy khi vừa mở form lên, form resize chạy 3 lần!

Một cái tức nữa: chả hiểu Minhthien sưu tầm code ở đâu mà rất kkkkhó hiểu:

PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0 ' chỗ này cho bằng không để làm gì?'
H2 = UserForm1.Height ' tại sao không gán bằng không phứt?'
UserForm1.Height = H1 ' cho bằng không rồi quay lại bằng giá trị cũ?'
End Sub

Còn nữa:
PHP:
Private Sub UserForm_Resize()
If Me.Height <= H2 Then
Application.WindowState = xlMinimized
Else
Application.Windows(ThisWorkbook.Name).WindowState = xlMaximized ' xlNormal'
End If
End Sub

1. Íp iếc làm quái gì trong khi H2 luôn luôn "empty"? (vì có khai báo biến Public đâu). Và nếu có khai báo public, thì ở trên đã cho H2 = 0 mất rồi, xuống đâu thì If sẽ luôn luôn False, cái window nào đó lúc nào cũng Maximize! (???)

2. Tại sao gom 2 cái Normal và Maximize làm 1 để gán cùng 1 windowstate?

Túm lại là tức vỡ đầu! Stress thế này chắc Minhthien phải đền "cái gì đó" thôi.

Bi giờ lại siu tầm code zoom ở đâu nữa, chả biết ai đó cải tiến code zoom này có bị vỡ đầu như mình không! Mình thì Xin kiếu!

Đúng là hơi nhức đầu, nhưng "IP IẾC" gì đó nó có tác dụng của nó Thầy ơi, bởi một cái nó làm cho Form ở XL97 và XL2000 trở lên Thầy à.
Thầy nhìn dòng code trong module dưới đây thì sẽ thấy tác dụng của nó.
PHP:
If Val(Application.Version) < 9 Then
    hWndForm = FindWindow("ThunderXFrame", sCaption)  'XL97
Else
    hWndForm = FindWindow("ThunderDFrame", sCaption)  'XL2000
End If

Theo em nghĩ là vậy, không biết Thầy và mọi người nghĩ sao.
 
Upvote 0
MinhThien coi kỹ đoạn code íp iếc, nó đặt điều kiện If Me.Height <= H2, chả có liên quan gì đến vẹc sông vẹc siếc cả. Biến H2 này lại chưa hề gán giá trị gì, cũng không khai báo, nên giá trị mặc định của nó không có (empty). Vậy Me.Height <= H2 luôn luôn False!
 
Upvote 0
Việc co dãn kích thước thì đơn giản nhưng xác định được top và left của Control thì bết quá, đang chờ anh Mỹ, Ndu xem sao
 
Upvote 0
Minh Thien bổ xung 1 chút sẽ hay hơn:

Trên đầu vùng viết Code bạn thêm dòng:

Public H_save, W_save

Bổ xung code UserForm_Zoom 2 dòng lệnh màu xanh:

Private Sub UserForm_Zoom(Percent As Integer)
Dim MyResult As Double

If Percent > 99 Then
ScrollBars = fmScrollBarsBoth
ScrollLeft = 0
ScrollTop = 0

MyResult = Width * Percent / 100
ScrollWidth = MyResult

MyResult = Height * Percent / 100
ScrollHeight = MyResult
Else
ScrollBars = fmScrollBarsNone
ScrollLeft = 0
ScrollTop = 0
End If
Me.Height = H_save * Percent / 100
Me.Width = W_save * Percent / 100

End Sub

Như vậy, thì cách giải quyết vấn đề của Minh Thien dần có hướng đơn giản hơn.
Tại sao để 2 dòng lệnh vào, cái form bé tí xíu vậy Anh?
 
Upvote 0
MinhThien coi kỹ đoạn code íp iếc, nó đặt điều kiện If Me.Height <= H2, chả có liên quan gì đến vẹc sông vẹc siếc cả. Biến H2 này lại chưa hề gán giá trị gì, cũng không khai báo, nên giá trị mặc định của nó không có (empty). Vậy Me.Height <= H2 luôn luôn False!

Í quên, em nói lộn rồi, cái form Min, Max đó đúng ra chỉ cần code này thôi:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
End Sub

Nhưng nó lại muốn khi nó resize thì cái windowstate tức là cửa sổ trong excel nó sẽ lớn hay nhỏ tương ứng khi nó zoom lớn hay zoom nhỏ thôi ạ!

Thầy thử nhé, thầy cứ để nguyên code như vậy, sau đó Thầy thử sẽ thấy:
PHP:
Private Sub UserForm_Initialize()
Call MinMax(UserForm1.Caption)
H1 = UserForm1.Height
UserForm1.Height = 0
H2 = UserForm1.Height
UserForm1.Height = H1
End Sub
Private Sub UserForm_Resize()
    If Me.Height <= H2 Then
        Application.WindowState = xlMinimized
    Else
        Application.Windows(ThisWorkbook.Name).WindowState = xlMinimized 'xlMaximized 'xlNormal
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
MinhThien chắc không đọc kỹ, hoặc đọc mà không hiểu gì cả. Đã nói là H2 chưa khai báo! chưa gán giá trị! nó empty! Thì dùng If so Form width với nó làm quái gì. Lúc nào cũng False!

Còn cái này:
PHP:
H1 = UserForm1.Height
UserForm1.Height = 0
H2 = UserForm1.Height
UserForm1.Height = H1

Chạy vòng vòng sau đó H2 bằng bao nhiêu? UserForm1. Height bằng bao nhiêu? Xoá phứt nó đi Minmax vẫn chạy tốt!
 
Lần chỉnh sửa cuối:
Upvote 0
MinhThien chắc không đọc kỹ, hoặc đọc mà không hiểu gì cả. Đã nói là H2 chưa khai báo! chưa gán giá trị! nó empty! Thì dùng If so Form width với nó làm quái gì. Lúc nào cũng False!

Còn cái này:
PHP:
H1 = UserForm1.Height
UserForm1.Height = 0
H2 = UserForm1.Height
UserForm1.Height = H1

Chạy vòng vòng sau đó H2 bằng bao nhiêu? UserForm1. Height bằng bao nhiêu? Xoá phứt nó đi Minmax vẫn chạy tốt!

Uh ha, em xóa nó luôn cũng chạy không cần H hiếc gì hết! Nhưng tại sao tác giả của code này lại sử dụng chúng nhỉ? Lúc đầu em nghĩ cái Form ở trạng thái ban đầu ví dụ Normal được gán cho H1, khi Max thì trạng thái đó cũng cho là H1 luôn nên tác giả mới viết như vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Uh ha, em xóa nó luôn cũng chạy không cần H hiếc gì hết! Nhưng tại sao tác giả của code này lại sử dụng chúng nhỉ? Lúc đầu em nghĩ cái Form ở trạng thái ban đầu ví dụ Normal được gán cho H1, khi Max thì trạng thái đó cũng cho là H1 luôn nên tác giả mới viết như vậy.
Bạn nên khai báo biến cho H1 và H2 là được, không phải vô lý mà người viết code lại viết như vậy đâu.
Public H1
Public H2

Sau đây là một ví dụ về Zoom, bạn tham khảo. Có lẽ phải cải tiến thêm code cho độ phân giải theo bác NDU nói trong ví dụ sau mới đúng, tuy nhiên hướng giải quyết đã có chỉ cần làm sao cho mình chủ động cái Form của mình mở lên thì độ phân giải máy tính tự điều chỉnh khi Form_Active. Thoát ra thì trở lại bình thường. Vấn đề này chắc các Sư phụ thêm vào.
 

File đính kèm

Upvote 0
Bạn nên khai báo biến cho H1 và H2 là được, không phải vô lý mà người viết code lại viết như vậy đâu.
Public H1
Public H2

Sau đây là một ví dụ về Zoom, bạn tham khảo. Có lẽ phải cải tiến thêm code cho độ phân giải theo bác NDU nói trong ví dụ sau mới đúng, tuy nhiên hướng giải quyết đã có chỉ cần làm sao cho mình chủ động cái Form của mình mở lên thì độ phân giải máy tính tự điều chỉnh khi Form_Active. Thoát ra thì trở lại bình thường. Vấn đề này chắc các Sư phụ thêm vào.

Vẫn bị một lỗi Learning_Excel ơi, đôi khi Min rồi Max, các control bị zoom ngược lại, Khi Nomal thì zoom lớn, khi Max bị zoom nhỏ!
Không biết khắc phục như thế nào? Chắc do mỗi lần Form_Resize chế độ Boolean vẫn hoạt động nên bị tình trạng xáo trộn khi Min (trong khi boolean cho 2 kết quả False or True còn Min, Max, Normal lại đến 3 động tác nên gây "hiệu ứng nghịch" chăng?)
 
Upvote 0
Upvote 0
Web KT

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

Back
Top Bottom