Tặng tiện ích CALENDAR tuyệt đẹp (phần 4 - Version 7 - Định vị trên Frame/MultiPage)

Liên hệ QC

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,717
Giới tính
Nam
Trong phiên bản 7 này, tôi đã cập nhật tính năng định vị CALENDAR sẽ hiển thị dưới các TextBox chứa trong UserForm, Frame/MultiPage.

Cal1.jpg

Các phiên bản trước chỉ xác định đúng khi TextBox chỉ chứa trong UserForm, nhưng một số chương trình lại đặt TextBox lấy ngày tháng đó trong một hay nhiều Frame hoặc/và Multipage thì Calendar không xác định chính xác Top & Left của nó so với TextBox. Và lần này cũng bổ sung, nếu cái TextBox sát màn hình Window, nó sẽ dịch chuyển lên trên hoặc qua trái.

Cal2.jpg

Cấu trúc của việc nhúng lịch cũng dễ dàng hơn và đơn giản hơn.

1) Trên Sheet:

1.1) Thủ tục:

Mã:
Public Sub CalendarOnSheet(ByVal RangeOrObject As Object)
    pubShowModal = False
    pubIsRange = (TypeName(RangeOrObject) = "Range")
    Set pubDateObject = RangeOrObject
    On Error Resume Next
    Dim myArr
    Dim myLeft As Single, myTop As Single
    myArr = CellOrControlPosition(RangeOrObject)
    If IsArray(myArr) Then
        myLeft = myArr(1)
        myTop = myArr(2)
        With Application
            If myLeft + usfCalendar.Width > .Left + .Width Then
                myLeft = myLeft - usfCalendar.Width
                If TypeName(RangeOrObject) = "Range" Then
                    myLeft = myLeft + RangeOrObject.Width * ActiveWindow.Zoom / 100
                End If
            End If
            If myTop + usfCalendar.Height > .Top + .Height Then
                myTop = myTop - usfCalendar.Height - RangeOrObject.Height * ActiveWindow.Zoom / 100
            End If
        End With
        If Not pubIsRange Then
            ActiveCell.Select
        End If
    End If
    DatePicked RangeOrObject.Value
    With usfCalendar
        .StartUpPosition = 0
        .Left = myLeft
        .Top = myTop
        .Show False
    End With
End Sub

1.2) Nhúng trên CELL:

Mã:
Run "CalendarShow_V.7.xla!CalendarOnSheet", Range("C5")

Run "CalendarShow_V.7.xla!CalendarOnSheet", Target

Run "CalendarShow_V.7.xla!CalendarOnSheet", ActiveCell

1.3) Nhúng trên ActiveX Controls:

Mã:
Run "CalendarShow_V.7.xla!CalendarOnSheet", TextBox1

Run "CalendarShow_V.7.xla!CalendarOnSheet", ComboBox1

2) Trên UserForm:

2.1) Thủ tục:

Trong thủ tục này, tôi đặc biệt cám ơn bạn doveandrose đã giúp tôi xác định InsideHeight của MultiPage và bạn jack nt đã giúp tôi xác định FullName của một Control.

PHP:
Public Sub CalendarOnForm(ByVal DateObject As Object, ByVal UserForm As Object)
    pubShowModal = True
    Set pubDateObject = DateObject
    On Error Resume Next
Dim Ctrl As Control
Dim myEdge As Single, myLeft As Single, myTop As Single
    With UserForm
        myEdge = (.Width - .InsideWidth) / 2
        myLeft = .Left + myEdge
        myTop = .Top + .Height - .InsideHeight - myEdge
    End With
    Set Ctrl = DateObject
    Do Until Ctrl.Parent.Name = UserForm.Name
        Set Ctrl = Ctrl.Parent
        If Not Ctrl.Name Like "Page*" Then
            Select Case TypeName(Ctrl)
            Case "Frame"
                With Ctrl
                    myEdge = (.Width - .InsideWidth) / 2
                    myLeft = myLeft + .Left + myEdge
                    myTop = myTop + .Top + .Height - .InsideHeight - myEdge
                End With
            Case "MultiPage"
                With Ctrl
                    myEdge = (.Width - .Pages(0).InsideWidth) / 2
                    myLeft = myLeft + .Left + myEdge
                    myTop = myTop + .Top + .Height - .Pages(0).InsideHeight - myEdge
                End With
            End Select
        End If
    Loop
    With DateObject
        myLeft = myLeft + .Left
        myTop = myTop + .Top + .Height
        DatePicked .Value
    End With
    With Application
        If myLeft + usfCalendar.Width > .Left + .Width Then
            myLeft = myLeft - usfCalendar.Width
        End If
        If myTop + usfCalendar.Height > .Top + .Height Then
            myTop = myTop - usfCalendar.Height - DateObject.Height
        End If
    End With
    With usfCalendar
        .StartUpPosition = 0
        .Left = myLeft
        .Top = myTop
        .Show
    End With
