Trục trặc với Selection_Change và Calendar Control

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Các bạn xem file đính kèm cũa tôi nhé:
1> khi tôi chọn vào cell C3 thì Calendar sẽ hiện ra cho phép chọn 1 ngày tháng năm nào đó
2> Khi chọn vào 1 ngày nào đó trong Calendar thì lập tức giá trị dc gán cho cell C3
3> Khi giá trị dc chọn xong hoặc click chọn 1 cell khác thì Calendar sẽ dc ẩn
Vấn đề cần hỏi ở đây là: Tại sao khi tôi chọn ngày tháng xong thì ko chọn tiếp dc trong lần thứ 2? Phải dời chuột sang 1 cell khác, sau đó quay lại chọn cell C3 thì Calendar mới xuất hiện... Bí quá tôi đành phải thêm dòng lệnh Selection.Offset(, 1).Select nhưng cãm thấy nó hơi củ chuối...
Nhờ các bạn sữa giúp xem có cách nào hay hơn ko?
Code là đây:
PHP:
Private Sub Calendar1_Click()
   Cells(3, 3).Value = Calendar1
   Selection.NumberFormat = "dd/mm/yyyy"
   Selection.Offset(, 1).Select
   Calendar1.Visible = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$C$3" Then
       Calendar1.Visible = True
    Else: Calendar1.Visible = False
    End If
End Sub
ANH TUẤN
 

File đính kèm

File bạn up lên bị lỗi rồi, mình không mở đc
 
Upvote 0
Oh, chắc phải thế thôi vì sự kiện ta bắt là sự thay đổi lựa chọn SelectionChange - nếu k có sự thay đổi lựa chọn -> sub đó k chạy

Chỉ góp ý cho ngắn gọn lại chút là như sau

PHP:
Private Sub Calendar1_Click()
   Cells(3, 3).Value = Calendar1
   Selection.NumberFormat = "dd/mm/yyyy"
   Selection.Offset(, 1).Select
   Calendar1.Visible = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$C$3" Then    Calendar1.Visible = True
End Sub
 
Upvote 0
Cái chủ yếu là tôi muốn bõ dòng Selection.Offset(, 1).Select
Phải làm sao đây?
ANH TUẤN
 
Upvote 0
Thế thì chỉ khi nào chọn ô khác thì mới mất caladar -> có thể chọn thỏa mãi bao nhiêu lần cũng được

PHP:
Private Sub Calendar1_Click()
   Cells(3, 3).Value = Calendar1
   Selection.NumberFormat = "dd/mm/yyyy"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$C$3" Then
    Calendar1.Visible = True
    Else
    Calendar1.Visible = False
    End If
End Sub

thế chắc là như ý mong muốn
 
Upvote 0
Thì đừng set visible = false trong sub calendar_click nữa là xong.
Chọn đã đời cho đúng rồi hãy chuyển qua cell khác. Trước khi chuyển thì thêm dòng lệnh
selection.activate
mới dùng bàn phím chuyển được.

Lúc đó calendar sẽ bị hide bởi worsheet_change. Nếu phát hiện sai ở C3, quay trở lại cell C3 để sửa lại cũng là bình thường vì worksheet_change lại chạy.
code sẽ là:
PHP:
Private Sub Calendar1_Click()
Cells(3, 3).Value = Calendar1
Selection.NumberFormat = "dd/mm/yyyy"
selection.activate
End Sub

À mà anhtuan có phải xài CALENDAR Control (12.0) không vậy?
Đổi lại dùng Microsoft Date & Time Picker control 6.0 hay hơn đấy:

1. Dùng Date & Time Picker control thay cho CALENDAR Control (12.0)
2. Chọn Property Linked cell là C3, check box là true
3. Sub còn ngắn hơn nữa:

Mã:
Private Sub DTPicker1_Change()
Selection.Activate
End Sub
Nếu không thấy control Date&Time Picker control 6.0 thì chép file này vào C:\windows\system32:
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
ptm0412 đã viết:
À mà anhtuan có phải xài CALENDAR Control (12.0) không vậy?
Đổi lại dùng Microsoft Date & Time Picker control 6.0 hay hơn đấy:
Ái chà... món này xem bộ ngon à nha! Đúng với cái tôi cần tìm...
Nói thật là do tôi tình cơ thấy chương trình chấm công trong cty có cái lịch này (lập trình từ nước ngoài)... Tôi nghĩ mình có thể làm gần gần giống thôi... Ko ngờ cái cũa bạn ptm0412 là y chang.. chẳng sai tí nào... He... he... Cãm ơn nhiều nhiều...
Vậy thì chả cần VBA luôn cũng Insert date dc như thường
ANH TUẤN
 
Upvote 0
Bạn ơi làm thế nào để cái lịch hiện lên vậy? Mình Ấn All + F11 sao không thấy cái Form của cái lịch đâu?
 
Upvote 0
NHG đã viết:
Bạn ơi làm thế nào để cái lịch hiện lên vậy? Mình Ấn All + F11 sao không thấy cái Form của cái lịch đâu?
Tại Worksheet, bạn chọn Menu View / Toolbars và chọn Control Toolbox
Sau đó sẽ hiện Menu Control Toolbox, bạn chọn button More Controls (Hình chiếc cờ-lê và cái búa chéo nhau) tìm và chọn Celendar Control để vẽ lên Worksheet

TDN
 
