anhtuan1066
Thành viên gạo cội
- Tham gia
- 10/3/07
- Bài viết
- 5,802
- Được thích
- 6,912
Trên diển đàn đã từng có bài viết về việc di chuyển UserForm đến vị trí của ActiveCell... Hãy xem bài viết này:
Dùng VBA để xác định vị trí của Form
Di chuyển Form đến Activecell
Có điều nếu xem xong code, chắc các bạn sẽ.. té xỉu vì code dài đến mức không thể hiểu nỗi... Đến lúc muốn tùy biến hoặc chỉnh sửa code cũng chẳng biết đường đâu mà lần
Xin gữi các bạn 1 code đáp ứng được nhu cầu này nhưng với giải thuật hoàn toàn khác, lại vô cùng ngắn gọn
Code gồm 2 phần
1> Hàm API hổ trợ
2> Code chính
-------------------------------------------------
Áp dụng:
Giả sử ta muốn dùng sự kiện SelectionChange để di chuyển UserForm1 đến góc bên phải của ActiveCell, ta sẽ viết như sau:
Vô cùng đơn giản, đúng không?
Nếu thích, có thể save thành 1 Add-In để dùng lâu dài (xóa toàn bộ code, chỉ chừa lại code trong Module trước khi save Add-In)
Dùng VBA để xác định vị trí của Form
Di chuyển Form đến Activecell
Có điều nếu xem xong code, chắc các bạn sẽ.. té xỉu vì code dài đến mức không thể hiểu nỗi... Đến lúc muốn tùy biến hoặc chỉnh sửa code cũng chẳng biết đường đâu mà lần
Xin gữi các bạn 1 code đáp ứng được nhu cầu này nhưng với giải thuật hoàn toàn khác, lại vô cùng ngắn gọn
Code gồm 2 phần
1> Hàm API hổ trợ
PHP:
Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long
Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long
Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long
PHP:
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
PHP:
Sub MoveFormToCell(ByRef frmForm As Object, ByVal rngCell As Range)
Dim hWndDesk As Long, hWndChart As Long, uChartPos As RECT, PointsPerPixel As Double
With rngCell.Parent.ChartObjects.Add(rngCell.Left, rngCell.Top, 1, 1)
.Activate
.Delete
End With
hWndDesk = FindWindowEx(Application.hwnd, 0, "XLDESK", "")
hWndChart = FindWindowEx(hWndDesk, 0, "EXCELE", "")
GetWindowRect hWndChart, uChartPos
PointsPerPixel = 72 / GetDeviceCaps(GetDC(0), 88)
ReleaseDC 0, GetDC(0)
frmForm.Left = uChartPos.Left * PointsPerPixel
frmForm.Top = uChartPos.Top * PointsPerPixel
End Sub
Áp dụng:
Giả sử ta muốn dùng sự kiện SelectionChange để di chuyển UserForm1 đến góc bên phải của ActiveCell, ta sẽ viết như sau:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With UserForm1
.Hide
.StartUpPosition = 0
MoveFormToCell UserForm1, Target.Offset(0, 1)
.Show
End With
End Sub
Nếu thích, có thể save thành 1 Add-In để dùng lâu dài (xóa toàn bộ code, chỉ chừa lại code trong Module trước khi save Add-In)