Form ngày tháng không nằm ở vị trí mình cần (1 người xem)

Liên hệ QC

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

chaoban888

Thành viên mới
Tham gia
28/1/10
Bài viết
42
Được thích
8
Khi click vào A8 thì Form Date Picker hiện lên ở chỗ nhìn thấy được
Nhưng click vào ô A33 hoặc ô A52 thì không thể thấy được nữa

Bác nào giúp em chỉnh Form Date Picker nằm cạnh ô cần chỉnh ngày tháng nhé

Cảm ơn các bác -=.,,
 

File đính kèm

Khi click vào A8 thì Form Date Picker hiện lên ở chỗ nhìn thấy được
Nhưng click vào ô A33 hoặc ô A52 thì không thể thấy được nữa

Bác nào giúp em chỉnh Form Date Picker nằm cạnh ô cần chỉnh ngày tháng nhé

Cảm ơn các bác -=.,,

Bạn cứ tham khảo bài này thử xem, đọc hết các bài càng tốt:

http://www.giaiphapexcel.com/forum/...ft-của-ô-A1-so-với-Window&p=457085#post457085
 
Upvote 0
Khi click vào A8 thì Form Date Picker hiện lên ở chỗ nhìn thấy được
Nhưng click vào ô A33 hoặc ô A52 thì không thể thấy được nữa

Bác nào giúp em chỉnh Form Date Picker nằm cạnh ô cần chỉnh ngày tháng nhé

Cảm ơn các bác -=.,,

Thế sao bạn không xài mấy cái Calendar có sẵn trên Excel?
 
Upvote 0
Thì phải chờ tác giải trả lời mới biết
Nhiều khi người ta chưa biết cách cài cũng không chừng (hoặc có sẵn mà không biết)

máy em thì không có cái file mscal.ocx , mà cài vào cũng hơi rắc rối.

Em thấy cái code VBA này dùng được trên mọi máy nên mới dùng thôi

Gặp máy không có cái mscal thì cũng phải cài mất công
 
Upvote 0
máy em thì không có cái file mscal.ocx , mà cài vào cũng hơi rắc rối.

Em thấy cái code VBA này dùng được trên mọi máy nên mới dùng thôi

Gặp máy không có cái mscal thì cũng phải cài mất công

Nếu máy của bạn mà có sẳn Calendar thì rất tiện, bạn muốn đặt cái controls đó tại đâu cũng được, đồng thời code cũng rất đơn giản đấy bạn.
 
Upvote 0
Khi click vào A8 thì Form Date Picker hiện lên ở chỗ nhìn thấy được
Nhưng click vào ô A33 hoặc ô A52 thì không thể thấy được nữa

-=.,,

Bạn có như vậy vì tác giả code định vị Form sai. Ta xét code:

Mã:
Private Sub UserForm_Activate()
...
    [B][COLOR=#ff0000]Me.Left = Target.Left[/COLOR][/B]
    Me.Top = Target.Top + Target.Height
End Sub

Ta xét dòng đỏ, dòng kia tương tự.

Target.Left được tính trong hệ tọa độ cửa sổ, chính xác hơn là trục y trùng với gờ trái của các cell trong cột A. Trong trường hợp của bạn thì luôn có Target.Left = 0 do các cell nằm trong cột A.

Me.Left được tính trong hệ tọa độ màn hình. Tức trục y trùng với gờ trái của màn hình.

Bạn hãy làm như sau thì thấy rõ sự sai lệch. Bạn cho cửa sổ Excel về trạng thái bình thường (không max) --> kéo cửa sổ Excel sao cho gờ trái của nó nằm ở giữa màn hình. Bạn sẽ thấy ô chọn nằm ở giữa màn hình trong khi gờ trái của Form trùng với gờ trái của màn hình. Vì sao? Vì Me.Left = Target.Left = 0.

Tôi sửa cho bạn để cho góc trái bên trên của Form trùng với góc trái bên trên của ô ở bên phải ô cần thao tác.

1. Bại Insert module rồi copy code dưới vào module

module
Mã:
Private Const LOGPIXELSX = 88
Private Const LOGPIXELSY As Long = 90
Private Const POINTS_PER_INCH As Long = 72

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, ByRef lpRect As RECT) As Long
Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Function CoordinateCell(Optional rCell As Range, Optional ScreenCoordinates As Boolean = True, Optional ByVal ResultInPixels = False) As POINTAPI
'   ham tra ve toa do cua goc tren ben trai cua cell rCell trong he toa do Screen - ScreenCoordinates = TRUE
'   hoac trong he toa do cua so EXCEL7 - ScreenCoordinates = FALSE
'   ket qua tra ve tinh bang Pixels - ResultInPixels = TRUE hoac Points - ResultInPixels = FALSE