End Sub

2.2) Control trong UserForm, thủ tục như sau:

Mã:
Run "CalendarShow_V.7.xla!CalendarOnForm", TextBox1, Me

Run "CalendarShow_V.7.xla!CalendarOnForm", ComboBox1, UserForm1
 

File đính kèm

  • HuongDan.xls
    81.5 KB · Đọc: 88
  • CalendarShow_V.7.xla
    254.5 KB · Đọc: 112
Lần chỉnh sửa cuối:
ờ vậy ở đây chắc hết chuyện của mình rồi . Ngủ thôi . hi hi
Chưa hết chiện đâu! Đang nghiên cứu cái vụ này nè. Làm sao show calendar đúng vị trí của TextBox trên Frame trong Sheet nè! Nhờ xác định vị trí giúp mình cái! Ẹc ... Ẹc ...
 

File đính kèm

  • NhucDau.jpg
    NhucDau.jpg
    134.4 KB · Đọc: 41
Upvote 0
Chưa hết chiện đâu! Đang nghiên cứu cái vụ này nè. Làm sao show calendar đúng vị trí của TextBox trên Frame trong Sheet nè! Nhờ xác định vị trí giúp mình cái! Ẹc ... Ẹc ...
xác định cái gì nữa , trong hình hiển thị đúng rồi mà .
Nhưng làm sao add textbox vào Frame của sheet vậy anh ? em làm textbox nó chui xuống đằng sau Frame không à
 
Upvote 0
xác định cái gì nữa , trong hình hiển thị đúng rồi mà .
Nhưng làm sao add textbox vào Frame của sheet vậy anh ? em làm textbox nó chui xuống đằng sau Frame không à

Đúng gì mà đúng chứ, mình rê cái calendar cho dúng vị trí mong muốn thôi mà!
 
Upvote 0
Upvote 0
Chính xác cách tạo ra chúng ở bài này:

http://www.giaiphapexcel.com/forum/showthread.php?7146-Đố-vui-về-VBA!&p=539897#post539897

Bổ sung nha:

1) Vẽ Frame:

Mặc định là trong hộp ActiveX Controls là không có anh này rồi đó!

Vẽ tại đâu?

Bấm vào nút More Controls (cái biểu tượng cái búa và cái khóa chéo nhau).

Sau khi hộp More Controls hiện ra, chọn vào mục Microsoft Form 2.0 Frame, rồi OK, sau đó ta vẽ trên sheet cái Frame này.

2) Add Controls lên Frame:

Trong chế độ Design, Click phải chuột vào Frame, chọn Frame Objects > Edit

Lúc này ta sẽ có được một ToolBox để add vào Frame.

3) Tạo thuộc tính cho Controls:

Click phải vào control, lúc này có một menu hoàn toàn xa lạ, kệ nó, ta chọn vào mục Properties của nó.

Lưu ý, cái Properties này nó cũng khác với các Properties ta vẫn thường thấy, đó là ta chọn một thuộc tính bất kỳ trong đó, thì nó sẽ hiện giá trị lên trên một Combobox ở trên cùng, muốn thay đổi gì thì thay đổi tại ComboBox đó rồi bấm nút Apply.

4) Bước này là tạo sự kiện cho nó, tạo như thế nào thì đã có các bài nói về chúng rồi, mình không nói lại nữa.
 
Upvote 0
Học thầy không tày học bạn. Bạn mình nói làm 1 thủ tục chung cho 2 loại Sheet và Form thì làm chung thôi:

