Tặng tiện ích CALENDAR phiên bản cuối cùng (Excel 2007 trở về sau). (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
Qua nhiều lần cải tiến và tôi nghĩ tới đây là nên chấm dứt chuyện Lịch này. Cho nên tôi đã lường hầu hết các trường hợp có thể xảy ra trên các đối tượng, các Range, các UserForm để đối tượng đó nhận ngày tháng sao cho Calendar show ra tại vị trí nơi nhận ngày tháng (có sự trợ giúp to lớn trong việc xác định vị trí của bạn doveandrose, xin cảm ơn bạn).

Nếu các bạn có xài Excel 2007 trở về sau thì nên tải về, giờ đây tôi cũng sẽ lưu file từ 2007 trở về sau mà không phải convert sang 2003 nữa.

Với phiên bản lần này, các bạn được tham khảo lập trình, cách thức add controls và cách tạo sự kiện cho các ActiveX Controls trên Sheet như TextBox, Frame, MultiPage (nguồn trong File Hướng Dẫn).

PHP:
Option Explicit
Private WithEvents frmTextBox1 As MSForms.TextBox
Private WithEvents frmTextBox2 As MSForms.TextBox
Private WithEvents frmTextBox3 As MSForms.TextBox
Private WithEvents mtpTextBox1 As MSForms.TextBox
Private WithEvents mtpTextBox2 As MSForms.TextBox
Private WithEvents mtpTextBox3 As MSForms.TextBox
''******************************************************************************************************
''SHEET EVENT:
''******************************************************************************************************
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 2 And Target.Row > 10 And Target.Row < 21 Then
        Run "CALENDAR.xlam!CalendarExit"
        Run "CALENDAR.xlam!Calendar", Target
    End If
End Sub


Private Sub Worksheet_Deactivate()
    EraseFrameControlEvent
End Sub
''******************************************************************************************************
''CONTROL BELONG TO SHEET EVENT:
''******************************************************************************************************
Private Sub CommandButton1_Click()
    Frame.Show
End Sub

Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", TextBox1
End Sub

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    CreateFrameControlEvent
End Sub

Private Sub MultiPage1_MouseMove(ByVal Index As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    CreateFrameControlEvent
End Sub
''******************************************************************************************************
''CREATE EVENT FOR SOME TEXTBOXES INTO FRAME ON SHEET EVENT:
''******************************************************************************************************
Sub CreateFrameControlEvent()
    If frmTextBox1 Is Nothing Then
        Set frmTextBox1 = Sheet2.Frame1.Controls("TextBox1")
        Set frmTextBox2 = Sheet2.Frame1.Controls("TextBox2")
        Set frmTextBox3 = Sheet2.Frame1.Controls("TextBox3")
        Set mtpTextBox1 = Sheet2.MultiPage1.Pages(1).Controls("TextBox1")
        Set mtpTextBox2 = Sheet2.MultiPage1.Pages(0).Controls("TextBox2")
        Set mtpTextBox3 = Sheet2.MultiPage1.Pages(1).Controls("TextBox3")
    End If
End Sub

Sub EraseFrameControlEvent()
    Set frmTextBox1 = Nothing
    Set frmTextBox2 = Nothing
    Set frmTextBox3 = Nothing
    Set mtpTextBox1 = Nothing
    Set mtpTextBox2 = Nothing
    Set mtpTextBox3 = Nothing
End Sub
''******************************************************************************************************
''CONTROL BELONG TO FRAME ON SHEET EVENT:
''******************************************************************************************************
Private Sub frmTextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", frmTextBox1
End Sub

Private Sub frmTextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", frmTextBox2
End Sub

Private Sub frmTextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", frmTextBox3
End Sub
''******************************************************************************************************
''CONTROL BELONG TO MULTIPAGE ON SHEET EVENT:
''******************************************************************************************************
Private Sub mtpTextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", mtpTextBox1
End Sub

Private Sub mtpTextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", mtpTextBox2
End Sub

Private Sub mtpTextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Run "CALENDAR.xlam!Calendar", mtpTextBox3
End Sub
''******************************************************************************************************

Một cải tiến nữa là trên Tab Home của dải Ribbon, tôi có thêm 1 Icon mặt cười (Happy Face) để tiện cho việc show lịch.

ThucHanh.jpg

Với người lập trình khi sử dụng Calendar này lại thuận tiện hơn với cấu trúc giản tiện:

Run "CALENDAR.xlam!Calendar", Range("C5")

Run "CALENDAR.xlam!Calendar", TextBox1


Quá đơn giản để nhúng lịch vào chương trình của mình phải không!
 

File đính kèm

Lần chỉnh sửa cuối:
hay quá anh ơi . Nhưng liệu đây có phải là lần chỉnh sửa cuối cùng chăng ? hi hi hi
 
Upvote 0
hay quá anh ơi . Nhưng liệu đây có phải là lần chỉnh sửa cuối cùng chăng ? hi hi hi
Có thể chỉnh sửa lỗi phát sinh, nhưng không nâng cấp thêm tiện ích nào khác nữa. Phải khép cái vụ này lại mới có đầu tư vào tặng những sản phẩm mới chứ! Hãy tin rồi sẽ có, Hãy cho rồi sẽ nhận mà!
 
Upvote 0
Cảm ơn anh rất nhiều, bổ ngửa (ích) hơn nữa là được học code của anh :) hehe--=0
 
Upvote 0
Vọc thử mà được ta? Ngộ vậy ta!}}}}}
 