Upvote 0
Anh Tuấn ơi, cái này của anh rất hay, trong trường hợp em muốn nó chuyển xuống bất cứ cell nào thì em chỉ chỉnh sửa tại $c$3 thôi phải ko? ngoài ra có sửa chỗ nào trong code nữa ko? vì em làm thử nhưng ko hiện nên lịch như của anh. Mong anh chỉ dẫn. Tks
 
Upvote 0
Uh... nếu muốn dời sang nơi khác thì chỉnh lại ngay chổ $C$3 và 1 chổ nữa: Cells(3, 3).....
Tuy nhiên, đễ tiện cho việc tùy biến, em nên làm như sau:
1> Đầu tiên em đặt name cho cell nào em muốn add ngày tháng vào... Giã sử trong file cũa em, cell em muốn chèn ngày tháng là F10, vậy em chọn cell F10 và đặt name là Clls
2> Sữa code trên thành cái này nhé:
PHP:
Private Sub Calendar1_Click()
   Range("Clls") = Calendar1
   Range("Clls").NumberFormat = "dd/mm/yyyy"
   Range("Clls").Offset(, 1).Select
   Calendar1.Visible = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Range("Clls"), Target) Is Nothing Then
       Calendar1.Visible = True
    Else: Calendar1.Visible = False
    End If
End Sub
Code này cho vào Sheet nhé! Nó có 1 điểm lợi là em có thể nắm kéo cell ấy đi bất kỳ nơi đâu code cũng ko chạy sai... Cái này em đã từng làm trong bài toán cộng dồn ấy, nhớ ko?
Lưu ý thêm 1 chuyện nữa khi xây dựng file: Vì trong này dùng SelectionChange nên tốt nhất nên đặt name trước, tiếp theo là vẽ Calendar, cuối cùng mới tạo code.. Nếu ko sẽ bị trục trặc khiến em giật mình đấy... Hi... hi..
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
Em xem file này, không những đổi C3 thành cell khác thậm chí DTPicker còn chạy theo. (Trong cột C thôi). À mà phải có Mscomct2.ocx đã nhe.

To anhtuan:
Vẫn còn offset(,1) à?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đúng rồi... Dùng cái cũa anh ptm0412 theo anh là ngon nhất... Với món đó, nếu em vẫn có thể dùng bình thường dc mà ko cần đến tí code nào.. Rất dễ (tìm hiểu nó trong Properties)
---------------------------
Ah.... ah... nhưng anh ptm ơi... hình như giá trị add vào cell nó là text.. chết thât! Làm sao đây?
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
Bậy nà, Xem kỹ file chưa bậu? Dùng hàm ngày tháng thử cho cell đó xem!
Lý do là do linked cell. mà Linked cell với object cùng loại dữ liệu là chắc.
 
Upvote 0
ptm0412 đã viết:
Bậy nà, Xem kỹ file chưa bậu? Dùng hàm ngày tháng thử cho cell đó xem!
Lý do là do linked cell. mà Linked cell với object cùng loại dữ liệu là chắc.
Xem rồi đại ca ơi... Giờ thế này nhé, đại ca thử add khoảng 4 cell, sau đó SUM chúng lại là biết liền... Dùng hàm ngày tháng, hoặc công trừ cho kết quã đúng vẫn chưa thể khẳng định dử liệu là Number đâu nha! Nó chính xác là TEXT, nhìn nó canh lề trái cũng đũ biết... Như thế thì trong 1 số trường hợp cụ thể sẽ gây rắc rối đấy đại ca à...
Nếu như tôi chỉ add vào mỗi 1 cell thôi thì tôi có thể dùng công thức đễ chuyễn cell ấy thành DATE thật sự... đàng này đại ca add cho nguyên cã 1 cột, vậy phải làm cách nào sữa code lại thôi..
ANH TUẤN
 
Upvote 0
Cái bạn cần là ngày tháng, đúng không?
Ngày tháng để làm gì nếu không dùng hàm ngày tháng? Hàm Ngảy tháng gồm day(), month(), year(), edate(), datedif(), eomonth(), cộng trừ ngày, đều được. Còn chỗ cụ thể nào có thể rắc rối?
Ngày tháng trong cơ sở dữ liệu dùng để làm gì mà lại Sum?
Dù sao thì cũng có thể sửa code được, bạn làm dùm đi.
 
Upvote 0
Mừng năm mới, mọi sự tốt đẹp, mình làm cho tốt luôn:

PHP:
Private Sub DTPicker1_Change()
Range(ActiveCell.Address).NumberFormat = "dd/mm/yy"
x = Year(DTPicker1.Value)
y = Month(DTPicker1.Value)
z = Day(DTPicker1.Value)
Range(ActiveCell.Address).Value2 = DateSerial(x, y, z)
Selection.Activate
End Sub

bỏ luôn câu gán linkedcell của sub dưới.

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 3 Then
With Sheet1.DTPicker1
.Visible = True
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Width = ActiveCell.Width
.Height = ActiveCell.Height
End With
Else
If DTPicker1.Visible = True Then
DTPicker1.Visible = False
End If
End If
End Sub

Chúc mừng năm mới!
 
Lần chỉnh sửa cuối:
Upvote 0
Cãm ơn anh PTM... nói chung là cũng học thêm dc 1 chiêu mới... Nhưng nói thật, nếu lở phải xài cái Calendar cũa anh thì tôi thà xài "chay" ko dùng code gì cã có lẽ hay hơn...
Tôi dùng công thức tuy ko thể biến TEXT thành NUMBER nhưng vẫn có thể add date tuần tự hết cell này đến cell khác 1 cách dễ dàng... đó là dùng name động...
Giống như file đính kèm:
ANH TUẤN
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom