có thể tạo Userform vừa khít với các loại màn hình

Liên hệ QC

NguyenthiH

Thành viên mới đăng ký
Tham gia
11/12/16
Bài viết
950
Được thích
175
Giới tính
Nữ
Chào mọi người!
Em hay tạo Userform để nhập liệu, khi tạo em chỉnh kích thước cho vừa với màn hình 14 Inch của Laptop nhà, nhưng khi mang File đó lên làm ở máy công ty thì mở Form lên lại không vừa với màn hình của máy công ty.
Vậy có code nào chỉnh cho Userform luôn vừa với mọi loại màn hình được không ah!
Em cám ơn mọi người.
 
Mong Thầy Batman1 làm giúp cho em trên File của em, vì em lấy code của Thầy chuyển sang file của em thì khi nạp dữ lieu vào ListBox vẫn chưa can đối.
Sao bây giờ em gửi File đính kèm không được.
 
Lần chỉnh sửa cuối:
Upvote 0
vì em lấy code của Thầy chuyển sang file của em thì khi nạp dữ lieu vào ListBox vẫn chưa can đối.
Tôi đề nghì sửa vài chỗ:
1. Trong Sub ghilistbox1 bạn mới có
Mã:
With ListBox1
    .ColumnCount = 5
    .ColumnWidths = "20;240;110;120;70"
...
End With
a. Như thế trong Sub UserForm_Initialize trong code sau
Mã:
For Each c In Controls
        If TypeName(c) = "ListBox" Or TypeName(c) = "ComboBox" Then
            If c.ColumnWidths = "" Then
....
thì ListBox1.ColumnWidths = ""

b. Chả lí gì lại làm nhiều lần mỗi khi gọi Sub ghilistbox1 một việc chỉ cần làm 1 lần. Vì vậy xóa 2 dòng trong Sub ghilistbox1
Mã:
 .ColumnCount = 5
.ColumnWidths = "20;240;110;120;70"
Và hoặc là nhập trong cửa sổ thiết kế Properties hoặc trong Sub UserForm_Initialize trước dòng For Each c In Controls phải thêm code
Mã:
With ListBox1
        .ColumnCount = 5
        .ColumnWidths = "20;240;110;120;70"
End With
Bạn chịu khó suy nghĩ chút nhé. Suy nghĩ không đau đâu. Nếu trong code có kiểm tra ColumnWidths (If c.ColumnWidths = "" Then) thì ColumnWidths phải nhập trước khi kiểm tra. Phải kiểm tra ColumnWidths vì mặc định thì ListBox, ComboBox chỉ có 1 cột và ColumnWidths = ""

Nhưng trong trường hợp này thì còn một chuyện khác thú vị hơn. Giả sử Form đang max, tức code đã vào cuộc và phóng to ColumnWidths. Bây giờ bạn nhập dữ liệu và khi bạn nhấn Enter ở TextBox cuối cùng thì Sub ghilistbox1 được thực hiện. Mà nó lại chuyển ColumnWidths về mặc định thì rõ ràng là công code phóng to ColumnWidths đổ xuống sông xuống biển rồi còn gì. Các cột co lại là do chính bạn chuyển về mặc định thì sao bạn lại phàn nàn??? Bạn chưa thạo viết code nhưng bạn không thể viện lý do là không biết suy nghĩ.

2. Nhân tiện sửa Sub CalcColWidths thành
Mã:
Private Sub CalcColWidths(ByVal c As MSForms.Control, ByVal zoomX As Double)
Dim k As Long, s As String, cSize
'    If c.ColumnCount = 1 Then Exit Sub
    s = Replace(c.Tag, " pt", "")
    cSize = Split(Left(s, InStrRev(s, ";") - 1), ";")
    s = ""
    For k = LBound(cSize) To UBound(cSize)
        s = s & Int(cSize(k) * zoomX) & " pt;"
    Next k
    c.ColumnWidths = Left(s, Len(s) - 1)
End Sub
 
Upvote 0
Cám ơn Thầy Batman1!
Quá chuẩn rồi Thầy Ơi!
Chúc Thầy Ngày Vui!
 
Upvote 0
Đúng là quên. Chính vì làm chuẩn mất thời gian vì nếu không nghĩ kỹ thì dễ quên nhiều vấn đề.