File đính kèm

  • AmDuongLich.jpg
    AmDuongLich.jpg
    96.9 KB · Đọc: 371
Upvote 0

File đính kèm

  • DepTrai.jpg
    DepTrai.jpg
    50.4 KB · Đọc: 355
Upvote 0
Uh, ý này hay nè! Mình phải làm cái riêng cho mình chứ! Kakakaka
Chà, được đấy! cái này đáng để học đây !Liệu bạn có tải phiên bản mới lên để mọi người học hỏi không nhỉ ? Chèn hình vào Menu, tất nhiên làm một cái để cho oai thôi chứ chỗ nào cũng có hình, cũng không hay lắm!
 
Lần chỉnh sửa cuối:
Upvote 0
Khiếp kỳ này nghĩa nghiên cứu cả CanChiV nữa mới sợ chứ định làm thầy Bói hay sao ta.......//**/
Hay Ghê Cảm ơn Bạn Nghĩa nhiều nhiều
 
Upvote 0
Chà, được đấy! cái này đáng để học đây !Liệu bạn có tải phiên bản mới lên để mọi người học hỏi không nhỉ ? Chèn hình vào Menu, tất nhiên làm một cái để cho oai thôi chứ chỗ nào cũng có hình, cũng không hay lắm!

Phải thế này mới đeeeeeeẽ nè!
 

File đính kèm

  • QuaDepTrai.jpg
    QuaDepTrai.jpg
    35.3 KB · Đọc: 242
Upvote 0
Nhìn lại đi anh, không chỉ là cái mẹt độp chai của mềnh, mà là một nghệ thuật trên Menu đóa!
Mấy lần sinh nhật GPE mình có theo dõi các bạn và các thày nên nhận mặt được khá nhiều người . Tiếc rằng ngày trước mình công tác trong suôt nhưng chưa biết GPE , giờ thì không có điêu kiện rồi...
 
Upvote 0
Khiếp kỳ này nghĩa nghiên cứu cả CanChiV nữa mới sợ chứ định làm thầy Bói hay sao ta.......//**/
Hay Ghê Cảm ơn Bạn Nghĩa nhiều nhiều
Nghĩ cũng lạ, người xưa ở VN nói riêng và châu Á nói chung, tính lịch theo Thiên Can, Địa Chi rồi để xác định hơn lại gán vô tên ông vua nào đó, chẳng hạn: Năm Bính Thìn - Trần Thái Tông.

Thế nhưng cái năm Bính Thìn đó nó có chu kỳ là 60 năm sẽ quay lại, mà giả sử ông vua đó sống trên 70 tuổi thì sao ta? Làm sao phân biệt được là năm nào?

Nghĩ đi nghĩ lại, lịch của Tây Âu là tốt nhất, không bao giờ trùng năm, vậy mới nói họ mới thật sự tiến bộ và văn minh.
 
Upvote 0
Em thấy giống giống ai ấy nhỉ. Xem nào, thêm cặp kính nữa thì giống anh Nghĩa Nguyễn Đức phải biết :-=

attachment.php

Sao nhìn hình này lại giống Nghĩa Nguyễn Đức? Mà người này là ai vậy bạn?
 
Upvote 0
Nghĩ cũng lạ, người xưa ở VN nói riêng và châu Á nói chung, tính lịch theo Thiên Can, Địa Chi rồi để xác định hơn lại gán vô tên ông vua nào đó, chẳng hạn: Năm Bính Thìn - Trần Thái Tông.

Thế nhưng cái năm Bính Thìn đó nó có chu kỳ là 60 năm sẽ quay lại, mà giả sử ông vua đó sống trên 70 tuổi thì sao ta? Làm sao phân biệt được là năm nào?

Nghĩ đi nghĩ lại, lịch của Tây Âu là tốt nhất, không bao giờ trùng năm, vậy mới nói họ mới thật sự tiến bộ và văn minh.
Mình có một thời gian nghiên cứu cả kinh dich, thiên can địa chi,Tiên thiên bát quái và hậu thiên bát quái nữa mới sợ chứ.........

Nghiên cứu một thời gian có những lúc mình cứ nói lảm nhãm ... giáp , ất , bính, đinh, mậu,kỷ, canh, thân,....