Mã:
Sub Calendar(ByVal Target As Object)
    On Error Resume Next
    Dim WS As Worksheet
    Set WS = Target.Parent
    If Err.Number Then
        CalendarOnForm Target
    Else
        CalendarOnSheet Target
    End If
End Sub

P/s: thủ tục này chưa bao hàm việc TextBox trong Frame của Sheet nha. Đang nghiên cứu.
 
Upvote 0
Học thầy không tày học bạn. Bạn mình nói làm 1 thủ tục chung cho 2 loại Sheet và Form thì làm chung thôi:

Mã:
Sub Calendar(ByVal Target As Object)
    On Error Resume Next
    Dim WS As Worksheet
    Set WS = Target.Parent
    If Err.Number Then
        CalendarOnForm Target
    Else
        CalendarOnSheet Target
    End If
End Sub

P/s: thủ tục này chưa bao hàm việc TextBox trong Frame của Sheet nha. Đang nghiên cứu.

ủa bạn nào vậy anh Nghĩa , biết đâu bạn đó xúi dại sao ? :-=:-=:-=
 
Upvote 0
Ui mịa ơi, sao xác định đúng dữ vậy trời!

attachment.php



attachment.php


attachment.php
 

File đính kèm

  • MiaOi3.jpg
    MiaOi3.jpg
    74 KB · Đọc: 26
  • MiaOi2.jpg
    MiaOi2.jpg
    99.2 KB · Đọc: 25
  • MiaOi1.jpg
    MiaOi1.jpg
    77.7 KB · Đọc: 28
Upvote 0
tôi nói trước , coi chừng ăn đòn khi chỉnh Zoom khác 100%
 
Upvote 0
lại không nhìn thấy bài viết cuối nữa . Diễn đàn lỗi hoài ...
tôi nói trước : coi chừng ăn đòn khi Zoom khác 100%
 
Upvote 0
tôi nói trước , coi chừng ăn đòn khi chỉnh Zoom khác 100%
Kệ nó đi, chỉ là một trong những trường hợp hy hữu mới có vụ này. Hiếm ai làm cái TextBox này nằm trong Frame dạng này lắm. Anh Bill còn không muốn show cái Frame ra trong ActiveX Controls ToolBox mà!
 
Upvote 0
Kệ nó đi, chỉ là một trong những trường hợp hy hữu mới có vụ này. Hiếm ai làm cái TextBox này nằm trong Frame dạng này lắm. Anh Bill còn không muốn show cái Frame ra trong ActiveX Controls ToolBox mà!
sao câu này lại thốt ra từ miệng ních xanh được cơ chứ . Lêu lêu
 
Upvote 0
ồ nếu mạnh mẽ như vậy thì cho em mượn cái addins em test vào file của em đi . hi hi
Từ từ, để hoàn thiện frame trong frame đã, chỉ mới có 1 trường hợp 1 frame thôi. Mà để lập trình được sự kiện kiểu Frame trong Frame thì cũng ngô khoai lắm chứ không phải giỡn! Sẽ gọi TextBox trong Frame của Frame như thế nào mới là vấn đề, còn việc định vị là có cơ sở rồi.

Thôi, giờ đi dạo đây! Mõi mắt quá rồi!
 
Upvote 0
Từ từ, để hoàn thiện frame trong frame đã, chỉ mới có 1 trường hợp 1 frame thôi. Mà để lập trình được sự kiện kiểu Frame trong Frame thì cũng ngô khoai lắm chứ không phải giỡn! Sẽ gọi TextBox trong Frame của Frame như thế nào mới là vấn đề, còn việc định vị là có cơ sở rồi.
ôi anh í không thích chơi với mình , anh í giữ riêng nghiên cứu thôi . hic
 
Upvote 0
Trước hết cảm ơn Chủ thớt vì tiện ích hay nhưng Chủ thớt ơi, sao mình add in vào chạy excel thì bị lỗi số 5 mình có gửi file chụp màn hình gửi kèm theo. Bị lỗi như vậy mình nhấn esc thoát ra thì vẫn sử dụng bình thường. Mong chỉ giáo thêm.
Thanks./.
 

File đính kèm

  • hinh bi loi.jpg
    hinh bi loi.jpg
    13.5 KB · Đọc: 23
Upvote 0
Web KT

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

Back
Top Bottom