Tôi thường bỏ công để viết rõ ràng nhưng nếu bạn lại không chịu đọc kỹ như lần trước thì bạn tự tìm hiểu. Lần này tôi sẽ không trả lời. Không thể "thời gian của người khác thì không tiếc".

Bạn hãy đọc kỹ những điểm sau:

0. Tôi vẫn cứ lấy tập tin của Tuân làm căn cứ. Bạn tự chuyển code sang tập tin của mình.

1. Để làm thật khít, thật chuẩn 100% là chuyện khó, mất công. Mà tôi không muốn mất thời gian về chuyện này. Và chắc chả ai rỗi hơi cả. Vậy nếu bạn rất cần thì đặt hàng để ai đó làm cho. Lúc này thì khác, vì khách hàng là thượng đế mà. Anh muốn rực rỡ, vô bổ cũng có người làm. Càng nhiều rực rỡ thì việc càng nhiều, tiền công càng cao, ai mà chả thích làm ra càng nhiều tiền, đúng không?

2. Bạn hãy test lần nữa và cho kết quả test để mọi người biết. Lúc đó có thể có người khác giúp bạn - bằng cách khác hoặc làm chuẩn hơn. Riêng tôi không muốn làm nữa.

3. Trong UserForm_Initialize thay
Mã:
For Each c In Controls
    If TypeName(c) = "ListBox" Then c.Tag = c.height
Next c
bằng
Mã:
For Each c In Controls
        If TypeName(c) = "ListBox" Or TypeName(c) = "ComboBox" Then
            If c.ColumnWidths = "" Then
                c.Tag = String(c.ColumnCount, "a")
                c.Tag = Replace(c.Tag, "a", (c.Width - 13) / c.ColumnCount & " pt;") & c.height
            Else
                c.Tag = c.ColumnWidths & ";" & c.height
            End If
        End If
    Next c

4. Trong code của UserForm1 thêm code
Mã:
Private Sub CalcColWidths(ByVal c As MSForms.Control, ByVal zoomX As Double)
Dim k As Long, s As String, cSize
    If c.ColumnCount = 1 Then Exit Sub
    s = Replace(c.Tag, " pt", "")
    cSize = Split(Left(s, InStrRev(s, ";") - 1), ";")
    For k = LBound(cSize) To UBound(cSize)
        cSize(k) = cSize(k) * zoomX
    Next k
    c.ColumnWidths = Join(cSize, " pt;") & " pt"
End Sub

5. Thay Sub ScaleFormControls bằng sub mới
Mã:
Private Sub ScaleFormControls()
Dim scaleX As Double, scaleY As Double, x As Double, y As Double, cSize, c As MSForms.Control
    scaleX = InsideWidth / OldInsideWidth
    scaleY = InsideHeight / OldInsideHeight
    x = scaleX / lastScaleX
    y = scaleY / lastScaleY
    For Each c In Controls
        c.Left = c.Left * x
        c.Top = c.Top * y
        c.Width = c.Width * x
        If TypeName(c) = "ListBox" Then
            cSize = Split(c.Tag, ";")
            c.height = cSize(UBound(cSize)) * scaleY
        Else
            c.height = c.height * y
        End If
'        goi CalcColWidths sau khi xac dinh Height cua ListBox
        If TypeName(c) = "ListBox" Or TypeName(c) = "ComboBox" Then
            CalcColWidths c, scaleX
        End If
        On Error Resume Next
        c.Font.Size = c.Font.Size * y
        On Error GoTo 0
    Next c
    lastScaleX = scaleX
    lastScaleY = scaleY
End Sub
Bạn ơi liệu VBA có phóng to một trang web được không bạn nhỉ?
Có cách nào để dùng VBA điều chỉnh kích thước cửa số của một ứng dụng khác ( Chorme chẳng hạn ) ?
 
Upvote 0
Bạn ơi liệu VBA có phóng to một trang web được không bạn nhỉ?
Có cách nào để dùng VBA điều chỉnh kích thước cửa số của một ứng dụng khác ( Chorme chẳng hạn ) ?
Bạn hỏi tôi làm gì? Vấn đề của bạn khác thì lập chủ đề mới mà hỏi, sao lại vào chủ đề khác? Lúc ấy ai thích thì trả lời.
 
Upvote 0
Web KT

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

Back
Top Bottom