Có người nói kỳ này Ông Mạnh sao ý.....nghĩ lại thấy mình có dấu hiệu thần kinh .... bỏ luôn...,,,,,,,,,,,,,,
 
Upvote 0
Upvote 0
anh Nghĩa cho em hỏi
bây giờ tiện ích nó nằm trên chuột phải luôn rồi (cái mặt cười màu vàng ấy).
em đã gỡ tiện ích ra nhưng vẫn còn. làm sao gỡ triệt để được anh
Hỏng hiểu? Thử mở Immediate rồi copy dòng code dưới đây rồi chọn ngay dòng code đó bấm Enter xem:

Application.CommandBars("Cell").Reset
 
Upvote 0
Qua nhiều lần cải tiến và tôi nghĩ tới đây là nên chấm dứt chuyện Lịch này. Cho nên tôi đã lường hầu hết các trường hợp có thể xảy ra trên các đối tượng, các Range, các UserForm để đối tượng đó nhận ngày tháng sao cho Calendar show ra tại vị trí nơi nhận ngày tháng (có sự trợ giúp to lớn trong việc xác định vị trí của bạn doveandrose, xin cảm ơn bạn).

Nếu các bạn có xài Excel 2007 trở về sau thì nên tải về, giờ đây tôi cũng sẽ lưu file từ 2007 trở về sau mà không phải convert sang 2003 nữa.

Với phiên bản lần này, các bạn được tham khảo lập trình, cách thức add controls và cách tạo sự kiện cho các ActiveX Controls trên Sheet như TextBox, Frame, MultiPage (nguồn trong File Hướng Dẫn).

Quá đơn giản để nhúng lịch vào chương trình của mình phải không!
anh Nghĩa cho em hỏi làm sao mất được cái viền xung quanh User Form thế anh
 
Lần chỉnh sửa cuối:
Upvote 0
anh Nghĩa cho em hỏi làm sao mất được cái viền xung quanh User Form thế anh
Trong UserForm đó bạn, nó có chứa các hàm API:

Mã:
#If VBA7 And Win64 Then 'Office 64-bit
    Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr) As LongPtr
    Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr, ByVal dwNewLong As LongPtr) As LongPtr
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#Else ' Office 32-bit
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

Các constant:

Mã:
Const WS_BORDER = &H800000
Const WS_CAPTION = &HC00000
Const WS_THICKFRAME = &H40000
Const WS_DLGFRAME = &H400000
Const WS_EX_DLGMODALFRAME = &H1&
Const GWL_STYLE = (-16)
Const GWL_EXSTYLE = (-20)
Const SWP_FRAMECHANGED = &H20

Và khi load form lên có thủ tục:

Mã:
Private Sub UserForm_Initialize()
    pubCalendarShow = True
    Dim FWd As Long, TitleHeigh As Double
    TitleHeigh = Me.Height - Me.InsideHeight
    FWd = FindWindow("ThunderDFrame", Me.Caption)
    SetWindowLong FWd, GWL_STYLE, GetWindowLong(FWd, GWL_STYLE) And Not _
    (WS_BORDER Or WS_CAPTION Or WS_THICKFRAME Or WS_DLGFRAME)
    SetWindowLong FWd, GWL_EXSTYLE, GetWindowLong(FWd, GWL_EXSTYLE) And Not WS_EX_DLGMODALFRAME
    Me.Height = Me.Height - TitleHeigh
End Sub
 
Upvote 0
Trong UserForm đó bạn, nó có chứa các hàm API:

Mã:
Private Sub UserForm_Initialize()
    pubCalendarShow = True
    Dim FWd As Long, TitleHeigh As Double
    TitleHeigh = Me.Height - Me.InsideHeight
    FWd = FindWindow("[COLOR=#ff0000]ThunderDFrame[/COLOR]", Me.Caption)
    SetWindowLong FWd, GWL_STYLE, GetWindowLong(FWd, GWL_STYLE) And Not _
    (WS_BORDER Or WS_CAPTION Or WS_THICKFRAME Or WS_DLGFRAME)
    SetWindowLong FWd, GWL_EXSTYLE, GetWindowLong(FWd, GWL_EXSTYLE) And Not WS_EX_DLGMODALFRAME
    Me.Height = Me.Height - TitleHeigh
End Sub
chỗ màu đỏ em không hiểu anh Nghĩa ơi./-*+/
em có đặt me.caption là 1 chuỗi khác thì nó không ra. mà đặt thành ThunderDFrame thì lại chạy được
 
Lần chỉnh sửa cuối:
Upvote 0
chỗ màu đỏ em không hiểu anh Nghĩa ơi./-*+/
em có đặt me.caption là 1 chuỗi khác thì nó không ra. mà đặt thành ThunderDFrame thì lại chạy được
Nếu như tôi gọi tên của bạn mà không đúng thì bạn có trả lời hay không?