Dim PointsPerPixelX As Double, PointsPerPixelY As Double
Dim DC As Long, hWnd As Long, rc As RECT
Dim xStart As Long, yStart As Long, rng As Range, Arr(1 To 2)
    If rCell Is Nothing Then Set rCell = ActiveSheet.Range("A1")
    Set rCell = rCell(1, 1)
    
    DC = GetDC(0)
    PointsPerPixelX = POINTS_PER_INCH / GetDeviceCaps(DC, LOGPIXELSX)
    PointsPerPixelY = POINTS_PER_INCH / GetDeviceCaps(DC, LOGPIXELSY)
    ReleaseDC 0, DC
    
    hWnd = FindWindow("XLMAIN", vbNullString)
    hWnd = FindWindowEx(hWnd, 0, "XLDESK", vbNullString)
    hWnd = FindWindowEx(hWnd, 0, "EXCEL7", vbNullString)
'    toa do cua cua so EXCEL7 trong he toa do Screen
    GetWindowRect hWnd, rc
'    xuat phat tu trung diem canh trai cua cua so EXCEL7
    xStart = rc.Left
    yStart = (rc.Bottom + rc.Top) \ 2
'    thuc hien vong lap cho toi khi gap cell nao do
    Set rng = Application.Windows(1).RangeFromPoint(xStart, yStart)
    Do While rng Is Nothing
        xStart = xStart + 1
        Set rng = Application.Windows(1).RangeFromPoint(xStart, yStart)
    Loop
'    nhay toi diem tren canh tren cua cua so EXCEL7 co cung hoanh do
    yStart = rc.Top
'    thuc hien vong lap cho toi khi gap cell nao do - do chinh la cell A1, va diem hien hanh la goc tren ben trai cua A1
    Set rng = Application.Windows(1).RangeFromPoint(xStart, yStart)
    Do While rng Is Nothing
        yStart = yStart + 1
        Set rng = Application.Windows(1).RangeFromPoint(xStart, yStart)
    Loop
'    (xStart - rc.Left) va (yStart - rc.Top) la toa do tinh bang Pixels cua goc tren ben trai cua A1
'    tinh trong he toa do cua EXCEL7.
    If ResultInPixels Then
        If ScreenCoordinates Then
            CoordinateCell.x = xStart + (rCell.Left - rng.Left) / PointsPerPixelX
            CoordinateCell.y = yStart + (rCell.Top - rng.Top) / PointsPerPixelY
        Else
            CoordinateCell.x = (xStart - rc.Left) + (rCell.Left - rng.Left) / PointsPerPixelX
            CoordinateCell.y = (yStart - rc.Top) + (rCell.Top - rng.Top) / PointsPerPixelY
        End If
    Else    ' Points
        If ScreenCoordinates Then
            CoordinateCell.x = xStart * PointsPerPixelX + (rCell.Left - rng.Left)
            CoordinateCell.y = yStart * PointsPerPixelY + (rCell.Top - rng.Top)
        Else
            CoordinateCell.x = (xStart - rc.Left) * PointsPerPixelX + (rCell.Left - rng.Left)
            CoordinateCell.y = (yStart - rc.Top) * PointsPerPixelY + (rCell.Top - rng.Top)
        End If
    End If
End Function

2. Sửa
Mã:
Private Sub UserForm_Activate()
    If IsDate(Target.Value) Then
        Calendar1.Value = Target.Value
    End If
    Me.Left = Target.Left
    Me.Top = Target.Top + Target.Height
End Sub

thành

Mã:
Private Sub UserForm_Activate()
Dim pt As POINTAPI
    If IsDate(Target.Value) Then
        Calendar1.Value = Target.Value
    End If
    pt = CoordinateCell(Target.Offset(, 1))
    Me.Left = pt.x
    Me.Top = pt.y
End Sub
 
Upvote 0
Không biết sao lúc mình chạy bị lỗi 2 dòng này
Mã:
Dim pt As POINTAPI

Mã:
Function CoordinateCell(Optional rCell As Range, Optional ScreenCoordinates As Boolean = True, Optional ByVal ResultInPixels = False) As POINTAPI

:g:
 
Upvote 0
Không biết sao lúc mình chạy bị lỗi 2 dòng này
Mã:
Dim pt As POINTAPI

Mã:
Function CoordinateCell(Optional rCell As Range, Optional ScreenCoordinates As Boolean = True, Optional ByVal ResultInPixels = False) As POINTAPI

:g:

Tôi quên chưa sửa.

Bạn sửa ở code bài #8 đoạn

Mã:
[B][COLOR=#ff0000]Private[/COLOR][/B] Type POINTAPI
    x As Long
    y As Long
End Type

thành

Mã:
[B][COLOR=#ff0000]Public[/COLOR][/B] Type POINTAPI
    x As Long
    y As Long
End Type
 
Upvote 0
Tôi quên chưa sửa.

Bạn sửa ở code bài #8 đoạn

Mã:
[B][COLOR=#ff0000]Private[/COLOR][/B] Type POINTAPI
    x As Long
    y As Long
End Type

thành

Mã:
[B][COLOR=#ff0000]Public[/COLOR][/B] Type POINTAPI
    x As Long
    y As Long
End Type

Đã chạy rất chuẩn. Thanks bác nhiều thật nhiều -=.,,
 
Upvote 0

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

Back
Top Bottom