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

Liên hệ QC

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

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,725
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

Lần chỉnh sửa cuối:
Pass VBA vẫn như cũ ...Bạn Nghĩa
 
Upvote 0
Các bạn tải lại file tại #1 nhé! Xém chút dính chưởng! Page người ta có thể đổi tên được nên không cần phải loại ra trường hợp Like "Page*". Password vẫn là HoangTrongNghia

Đã sửa code thành:

Mã:
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
        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
    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
 
Upvote 0
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.

attachment.php


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.

attachment.php


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.

Vẫn chưa đơn giản anh Nghĩa ạ . hàm CalendarOnForm em nghĩ chỉ cần truyền 1 tham số cho mọi trường hợp mới gọi là đơn giản =))
 
Upvote 0
Ý là sao đây? Làm sao xác định nó là UserForm mà truyền thêm hả?
chời ơi ních xanh cổ thụ mà mới làm khó tí đã quay lại hỏi rồi =)) . vậy sao gọi là Nghĩa đẹp chai được ?
cái em nêu ra ở #4 mới chỉ là 1 phần trong kế hoạch thôi
kế hoạch đầy đủ
bước 1 : làm cho thủ tục CalendarOnForm còn 1 tham số mà thôi . Vì sao ? khi đưa vào Object textbox thì nó đã mang gen của tổ tông nhà nó rồi , truyền UserForm vào chi ? vậy làm sao từ textbox mà lấy được thông tin của UserForm ? đấy là việc của ních xanh , tôi không biết
bước 2 : viết thủ tục đầu vào chung cho 2 thủ tục CalendarOnForm và CalendarOnSheet
đại khái sẽ là
sub SHOWCALENDAR (target as Object)
if NghiaDepTrai then
CalendarOnForm target
else
CalendarOnSheet target
end if
end sub

như vậy ở bất cứ đâu ta cũng chỉ cần gọi chung 1 thủ tục mà thôi . --=0--=0--=0
 
Upvote 0
chời ơi ních xanh cổ thụ mà mới làm khó tí đã quay lại hỏi rồi =)) . vậy sao gọi là Nghĩa đẹp chai được ?
cái em nêu ra ở #4 mới chỉ là 1 phần trong kế hoạch thôi
kế hoạch đầy đủ
bước 1 : làm cho thủ tục CalendarOnForm còn 1 tham số mà thôi . Vì sao ? khi đưa vào Object textbox thì nó đã mang gen của tổ tông nhà nó rồi , truyền UserForm vào chi ? vậy làm sao từ textbox mà lấy được thông tin của UserForm ? đấy là việc của ních xanh , tôi không biết
bước 2 : viết thủ tục đầu vào chung cho 2 thủ tục CalendarOnForm và CalendarOnSheet
đại khái sẽ là
sub SHOWCALENDAR (target as Object)
if NghiaDepTrai then
CalendarOnForm target
else
CalendarOnSheet target
end if
end sub

như vậy ở bất cứ đâu ta cũng chỉ cần gọi chung 1 thủ tục mà thôi . --=0--=0--=0
Ý tôi hỏi là nếu không có cái gì xác định là UserForm thì làm sao biết mà so sánh?

VD: TextBox trên Sheet và TextBox trên Form, làm sao biết nó tồn tại trên mảnh đất hoa màu nào?

Thậm chí cái "Ctrl.Parent" nó cũng không cho mình biết cái TypeName của nó chính xác là UserForm mà chỉ cho mình biết cái tên của UserForm đó thôi thì làm sao mà tính đây?
 
Lần chỉnh sửa cuối:
Upvote 0
Ý tôi hỏi là nếu không có cái gì xác định là UserForm thì làm sao biết mà so sánh?

VD: TextBox trên Sheet và TextBox trên Form, làm sao biết nó tồn tại trên mảnh đất hoa màu nào?

giờ mà em nói ra 1 từ thôi thì mọi chuyện lại quá đơn giản , không vừa sức anh Nghĩa , nên anh cứ từ từ suy nghĩ thêm đi nhé , lêu lêu =)) --=0--=0--=0
 
Upvote 0
giờ mà em nói ra 1 từ thôi thì mọi chuyện lại quá đơn giản , không vừa sức anh Nghĩa , nên anh cứ từ từ suy nghĩ thêm đi nhé , lêu lêu =)) --=0--=0--=0
Thôi, không nghĩ đâu, mệt lắm, lắm lúc cũng phải tự mãn những gì mình đã làm. Nhưng rõ ràng tôi không biết xác định controls nào là Form trong cái mớ Ctrl.Parent đó. Với Frame và MultiPage còn ra, riêng UserForm nó không có cho đúng Type thì không xác định được.
 