Mỗi Window (trong tập hợp Windows) có một lớp (class) liên kết với nó. Các thông tin trong class này là những gì mà nó được định nghĩa cũng như cách nó nhìn thấy và cách nó hoạt động như thế nào.

Mỗi window class của một UserForm phụ thuộc vào phiên bản Excel mà bạn đang sử dụng.

Với phiên bản 2000 trở về sau class name (tên lớp) của UserForm là "ThunderDFrame", nhưng trước đó tên của nó là "ThunderXFrame".

Riêng Caption của UserForm, bạn muốn đặt làm sao thì bạn đặt nhé! Chẳng liên quan gì đến ThunderDFrame hết đó. Nhưng bạn cần phải để nguyên câu này, không có chỉnh sửa gì hết nha:

FWd = FindWindow("ThunderDFrame", Me.Caption)
 
Lần chỉnh sửa cuối:
Upvote 0
Qua nhiều lần cải tiến và tôi nghĩ tới đây là nên chấm dứt chuyện Lịch này. Cho nên tôi đã lường hầu hết các trường hợp có thể xảy ra trên các đối tượng, các Range, các UserForm để đối tượng đó nhận ngày tháng sao cho Calendar show ra tại vị trí nơi nhận ngày tháng (có sự trợ giúp to lớn trong việc xác định vị trí của bạn doveandrose, xin cảm ơn bạn).

Nếu các bạn có xài Excel 2007 trở về sau thì nên tải về, giờ đây tôi cũng sẽ lưu file từ 2007 trở về sau mà không phải convert sang 2003 nữa.

Với phiên bản lần này, các bạn được tham khảo lập trình, cách thức add controls và cách tạo sự kiện cho các ActiveX Controls trên Sheet như TextBox, Frame, MultiPage (nguồn trong File Hướng Dẫn).

[GPECODE=vb]
Option Explicit
Private WithEvents frmTextBox1 As MSForms.TextBox
Private WithEvents frmTextBox2 As MSForms.TextBox
Private WithEvents frmTextBox3 As MSForms.TextBox
Private WithEvents mtpTextBox1 As MSForms.TextBox
Private WithEvents mtpTextBox2 As MSForms.TextBox
Private WithEvents mtpTextBox3 As MSForms.TextBox
''******************************************************************************************************
''SHEET EVENT:
''******************************************************************************************************
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 2 And Target.Row > 10 And Target.Row < 21 Then
Run "CALENDAR.xlam!CalendarExit"
Run "CALENDAR.xlam!Calendar", Target
End If
End Sub


Private Sub Worksheet_Deactivate()
EraseFrameControlEvent
End Sub
''******************************************************************************************************
''CONTROL BELONG TO SHEET EVENT:
''******************************************************************************************************
Private Sub CommandButton1_Click()
Frame.Show
End Sub

Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", TextBox1
End Sub

Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CreateFrameControlEvent
End Sub

