Khi tạo một UserForm VBA, chúng tôi thường đặt nó thành một kích thước cụ thể. Hầu hết các biểu mẫu, và cửa sổ khác trong môi trường Excel và Windows không có kích thước cố định, chúng có thể được người dùng thay đổi kích thước. Hôm nay TINVANPHONG chia sẽ các,Tạo Userform resize with VBA or Windows API
Với một chút ma thuật mã hóa, chúng tôi có thể đạt được hiệu ứng thay đổi kích thước tương tự cho các UserForms VBA của chúng tôi. Bài đăng này sẽ cho bạn thấy làm thế nào.
Nội dung chính
Tạo Userform resize with VBA or Windows API

Có hai giải pháp được trình bày bên dưới, một phương pháp API Windows và một phương pháp chỉ VBA. Trong số hai, giải pháp Windows API mang lại cảm giác mượt mà hơn, tích hợp hơn cho người dùng.
Nhưng nó sẽ chỉ hoạt động trên Windows. Nếu mã của bạn dự kiến sẽ hoạt động trên Windows và Mac, thì sử dụng giải pháp VBA là lựa chọn tốt hơn.
Mã API Windows sử dụng các hàm đặc biệt, không phải là một phần của Excel hoặc VBA, nhưng là một phần của ứng dụng Windows chính. Chủ đề về mã API Windows là quá lớn để thảo luận ở đây,
Nhưng bằng cách làm theo các hướng dẫn bên dưới, bạn vẫn có thể làm cho mã hoạt động, ngay cả khi bạn không hiểu đầy đủ về lý do tại sao nó hoạt động.
Các bạn có thể tham khảo các bài viết như bên dưới.
Phần mềm xuất nhập tồn bằng Excel miễn phí 2021
Chuyển đổi số thành chữ viết bằng Code VBA
Tìm kiếm dữ liệu trong listbox từ textbox
I.CÔNG DỤNG
- Thay đổi kích thước, bất kì cho 1 userform nào co giãn mượt mà.
- Full màn hình cho Windown
II. Hướng dẫn cách tạo Userform resize with VBA or Windows API.