Upvote 0
Thôi, không nghĩ đâu, mệt lắm, lắm lúc cũng phải tự mãn những gì mình đã làm. Nhưng rõ ràng tôi không biết xác định controls nào là Form trong cái mớ Ctrl.Parent đó. Với Frame và MultiPage còn ra, riêng UserForm nó không có cho đúng Type thì không xác định được.
trước hết xin được lưu ý 2 điều
1/Các Control nằm trong Form được phép đặt tên trùng với UserForm luôn
vậy so sánh này không an toàn và có thể sai bất cứ lúc nào
Mã:
Do Until Ctrl.Parent.Name = UserForm.Name
2/UserForm được phép đặt tên là "Frame" hoặc "MultiPage" vậy khi lấy TypeName(Userform) có thể ra kết quả là "Frame"
bây giờ là code
xác định UserForm dựa vào Textbox
Mã:
Private Function getRootCtrl(Ctrl As Object) As Object
On Error GoTo endLoop
Do While True
    If getRootCtrl Is Nothing Then Set getRootCtrl = Ctrl.Parent Else Set getRootCtrl = getRootCtrl.Parent
Loop
endLoop:
End Function

Mã:
Public Sub CalendarOnForm2(ByVal DateObject As Object)
    pubShowModal = True
    Set pubDateObject = DateObject
    Dim Ctrl As Object, uForm As Object, typenameObj As String
    Dim myEdge As Single, myLeft As Single, myTop As Single
    Set uForm = getRootCtrl(DateObject)
    Set Ctrl = DateObject
    On Error GoTo endLoop
    Do While True
        Set Ctrl = Ctrl.Parent
        typenameObj = TypeName(Ctrl)
        If Ctrl Is uForm Then typenameObj = "Frame"
        Select Case typenameObj
        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
    Loop
endLoop:
    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

đầu vào chung
Mã:
Public Sub testShowCalendar(target As Object)
If TypeName(target.Parent) = "Worksheet" Then
    CalendarOnSheet target
Else
    CalendarOnForm2 target
End If
End Sub
 
Upvote 0
trước hết xin được lưu ý 2 điều
1/Các Control nằm trong Form được phép đặt tên trùng với UserForm luôn
vậy so sánh này không an toàn và có thể sai bất cứ lúc nào
Mã:
Do Until Ctrl.Parent.Name = UserForm.Name
2/UserForm được phép đặt tên là "Frame" hoặc "MultiPage" vậy khi lấy TypeName(Userform) có thể ra kết quả là "Frame"
bây giờ là code
xác định UserForm dựa vào Textbox
Mã:
Private Function getRootCtrl(Ctrl As Object) As Object
On Error GoTo endLoop
Do While True
    If getRootCtrl Is Nothing Then Set getRootCtrl = Ctrl.Parent Else Set getRootCtrl = getRootCtrl.Parent
Loop
endLoop:
End Function

Mã:
Public Sub CalendarOnForm2(ByVal DateObject As Object)
    pubShowModal = True
    Set pubDateObject = DateObject
    Dim Ctrl As Object, uForm As Object, typenameObj As String
    Dim myEdge As Single, myLeft As Single, myTop As Single
    Set uForm = getRootCtrl(DateObject)
    Set Ctrl = DateObject
    On Error GoTo endLoop
    Do While True
        Set Ctrl = Ctrl.Parent
        typenameObj = TypeName(Ctrl)
        If Ctrl Is uForm Then typenameObj = "Frame"
        Select Case typenameObj
        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
    Loop
endLoop:
    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

đầu vào chung
Mã:
Public Sub testShowCalendar(target As Object)
If TypeName(target.Parent) = "Worksheet" Then
    CalendarOnSheet target
Else
    CalendarOnForm2 target
End If
End Sub

Hỗm rày lo làm cái chương trình Rút thăm trúng thưởng cho WKT nên chưa bàn sâu vào vấn đề này.

https://www.facebook.com/hoangtrong.nghia.52/videos/747834515362918/

Đúng là mình chưa lường được tình huống là Frame hay MultiPage cũng có thể đặt trùng tên với UserForm!

Nhưng để viết như thế thì lại thêm 1 hàm xử lý nữa, nên tôi lại phải "tinh giảm biên chế" một hàm phụ này cho gọn luôn!