Private Sub MultiPage1_MouseMove(ByVal Index As Long, ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CreateFrameControlEvent
End Sub
''******************************************************************************************************
''CREATE EVENT FOR SOME TEXTBOXES INTO FRAME ON SHEET EVENT:
''******************************************************************************************************
Sub CreateFrameControlEvent()
If frmTextBox1 Is Nothing Then
Set frmTextBox1 = Sheet2.Frame1.Controls("TextBox1")
Set frmTextBox2 = Sheet2.Frame1.Controls("TextBox2")
Set frmTextBox3 = Sheet2.Frame1.Controls("TextBox3")
Set mtpTextBox1 = Sheet2.MultiPage1.Pages(1).Controls("TextBox1")
Set mtpTextBox2 = Sheet2.MultiPage1.Pages(0).Controls("TextBox2")
Set mtpTextBox3 = Sheet2.MultiPage1.Pages(1).Controls("TextBox3")
End If
End Sub

Sub EraseFrameControlEvent()
Set frmTextBox1 = Nothing
Set frmTextBox2 = Nothing
Set frmTextBox3 = Nothing
Set mtpTextBox1 = Nothing
Set mtpTextBox2 = Nothing
Set mtpTextBox3 = Nothing
End Sub
''******************************************************************************************************
''CONTROL BELONG TO FRAME ON SHEET EVENT:
''******************************************************************************************************
Private Sub frmTextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", frmTextBox1
End Sub

Private Sub frmTextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", frmTextBox2
End Sub

Private Sub frmTextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", frmTextBox3
End Sub
''******************************************************************************************************
''CONTROL BELONG TO MULTIPAGE ON SHEET EVENT:
''******************************************************************************************************
Private Sub mtpTextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", mtpTextBox1
End Sub

Private Sub mtpTextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", mtpTextBox2
End Sub

Private Sub mtpTextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Run "CALENDAR.xlam!Calendar", mtpTextBox3
End Sub
''******************************************************************************************************
[/GPECODE]

Một cải tiến nữa là trên Tab Home của dải Ribbon, tôi có thêm 1 Icon mặt cười (Happy Face) để tiện cho việc show lịch.

attachment.php


Với người lập trình khi sử dụng Calendar này lại thuận tiện hơn với cấu trúc giản tiện:

Run "CALENDAR.xlam!Calendar", Range("C5")

Run "CALENDAR.xlam!Calendar", TextBox1


Quá đơn giản để nhúng lịch vào chương trình của mình phải không!

Anh Nghĩa cho em hỏi
Em muốn đưa lịch của anh vào file của em (Em đã Import các Module và Form lịch vào file rồi). Mong muốn là khi file đó chép đi đến tất cả các máy (những máy này chưa được cài addin Lich) đều có thể chạy Form Lịch của anh trên Form hoặc trên Sheet

Trong code của anh em thấy có các lệnh "Run "CALENDAR.xlam!Calendar", TextBox1" ,.... Em cũng có thử chỉnh sữa lại thành Run usfCALENDAR nhưng không được.
Rất mong được anh giúp đỡ,
Trân trọng cảm ơn
 
Upvote 0
Anh Nghĩa cho em hỏi
Em muốn đưa lịch của anh vào file của em (Em đã Import các Module và Form lịch vào file rồi). Mong muốn là khi file đó chép đi đến tất cả các máy (những máy này chưa được cài addin Lich) đều có thể chạy Form Lịch của anh trên Form hoặc trên Sheet

Trong code của anh em thấy có các lệnh "Run "CALENDAR.xlam!Calendar", TextBox1" ,.... Em cũng có thử chỉnh sữa lại thành Run usfCALENDAR nhưng không được.
Rất mong được anh giúp đỡ,
Trân trọng cảm ơn
chỗ "Run "CALENDAR.xlam!Calendar", TextBox1" tức là chạy lệnh gọi Calendar trên TexBox1 đường dẫn là "CALENDAR.xlam!Calendar" theo mình hiểu thì là vậy. bạn sửa lại thành ​Run usfCALENDAR lấy gì nó biết đường dẫn ở đâu mà chạy
 
Upvote 0
chỗ "Run "CALENDAR.xlam!Calendar", TextBox1" tức là chạy lệnh gọi Calendar trên TexBox1 đường dẫn là "CALENDAR.xlam!Calendar" theo mình hiểu thì là vậy. bạn sửa lại thành ​Run usfCALENDAR lấy gì nó biết đường dẫn ở đâu mà chạy
"Run "CALENDAR.xlam!Calendar", TextBox1" là chạy từ addin CALENDAR. Nhưng mình đã mở addin đó ra và chép các module, form vô file rồi, form lich có tên là usfCALENDAR

P/s: Trên Sheet thì mình đã chạy Macro CalShow được rồi.
Trên textbox trên Form chưa được, rất mong được sự giúp đỡ của tất cả các anh chị
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nếu như tôi gọi tên của bạn mà không đúng thì bạn có trả lời hay không?

Mỗi Window (trong tập hợp Windows) có một lớp (class) liên kết với nó. Các thông tin trong class này là những gì mà nó được định nghĩa cũng như cách nó nhìn thấy và cách nó hoạt động như thế nào.

Mỗi window class của một UserForm phụ thuộc vào phiên bản Excel mà bạn đang sử dụng.

Với phiên bản 2000 trở về sau class name (tên lớp) của UserForm là "ThunderDFrame", nhưng trước đó tên của nó là "ThunderXFrame".

Riêng Caption của UserForm, bạn muốn đặt làm sao thì bạn đặt nhé! Chẳng liên quan gì đến ThunderDFrame hết đó. Nhưng bạn cần phải để nguyên câu này, không có chỉnh sửa gì hết nha:

FWd = FindWindow("ThunderDFrame", Me.Caption)
anh Nghĩa cho em hỏi thêm. em có đọc lời dẫn của Tiện ích thì thấy có việc xác định vị trí.
vậy cho em hỏi là đoạn nào vậy anh
ví dụ dùng sự kiện

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


End Sub

để khi chọn vùng xong thả chuột ra thì userform xuất hiện ngay dưới con trỏ chuột luôn được không anh
giống như click chuột phải chuột ấy
click vào điểm khác thì userform tự đóng đi thì có được không.
 
Upvote 0
"Run "CALENDAR.xlam!Calendar", TextBox1" là chạy từ addin CALENDAR. Nhưng mình đã mở addin đó ra và chép các module, form vô file rồi, form lich có tên là usfCALENDAR

P/s: Trên Sheet thì mình đã chạy Macro CalShow được rồi.
Trên textbox trên Form chưa được, rất mong được sự giúp đỡ của tất cả các anh chị

Bạn ui, viết toàn màu đỏ nhìn kinh quá, vả lại như thế là phạm quy đó nha.

Bạn thử Calendar TextBox1 xem sao.
 
Upvote 0
"Run "CALENDAR.xlam!Calendar", TextBox1" là chạy từ addin CALENDAR. Nhưng mình đã mở addin đó ra và chép các module, form vô file rồi, form lich có tên là usfCALENDAR

P/s: Trên Sheet thì mình đã chạy Macro CalShow được rồi.
Trên textbox trên Form chưa được, rất mong được sự giúp đỡ của tất cả các anh chị
Rất mong nhận được sự giúp đỡ của các anh chị. Trân trọng
 
Upvote 0
Thế bài #31 không phải đã trả lời rồi sao? Cần gì phải Run nữa?
Cảm ơn anh, thật sự thì lúc nãy em kiểm tra thì không thấy anh trả lới ở bài #31 nên .....
Còn việc chữ màu đỏ là do em vô tình em trả lời ở bài trước đó có đoạn màu đỏ, khi gõ thêm những câu hỏi mới thì chữ cũng màu đỏ luôn mà chỉnh chỉnh màu Font lại) chứ không cố ý. Mong anh thông cảm
Để em thử Calendar TextBox1.
Trân trọng
 
