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:
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./.
bạn mở file hướng dẫn lên xong Add cái Add-ins đó vô mà xài chơi vậy
hay Bạn mở trực tiếp cái Add-ins đó lên ta........ nếu vậy thì thua...+-+-+-+
 
Upvote 0
Mình mở Excel lên add in vào Bạn ơi. Sau đó thoát ra và vào excel lại thì bị như vậy. Mong bạn chỉ giúp.
Thanks./.
 
Upvote 0
Mình mở Excel lên add in vào Bạn ơi. Sau đó thoát ra và vào excel lại thì bị như vậy. Mong bạn chỉ giúp.
Thanks./.
Nếu muốn thử file, chỉ cần mở một file trắng, sau đó mở tiếp file Addins lên, click phải để chọn mặt cười calendar, hoặc Ctrl+Q.

Nếu muốn cài đặt thì vào Excel Option, chọn Addins, chọn Go..., chọn Browse để tìm đường dẫn đến file addin đó, rồi OK. File Addin đã được kích hoạt.
 
Upvote 0
Dạ mình đã làm đúng vậy bạn Nghĩa à. Mình đã add in file của bạn rồi. Bây giờ cứ mở excel là nó báo lỗi như vậy. Mình nhấn nút End kết thúc nó vào excel bình thường. Khi sử dụng lần đầu thì cũng báo như vậy luôn nhấn end lần nữa thì được ạ.
Bạn có teamwiewer không mình cho bạn xem màn hình của mình.
Mong bạn ngâm cứu chỉ lỗi của mình dùm.
Thanks./.
 

File đính kèm

  • 1.jpg
    1.jpg
    12.8 KB · Đọc: 27
Upvote 0
Khi vào excel rồi lần đầu gọi "mặt cười" lần đầu thì nó vẫn báo như vậy.
 

File đính kèm

  • 2.jpg
    2.jpg
    16.1 KB · Đọc: 23
Upvote 0
Mình đã cài add in của Bạn rồi. Bạn xem hình thử
 

File đính kèm

  • 3.jpg
    3.jpg
    18.1 KB · Đọc: 27
Upvote 0
invalid procedure call or argument =))
Lỗi này không trực tiếp kiểm tra sẽ không rõ nó phát sinh ở đâu đâu. Có thể là khi gọi một thủ tục nào đó, nhưng thủ tục gọi thì không bị lỗi, lại lỗi ngay cái thủ tục được gọi. Tôi thử tải lại về máy tôi cái Addins đó, thử xem có trục trặc gì không, nhưng lại không thấy bất cứ thông báo lỗi nào. Cách tốt nhất có thể dùng là TeamView mới hiểu được máy đó bị ra sao.
 
Upvote 0
Lỗi này không trực tiếp kiểm tra sẽ không rõ nó phát sinh ở đâu đâu. Có thể là khi gọi một thủ tục nào đó, nhưng thủ tục gọi thì không bị lỗi, lại lỗi ngay cái thủ tục được gọi. Tôi thử tải lại về máy tôi cái Addins đó, thử xem có trục trặc gì không, nhưng lại không thấy bất cứ thông báo lỗi nào. Cách tốt nhất có thể dùng là TeamView mới hiểu được máy đó bị ra sao.

ồ vậy bác sĩ đã đến nơi xem bệnh chưa đấy ?
 
Upvote 0
Chắc để cuối tuần đem máy lên Sài Gòn nhờ các đại ca chỉ giáo quá.
 
Upvote 0
Có lẽ bây giờ, chúng ta nên xài Excel 2007 trở về sau là vừa, và như thế, tôi sẽ viết code và lưu file trên Excel 2010 mà không chuyển thành Excel 2003 nữa! Cũng đã hơn 12 năm rồi còn gì!

Và bộ mặt cười của chúng ta sẽ nằm tại Tab Home của dải Ribbon cho thuận tiện thao tác!
 

File đính kèm

  • ADLich.jpg
    ADLich.jpg
    38.2 KB · Đọc: 35
Upvote 0
Đã xác định xong vấn đề Frame/MultiPage trên Sheet! Oải! Mai lên phiên bản mới Excel 2007 trở về sau!
 

File đính kèm

  • HoanTat.jpg
    HoanTat.jpg
    85.8 KB · Đọc: 40
Upvote 0
nếu đã có bản mới thì anh Nghĩa khóa hết các đề tài về bản cũ , và đưa link sang đề tài mới nhất đi , để người vào sau còn biết định hướng .
 
Upvote 0
nếu đã có bản mới thì anh Nghĩa khóa hết các đề tài về bản cũ , và đưa link sang đề tài mới nhất đi , để người vào sau còn biết định hướng .
Mình không quản lý Box Lập Trình nên không khóa được. Để nhờ SMOD vậy.--=0}}}}}
 
Upvote 0
Web KT

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

Back
Top Bottom