Mã:
Private Sub CalendarOnForm(ByVal Target As Object)
    pubShowModal = True
    Set pubTarget = Target
    Dim IsUserForm As Boolean
    Dim TypeNameObj As String
    Dim Ctrl As Object, UserForm As Object
    Dim meEdge As Single, meLeft As Single, meTop As Single
    Set Ctrl = Target
    On Error Resume Next
    Do
        Set Ctrl = Ctrl.Parent
        TypeNameObj = TypeName(Ctrl)
        Set UserForm = Ctrl.Parent
        If UserForm Is Nothing Then
            TypeNameObj = "Frame": IsUserForm = True
        Else
            If Err.Number Then TypeNameObj = "Frame": IsUserForm = True
        End If
        Select Case TypeNameObj
        Case "Frame"
            With Ctrl
                meEdge = (.Width - .InsideWidth) / 2
                meLeft = meLeft + .Left + meEdge
                meTop = meTop + .Top + .Height - .InsideHeight - meEdge
            End With
        Case "MultiPage"
            With Ctrl
                meEdge = (.Width - .Pages(0).InsideWidth) / 2
                meLeft = meLeft + .Left + meEdge
                meTop = meTop + .Top + .Height - .Pages(0).InsideHeight - meEdge
            End With
        End Select
    Loop Until IsUserForm
    With Target
        meLeft = meLeft + .Left
        meTop = meTop + .Top + .Height
        DatePicked .Value
    End With
    With Application
        If meLeft + usfCalendar.Width > .Left + .Width Then
            meLeft = meLeft - usfCalendar.Width
        End If
        If meTop + usfCalendar.Height > .Top + .Height Then
            meTop = meTop - usfCalendar.Height - Target.Height
        End If
    End With
    With usfCalendar
        .StartUpPosition = 0
        .Left = meLeft
        .Top = meTop
        .Show
    End With
End Sub

Lêu lêu ... (ẹc ... ẹc ...)--=0
 
Lần chỉnh sửa cuối:
Upvote 0
ôi mình bị anh í lêu lêu kìa . hu hu
anh ơi cho hỏi 1 target đưa vào sao biết nó nằm trên sheet hay Form vậy anh ?
Uh, thì có người nói là giải quyết vấn đề cho người khác thì sáng lắm, nên mình cũng thế mà! Lêu ... lêu ... --=0--=0--=0

P/s: Mới sáng hơn nữa kìa! Đã làm cho code gọn hơn rồi kìa! Không để lọt một trường hợp dù là chỉ 1 mà thôi! Kakakaka.
 
Upvote 0
Uh, thì có người nói là giải quyết vấn đề cho người khác thì sáng lắm, nên mình cũng thế mà! Lêu ... lêu ... --=0--=0--=0

P/s: Mới sáng hơn nữa kìa! Đã làm cho code gọn hơn rồi kìa! Không để lọt một trường hợp dù là chỉ 1 mà thôi! Kakakaka.
ơ anh chưa trả lời em mà , cái hàm CalendarOnForm anh vừa ghi đâu phải câu trả lời
 
Upvote 0
ơ anh chưa trả lời em mà , cái hàm CalendarOnForm anh vừa ghi đâu phải câu trả lời
Trả lời ở bài #14 kìa! Không phải trả lời gián tiếp rồi đó sao? Kakakaa+-+-+-+

cái này anh làm lộn chiều rồi anh ơi , bồ nhí ai cho đánh ghen ngược .
Addins này là của anh , nên câu giả dụ phải để tôi hỏi anh mới đúng chứ . hí hí --=0--=0

Cho nên chưa xài (cái thủ tục gộp gì gì của ai đó) thì chưa tính đó chứ! Hahahaha. Ta phải sửa lại mà!
 
Upvote 0
Trả lời ở bài #14 kìa! Không phải trả lời gián tiếp rồi đó sao? Kakakaa+-+-+-+



Cho nên chưa xài (cái thủ tục gộp gì gì của ai đó) thì chưa tính đó chứ! Hahahaha. Ta phải sửa lại mà!
uhm . Là em cố tình xài cách đó để thử tài ních xanh đó mà . Nếu im luôn thì đáng lo chứ quay lại lêu lêu em thì được rồi . không phải lo nữa . hi hi
 
Upvote 0
uhm . Là em cố tình xài cách đó để thử tài ních xanh đó mà . Nếu im luôn thì đáng lo chứ quay lại lêu lêu em thì được rồi . không phải lo nữa . hi hi
Công nhận, con người ta đang 6 sao bị hạ xuống 1 sao thành "thành viên mới" luôn nên có khác!
 
Upvote 0
ờ 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

  • MiaOi1.jpg
    MiaOi1.jpg
    77.7 KB · Đọc: 28
  • MiaOi2.jpg
    MiaOi2.jpg
    99.2 KB · Đọc: 25
  • MiaOi3.jpg
    MiaOi3.jpg
    74 KB · Đọc: 26
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
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

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

Back
Top Bottom