Bước 1 : tạo 1 Model Coppy toàn bộ Code này vào Model vừa tạo.
Option Explicit
#If VBA7 Then
#If Win64 Then
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongLong, ByVal nIndex As Long) As LongLong
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongLong, ByVal nIndex As Long, ByVal dwNewLong As LongLong) As LongLong
#Else
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#End If
Private Declare PtrSafe Function IUnknown_GetWindow Lib "shlwapi" Alias "#172" (ByVal pIUnk As IUnknown, ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
#Else
Private Declare Function IUnknown_GetWindow Lib "shlwapi" Alias "#172" (ByVal pIUnk As IUnknown, ByVal hwnd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
#End If
Private dInitWidth As Single, dInitHeight As Single, Ufrm As Object
Public Sub MakeFormResizeable(ByVal UF As Object)
Set Ufrm = UF
Call CreateMenu
Call StoreInitialControlMetrics
'OPTIONAL: maximize the form full-screen upon first showing.
'========
#If Win64 Then
Dim hwnd As LongLong
#Else
Dim hwnd As Long
#End If
Const WM_SYSCOMMAND = &H112
Const SC_MAXIMIZE = &HF030&
Call IUnknown_GetWindow(UF, VarPtr(hwnd))
Call PostMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
End Sub
Public Sub AdjustSizeOfControls(Optional ByVal Dummey As Boolean)
Dim oCtrl As Control
For Each oCtrl In Ufrm.Controls
With oCtrl
If .Tag <> "" Then
.Width = Split(.Tag, "*")(0) * ((Ufrm.InsideWidth) / dInitWidth)
.Left = Split(.Tag, "*")(1) * (Ufrm.InsideWidth) / dInitWidth
.Height = Split(.Tag, "*")(2) * (Ufrm.InsideHeight) / dInitHeight
.Top = Split(.Tag, "*")(3) * (Ufrm.InsideHeight) / dInitHeight
If HasFont(oCtrl) Then
.Font.Size = Split(.Tag, "*")(4) * (Ufrm.InsideWidth) / dInitWidth
End If
End If
End With
Next
Ufrm.Repaint
End Sub
Private Sub StoreInitialControlMetrics()
Dim oCtrl As Control
Dim dFontSize As Currency
dInitWidth = Ufrm.InsideWidth
dInitHeight = Ufrm.InsideHeight
For Each oCtrl In Ufrm.Controls
With oCtrl
On Error Resume Next
dFontSize = IIf(HasFont(oCtrl), .Font.Size, 0)
On Error GoTo 0
.Tag = .Width & "*" & .Left & "*" & .Height & "*" & .Top & "*" & dFontSize
End With
Next
End Sub
Private Sub CreateMenu()
#If Win64 Then
Dim hwnd As LongLong
Dim lStyle As LongLong
#Else
Dim hwnd As Long
Dim lStyle As Long
#End If
Const GWL_STYLE = -16
Const WS_SYSMENU = &H80000
Const WS_MINIMIZEBOX = &H20000
Const WS_MAXIMIZEBOX = &H10000
Const WS_THICKFRAME = &H40000
Call IUnknown_GetWindow(Ufrm, VarPtr(hwnd))
lStyle = GetWindowLong(hwnd, GWL_STYLE)
lStyle = lStyle Or WS_SYSMENU Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX Or WS_THICKFRAME
Call SetWindowLong(hwnd, GWL_STYLE, lStyle)
Call DrawMenuBar(hwnd)
End Sub
Private Function HasFont(ByVal oCtrl As Control) As Boolean
Dim oFont As Object
On Error Resume Next
Set oFont = CallByName(oCtrl, "Font", VbGet)
HasFont = Not oFont Is Nothing
End Function
Bước 2: Tạo 1 USERFORM, copy Code sau vào USERFROM vừa tạo.

Option Explicit
Private Sub UserForm_Initialize()
Call MakeFormResizeable(Me)
End Sub
Private Sub UserForm_Resize()
Call AdjustSizeOfControls
End Sub
III.TẢI XUỐNG
Như vậy, chúng tôi đã hướng dẫn đến các bạn cách Tạo Userform resize with VBA or Windows API. Hy vọng, nó sẽ giúp các bạn phần nào trong quá trình học tập, cũng như nâng cao hiệu quả làm việc.
Chúc bạn thành công.

Tạo Thanh Tiến Độ Excel Chuyên Nghiệp: Hướng Dẫn Tối Ưu Với Conditional Formatting
Hướng Dẫn Chi Tiết: Cách Xuất Dữ Liệu Từ Excel Sang CSV hoặc JSON Cho Người Mới Học Lập Trình
Biểu đồ Bong bóng Excel: Giải pháp tối ưu để trực quan hóa dữ liệu 3 chiều ấn tượng
Tổng hợp các cheat sheet Excel hữu ích cho người mới bắt đầu: Chìa khóa chinh phục Excel 2024
Hướng dẫn chi tiết cách viết hàm tùy chỉnh (UDF) đơn giản bằng VBA trong Excel
Flash Fill trong Excel: Bí Kíp Tự Động Điền Dữ Liệu Thông Minh Bạn Cần Biết
Hướng dẫn chi tiết Sử dụng Data Tables trong Excel để Phân tích Kịch bản ‘What-If’ Đơn giản và Hiệu quả
Bí Quyết Sử Dụng RANDBETWEEN và CHOOSE trong Excel Để Tạo Dữ Liệu Thử Nghiệm Nhanh Chóng
Làm chủ Hàm OFFSET và INDIRECT trong Excel: Hướng dẫn Tra cứu Nâng cao và Tạo Tham chiếu Động