Upvote 0
Bạn ui, viết toàn màu đỏ nhìn kinh quá, vả lại như thế là phạm quy đó nha.

Bạn thử Calendar TextBox1 xem sao.

Calendar TextBox1 thì đã hiện Form lịch lên rồi anh ơi, nhưng cho em em sao mà khi click chuột ra khỏi Textbox đó thì Form lịch không thoát mà nó bắt buột phải click chọn 1 ngay nào đó rồi mới thoát được ạ

Trân trọng!
 
Upvote 0
Calendar TextBox1 thì đã hiện Form lịch lên rồi anh ơi, nhưng cho em em sao mà khi click chuột ra khỏi Textbox đó thì Form lịch không thoát mà nó bắt buột phải click chọn 1 ngay nào đó rồi mới thoát được ạ

Trân trọng!
Chức năng này bạn chỉ có thể sử dụng trên sheet, trên form bạn bấm nút thoát hoặc tổ hợp phím Alt+Q.
 
Upvote 0
Vọc thử mà được ta? Ngộ vậy ta!}}}}}

Chào anh

Trước đây anh có làm giúp em đoạn code tính ngày tháng trên Form với MS Calendar, nay em muốn thay thế MS Calendar bằng Form lịch của anh nhưng không được

Em thêm đoạn code này vào để gọi Form lịch trên Textbox mà không được

[GPECODE=vb]
Private Sub TxtBatdau_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Calendar TxtBatdau
End Sub
Private Sub TxtKetthuc_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Calendar TxtKetthuc
End Sub
[/GPECODE]

File đính kèm http://www.mediafire.com/view/nv29p1b5r3zyoo1/VR2015-DUY.xlsm

Nay nhờ anh xem và giúp em, trân trọng cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh

Trước đây anh có làm giúp em đoạn code tính ngày tháng trên Form với MS Calendar, nay em muốn thay thế MS Calendar bằng Form lịch của anh nhưng không được

Em thêm đoạn code này vào để gọi Form lịch trên Textbox mà không được

[GPECODE=vb]
Private Sub TxtBatdau_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Calendar TxtBatdau
End Sub
Private Sub TxtKetthuc_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Calendar TxtKetthuc
End Sub
[/GPECODE]

File đính kèm http://www.mediafire.com/view/nv29p1b5r3zyoo1/VR2015-DUY.xlsm

Nay nhờ anh xem và giúp em, trân trọng cảm ơn
Tôi nghĩ bạn cần dùng là sự kiện MouseDown chứ nhỉ? Sao lại dùng MouseMove trong trường hợp này?
 
Upvote 0

File đính kèm

Upvote 0
Bạn chép về không đầy đủ trong các module nên Calendar không hoạt động chứ sao!

Xem file nhé!

P/s: File chưa tới nửa Mb thì upload trực tiếp lên đây luôn đi, sao phải qua trang web khác làm gì không biết nữa, bộ hết quota up file rồi hả?
Cám ơn anh nhiều, hổm nay lu bu qua chưa có test file.
Do em đã hết Quota rồi, nên không up lên GPE được
Trân trọng!
 
Upvote 0
Qua nhiều lần cải tiến và tôi nghĩ tới đây là nên chấm dứt chuyện Lịch này. Cho nên tôi đã lường hầu hết các trường hợp có thể xảy ra trên các đối tượng, các Range, các UserForm để đối tượng đó nhận ngày tháng sao cho Calendar show ra tại vị trí nơi nhận ngày tháng (có sự trợ giúp to lớn trong việc xác định vị trí của bạn doveandrose, xin cảm ơn bạn).
....................................................
Quá đơn giản để nhúng lịch vào chương trình của mình phải không!

Anh cho em hỏi trường hợp addin của anh, em xuất ra và đưa vào file của em. Khi em click chọn textbox trên Form sau đó chọn Ngày tháng (VD: chọn ngày 01/12/2016 (dd/mm/yyyy), khi chọn xong thì textbox lại hiển thị lại thành 12/01/2016 (mm/dd/yyyy).
Máy em đã định dạng trong Control Panel dạng dd/mm/yyyy
Vậy làm cách nào để mình khắc phục tình trạng trên vậy anh
 
Upvote 0
Nói chung nên theo hệ Mẽo (MM/d/yyyy), nhưng định dạng theo hệ Fáp cho dễ nhìn!

-0-/.
 
Upvote 0
Tất nhiên là còn, nhưng thêm 1 cách ta cần trả giá 1 số hiểu biết!

Theo mình thì bạn rất chi là chăm học hành trên GPE.COM

Chỉ khuyên bạn 1 điều rằng, cần chọn lọc cho vừa tầm ở thời điểm hiện tại của bạn!
 
Upvote 0
Anh cho em hỏi trường hợp addin của anh, em xuất ra và đưa vào file của em. Khi em click chọn textbox trên Form sau đó chọn Ngày tháng (VD: chọn ngày 01/12/2016 (dd/mm/yyyy), khi chọn xong thì textbox lại hiển thị lại thành 12/01/2016 (mm/dd/yyyy).Máy em đã định dạng trong Control Panel dạng dd/mm/yyyyVậy làm cách nào để mình khắc phục tình trạng trên vậy anh
Bạn chụp hình lại cái hộp thoại mà bạn định dạng kiểu ngày tại Control Panel xem sao. Chứ riêng cái Calendar nó đều chạy theo kiểu của hệ thống.
 
Upvote 0
Bạn chụp hình lại cái hộp thoại mà bạn định dạng kiểu ngày tại Control Panel xem sao. Chứ riêng cái Calendar nó đều chạy theo kiểu của hệ thống.

Anh xem giùm em đinh dang trong Control ...
Với lại khi cập nhật từ Form xuống sheet cũng bị lỗi đinh dạng dd/mm/yyyy thành mm/dd/yyyy

[IMG]http://i.imgur.com/vye63KJ.png[/IMG]
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    21.6 KB · Đọc: 50
Lần chỉnh sửa cuối:
Upvote 0
Qua nhiều lần cải tiến và tôi nghĩ tới đây là nên chấm dứt chuyện Lịch này. Cho nên tôi đã lường hầu hết các trường hợp có thể xảy ra trên các đối tượng, các Range, các UserForm để đối tượng đó nhận ngày tháng sao cho Calendar show ra tại vị trí nơi nhận ngày tháng (có sự trợ giúp to lớn trong việc xác định vị trí của bạn doveandrose, xin cảm ơn bạn).

Nếu các bạn có xài Excel 2007 trở về sau thì nên tải về, giờ đây tôi cũng sẽ lưu file từ 2007 trở về sau mà không phải convert sang 2003 nữa.

Với phiên bản lần này, các bạn được tham khảo lập trình, cách thức add controls và cách tạo sự kiện cho các ActiveX Controls trên Sheet như TextBox, Frame, MultiPage (nguồn trong File Hướng Dẫn).


Quá đơn giản để nhúng lịch vào chương trình của mình phải không!
sau khi add vào add in thì bị lỗi nhứ thế này .
chie còn cách bấm end mà thôi. bạn xem bị lỗi gì nhá
 

File đính kèm

  • calendar error1.jpg
    calendar error1.jpg
    55.3 KB · Đọc: 49
Upvote 0

Anh xem giùm em đinh dang trong Control ...
Với lại khi cập nhật từ Form xuống sheet cũng bị lỗi đinh dạng dd/mm/yyyy thành mm/dd/yyyy

Bạn thử chạy đoạn code dưới đây xem nó hiển thị trên máy của bạn như thế nào nhé:

Mã:
Sub Test()
    MsgBox Date
End Sub

Chụp hình lại cái MsgBox này nha bạn.
 
Upvote 0
Bạn thử chạy đoạn code dưới đây xem nó hiển thị trên máy của bạn như thế nào nhé:

Mã:
Sub Test()
    MsgBox Date
End Sub

Chụp hình lại cái MsgBox này nha bạn.


Capture.PNG


Trường hợp em muốn so sánh (textbox1, textbox2, CommandButton1). Với texbox1 và texbox2 là dạng ngày tháng.
Nhưng đoạn code dưới đây không thực hiện được, nhờ anh xem giúp em
[GPECODE=vba]Private Sub TextBox1_Change()
If TextBox2 > TextBox1 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub


Private Sub TextBox2_Change()
If TextBox2 > TextBox1 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub


Private Sub UserForm_Initialize()
CommandButton1.Enabled = False
End Sub
[/GPECODE]
 
Upvote 0
Trường hợp em muốn so sánh (textbox1, textbox2, CommandButton1). Với texbox1 và texbox2 là dạng ngày tháng.
Nhưng đoạn code dưới đây không thực hiện được, nhờ anh xem giúp em
[GPECODE=vba]Private Sub TextBox1_Change()
If TextBox2 > TextBox1 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub


Private Sub TextBox2_Change()
If TextBox2 > TextBox1 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub


Private Sub UserForm_Initialize()
CommandButton1.Enabled = False
End Sub
[/GPECODE]

Bạn nên làm như sau:

Mã:
Private Sub TextBox1_Change()
    On Error Resume Next
    If CDate(TextBox2) > CDate(TextBox1) Then
        CommandButton1.Enabled = True
    Else
        CommandButton1.Enabled = False
    End If
End Sub
 
 
Private Sub TextBox2_Change()
    On Error Resume Next
     If CDate(TextBox2) > CDate(TextBox1) Then
        CommandButton1.Enabled = True
    Else
        CommandButton1.Enabled = False
    End If
End Sub
P/s: Nhưng rốt cục thì máy bạn hiển thị ngày tháng trong các TextBox có đúng hay chưa?
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nên làm như sau:

Mã:
Private Sub TextBox1_Change()
    On Error Resume Next
    If CDate(TextBox2) > CDate(TextBox1) Then
        CommandButton1.Enabled = True
    Else
        CommandButton1.Enabled = False
    End If
End Sub
 
 
Private Sub TextBox2_Change()
    On Error Resume Next
     If CDate(TextBox2) > CDate(TextBox1) Then
        CommandButton1.Enabled = True
    Else
        CommandButton1.Enabled = False
    End If
End Sub
P/s: Nhưng rốt cục thì máy bạn hiển thị ngày tháng trong các TextBox có đúng hay chưa?


Em sử dụng dạng này thì mới được, với textbox1 là chọn ngày cần nhập

[GPECODE=vba]Private Sub CmdLuu_Click()
If Me.TextBox1 <> "" Or (Me!txt_SoTien = "" Or Not IsNumeric(Me!txt_SoTien)) Then
If TextBox1 = "" Then
MsgBox "Chon ngay!", , "Thong Bao"
Me.TextBox1 = "": Exit Sub
ElseIf txt_SoTien = "" Or Not IsNumeric(Me!txt_SoTien) Then
MsgBox "Ban Càn Nhap Só Tièn!", , "Thong Bao"
Me!txt_SoTien = "": Exit Sub
End If
End If
With [A2].End(xlDown).Offset(1)
.Value = Day(TextBox1.Value) & "/" & Month(TextBox1.Value) & "/" & Year(TextBox1.Value)
.Value = StringToDate(Format(TextBox1.Value, "dd/mm/yyyy"))
.Offset(, 1).Value = cbb_DonVi.Text
.Offset(, 2).Value = cbb_DGiai.Text
.Offset(, 3).Value = txt_SoTien.Value
.Offset(, 4).Value = MaDD(TextBox1.Value, cbb_DonVi.Text, cbb_DGiai.Text)
End With
Me!txt_SoTien = ""
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Em sử dụng dạng này thì mới được, với textbox1 là chọn ngày cần nhập

[GPECODE=vba]Private Sub CmdLuu_Click()
If Me.TextBox1 <> "" Or (Me!txt_SoTien = "" Or Not IsNumeric(Me!txt_SoTien)) Then
If TextBox1 = "" Then
MsgBox "Chon ngay!", , "Thong Bao"
Me.TextBox1 = "": Exit Sub
ElseIf txt_SoTien = "" Or Not IsNumeric(Me!txt_SoTien) Then
MsgBox "Ban Càn Nhap Só Tièn!", , "Thong Bao"
Me!txt_SoTien = "": Exit Sub
End If
End If
With [A2].End(xlDown).Offset(1)
.Value = Day(TextBox1.Value) & "/" & Month(TextBox1.Value) & "/" & Year(TextBox1.Value)
.Value = StringToDate(Format(TextBox1.Value, "dd/mm/yyyy"))
.Offset(, 1).Value = cbb_DonVi.Text
.Offset(, 2).Value = cbb_DGiai.Text
.Offset(, 3).Value = txt_SoTien.Value
.Offset(, 4).Value = MaDD(TextBox1.Value, cbb_DonVi.Text, cbb_DGiai.Text)
End With
Me!txt_SoTien = ""
End Sub
[/GPECODE]

Chi vậy trời? Thay vì:

Mã:
[COLOR=#ff0000].Value = Day(TextBox1.Value) & "/" & Month(TextBox1.Value) & "/" & Year(TextBox1.Value)
.Value = StringToDate(Format(TextBox1.Value, "dd/mm/yyyy"))[/COLOR]

Thì chỉ cần 1 dòng ngắn ngủi vầy thôi:

Mã:
[COLOR=#0000ff].Value = CDate(TextBox1)[/COLOR]
 
Upvote 0

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

Back
Top Bottom