Tạo nút bấm chọn lịch trong vba excel (1 người xem)

Liên hệ QC

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

vietngoc1985

Thành viên mới
Tham gia
25/1/08
Bài viết
21
Được thích
1
Chào các anh chị,
Em là Ngọc, em muốn tạo 1 nút bấm để hiện lên lịch để cho mình chọn giá trị ngày tháng năm của lịch đó.
/-*+/Em tìm nhiều trang web mà không thấy nói về vấn đề này.
Mong các anh chị giúp đỡ ạ.

Cám ơn rất nhiều
Vngoc
 
Chào các anh chị,
Em là Ngọc, em muốn tạo 1 nút bấm để hiện lên lịch để cho mình chọn giá trị ngày tháng năm của lịch đó.
/-*+/Em tìm nhiều trang web mà không thấy nói về vấn đề này.
Mong các anh chị giúp đỡ ạ.

Cám ơn rất nhiều
Vngoc
Bạn không nói rõ tạo lịch xong rồi làm gì nữa nên cũng chẳng biết viết code thế nào cả
Còn như tạo chỉ để... ngó chơi thì dùng code này:
PHP:
Sub MakeCalendar()
  With ActiveSheet.OLEObjects.Add("MSCAL.Calendar.7")
    .Left = ActiveCell.Left: .Top = ActiveCell.Top
    .Width = 268: .Height = 164
    .Visible = False: .Visible = True
  End With
End Sub
 
cám ơn anh ndu

Cụ thể là như vầy nè

Em có 1 userform, trong userform đó có 1 textbox để nhập ngày tháng năm, tuy nhiên em gặp 1 vấn đề là khi nhập cái ngày tháng năm phải nhập tháng trước ngày sau thì nó mới hiểu, còn không nó hiểu khác.
Cho nên em muốn tạo 1 nút bấm để gọi lên 1 tấm lịch, và chọn giá trị trong lịch để add vào textbox này, thay vì gõ vào.

Em có tìm thấy 1 bài trên mạng như sau nhưng nó chỉ add vào activecell, không add vào textbox trong userform của em.
Em bật mí là chả bít gì về vba cả.

Thiết kế lịch


Trở lại cửa sổ Microsoft Visual Basic, bạn nhấn vào dòng VBAProject (PERSONAL.XLS) rồi vào menu Insert\UserForm để thêm vào một Form. Bạn thiết lập thuộc tính Name của Form là frmCalendar.


Kế tiếp, bạn thêm điều khiển Microsoft ActiveX Calendar Control vào Toolbox. Bạn vào menu Tools\Additional Controls > trong cửa sổ Additional Controls, đánh dấu kiểm ở mục Calendar Control 8.0 (đối với Excel 97 và 2000) hoặc Calendar Control 10.0 (đối với Excel 2002) > nhấn OK (hình 4).




Hình 4


Điều khiển Microsoft ActiveX Calendar Control thường được cài đặt cùng với Excel. Nếu chưa có điều khiển này thì bạn cần dùng bộ cài đặt Office để thêm vào, hoặc tải file mscal.ocx rồi chép vào thư mục System (đối với Windows 95, 98, ME) hoặc System32 (đối với Windows NT, 2000, XP), sau đó thực hiện lệnh “regsvr32 mscal.ocx” từ menu Run của Windows (hình 5).




Hình 5


Từ Toolbox, bạn thêm điều khiển Calendar vào Form (hình 6). Trong cửa sổ thuộc tính của điều khiển Calendar, bạn nhấn vào Custom để chỉnh sửa các giá trị theo ý mình.




Hình 6


Bước kế tiếp là viết code cho sự kiện Click của điều khiển Calendar. Sau khi người dùng chọn ngày tháng, thì ngày tháng đó sẽ thêm vào cell hiện thời và Form sẽ được đóng lại. Bạn viết code như sau:


Private Sub Calendar1_Click()
ActiveCell.Value = Calendar1.Value
Unload Me
End Sub


Khi mở Form, nếu cell hiện thời có chứa ngày tháng thì lịch sẽ hiện ngày tháng trong cell, nếu không thì lịch sẽ hiện ngày tháng hiện tại. Đoạn code của sự kiện Initiliaze như sau:


Private Sub UserForm_Initialize()
If IsDate(ActiveCell.Value) Then
Calendar1.Value = DateValue(ActiveCell.Value)
Else
Calendar1.Value = Date
End If
End Sub


Bạn cũng cần viết code để gọi hiển thị cuốn lịch từ Excel. Nếu bạn đã tạo file Personal.xls, thì trong cửa sổ Project - VBA Project đã có Module1. Nếu không có thì bạn phải vào menu Insert\Module để thêm vào Module1. Trong phần code của Module1, bạn xóa hết những gì có sẵn trong đó và viết code như sau:


Sub OpenCalendar()
frmCalendar.Show
End Sub


Bạn chọn menu File\Save PERSONAL.XLS (hoặc nhấn Ctrl-S) để lưu lại, hoàn thành các bước tạo cuốn lịch.
 
Thì thay đoạn ActiveCell.Value = Calendar1.Value thành TextBox1.Text= Calendar1.Value thôi
Mà đã xài Calendar rồi thì lấy nó tính toán luôn, mắc gì phải cho vào TextBox để làm giống gì
 
Thì thay đoạn ActiveCell.Value = Calendar1.Value thành Userform.TextBox1.Text= Calendar1.Value thôi
Mà đã xài Calendar rồi thì lấy nó tính toán luôn, mắc gì phải cho vào TextBox để làm giống gì

Cám ơn bác, em làm được rồi.
Em cũng muốn lấy calendar làm tính toán luôn nhưng em mù VBA cũng như mấy cái userform. Cũng như muốn nó hiển thị trên userform
Em không biết lấy gì thay cho cái textbox cả . Ý của bác là em nên thay textbox bằng cái label chăng.

Em hết quota rồi nên ko biết tải lên thế nào để bác xem rõ hơn.
 
Lần chỉnh sửa cuối:
Hình nó thế này nè bác ndu.

Em vẫn chưa biết làm sao để nó hiển thị dd/mm/yyyy nữa
Làm kiểu vầy đây:
PHP:
Public iDate As Long
Private Sub Calendar1_Click()
  iDate = Calendar1.Value
  TextBox1.Text = Format(iDate, "dd/mm/yyyy")
  Calendar1.Visible = False
End Sub
PHP:
Private Sub CommandButton1_Click()
  Calendar1.Visible = True
End Sub
PHP:
Private Sub UserForm_Initialize()
  Calendar1.Visible = False
End Sub
Lúc ta click vào Calendar thì sẽ gán value của nó vào biến iData (biến này được khai báo dạng Public, nằm ở đầu code)... Còn textbox chỉ để hiển thị chơi cho vui thôi... Lúc tính toán sẽ dựa vào biến iDate
Xem file
 

File đính kèm

cám ơn bác ndu, em làm được rùi, em dựa trên hướng dẫn của bác để làm.

Em còn một thắc mắc nữa xin bác giúp luôn cho.

Em mún đảm bảo dữ liệu khi nhập vào textbox Số lượng, đơn giá, thành tiền, vat trong userform ở trên í luôn là dữ liệu số, nếu nhập dữ liệu chữ thì báo lỗi.
bác giúp em luôn nhé.

Thanks bác
Vngoc
 
cám ơn bác ndu, em làm được rùi, em dựa trên hướng dẫn của bác để làm.

Em còn một thắc mắc nữa xin bác giúp luôn cho.

Em mún đảm bảo dữ liệu khi nhập vào textbox Số lượng, đơn giá, thành tiền, vat trong userform ở trên í luôn là dữ liệu số, nếu nhập dữ liệu chữ thì báo lỗi.
bác giúp em luôn nhé.

Thanks bác
Vngoc
Dùng hàm IsNumeric để kiểm tra
Ví dụ:
IsNumeric(TextBox1.Text) ---> Nếu kết quả = TRUE thì giá trị trong TextBox1 đúng là Number
 
Cám ơn anh

Nhưng éo le 1 tí là nó phải chấp nhận giá trị "" (trống)

anh giúp em lun nhé
trời... thì IF và OR 1 cái chứ có gì đâu nà
ví dụ:
PHP:
If TextBox2.Text = "" Or IsNumeric(TextBox2.Text) Then
  MsgBox "chap nhap"
Else
  MsgBox "Gia tri này khong duoc nha cha noi"
End If
Nghĩ thế nào viết thế nấy thôi ---> Ngôn ngữ VB nó "thoáng" thế mà
 
Anh ndu

Em đã giải quyết được vấn đề ""

Cám ơn anh nhiều.
Em còn một vấn đề duy nhất, nhưng chắc phải attached anh mới giúp được

Vấn đề của em là:
Em có 1 sheet Quản lý chi phí bao gồm các cột
STT NGÀY TÊN CHI PHI PHÁT SINH SỐ LƯỢNG ĐƠN GIÁ THÀNH TIỀN VAT TỔNG TIỀN
Em muốn lọc các dữ liệu trên theo tháng/năm sang 1 sheet khác cũng có các cột trên.
Em nghĩ vấn đề này đã post nhìu trên diễn đàn, nhưng em chưa làm được vì họ đặt nhìu biến quá.

Anh có code nào lọc đơn giản hơn không ạ. Dùng excel thì em làm được, nhưng vì file quản lý chi phí cập nhật cho nhiều năm liền, nên em kéo công thức xuống tận dòng 65536...thì mỗi lần cập nhật chi phí..nó.....load phê luôn.

Anh có email không, em gửi file cho anh dễ hiểu.
Anh vào link này down thử xem nhé
http://www.mediafire.com/?2vjvvcxvxwngx2m
 
Lần chỉnh sửa cuối:
Vấn đề của em là:
Em có 1 sheet Quản lý chi phí bao gồm các cột
STT NGÀY TÊN CHI PHI PHÁT SINH SỐ LƯỢNG ĐƠN GIÁ THÀNH TIỀN VAT TỔNG TIỀN
Em muốn lọc các dữ liệu trên theo tháng/năm sang 1 sheet khác cũng có các cột trên.
Em nghĩ vấn đề này đã post nhìu trên diễn đàn, nhưng em chưa làm được vì họ đặt nhìu biến quá.
Đã xem file của bạn, trong sheet CHIPHI chỉ có đúng 1 dòng dữ liệu thì làm cái gì hả bạn?
 
Lần chỉnh sửa cuối:
Em không rõ ý anh lắm,
Anh dùng file mới này nhé. Em đã copy đến ngày 31/12/2011-=.,,
http://www.mediafire.com/?l4yjrjvat2t5to5

Em muốn lọc từ Sheet CHIPHI sang sheet thống kê chi phí theo tháng mình chọn.
Dùng AutoFilter
- Tại sheet CHIPHI, định dạng cột NGÀY theo dạng m/yyyy
- AutoFilter cột này theo điều kiện đã chọn tại sheet Thong ke chi phi, cụ thể điều kiện sẽ là [E3] & "/" & [E4]
Nói ngắn gọn, hy vọng bạn hiểu
Ngoài ra cũng có thể dùng PivotTable mà chẳng cần code hay công thức gì cả
 
Dùng AutoFilter
- Tại sheet CHIPHI, định dạng cột NGÀY theo dạng m/yyyy
- AutoFilter cột này theo điều kiện đã chọn tại sheet Thong ke chi phi, cụ thể điều kiện sẽ là [E3] & "/" & [E4]
Nói ngắn gọn, hy vọng bạn hiểu
Ngoài ra cũng có thể dùng PivotTable mà chẳng cần code hay công thức gì cả

-\\/.He he, xin lỗi anh. Em bó tay rồi. Lọc ko ra
Em không chắc là cái autofilter này có tự động cập nhật khi em thay đổi dữ liệu ở ô E3 và ô E4 hay không.
Chứ mỗi lần thay đổi mà phải làm lại thao tac autofilter thì ko ổn lắm, vì người xử dụng ko bít gì về excel đâu ạ.
Anh giúp cho chót ạ, he he.

Sau khi hoàn thành xong em dự định sẽ protect sheet, không bít có ảnh hưởng gì đến autofilter không ạ.
 
Lần chỉnh sửa cuối:
-\\/.He he, xin lỗi anh. Em bó tay rồi. Lọc ko ra
Em không chắc là cái autofilter này có tự động cập nhật khi em thay đổi dữ liệu ở ô E3 và ô E4 hay không.
Chứ mỗi lần thay đổi mà phải làm lại thao tac autofilter thì ko ổn lắm, vì người xử dụng ko bít gì về excel đâu ạ.
Anh giúp cho chót ạ, he he.

Sau khi hoàn thành xong em dự định sẽ protect sheet, không bít có ảnh hưởng gì đến autofilter không ạ.
Mấy dạng bài này làm hoài đâm... chán phèo...
Thôi bạn tự mình record macro đi sẽ biết liền (record macro quá trình AutoFilter)
 
Cám ơn bác Ndu

Em làm được rồi.
http://www.mediafire.com/?7tyvyh5nxag4oqb

Record macro này hay thật đấy.
Em còn một số vấn đề nữa về protect. Nhưng công việc bận quá chắc tuần sau mới post được.
Cám ơn bác đã giúp đỡ em rất nhiều. Mặc dù bác bít em mù VBA.
Em sẽ còn gặp bác vào tuần sau. Chúc bác cuối tuần vui vẻ.
 
Mình có một bảng tính mà có các sheet được đặt tên theo ngày ví dụ như sheet 28/9, 30/9... mình muốn tạo 1 form có cuốn lịch hoặc DTpicker để khi chọn ngày trên lịch thì sẽ copy một sheet mẩu và đặt lại tên là ngày đã chọn thì phải làm sao có bạn nào biết không giúp mình với, mình đã làm nhưng luôn bị báo lỗi đặt tên không biết là sao nữa. Cảm ơn trước nha!
 
Mình có một bảng tính mà có các sheet được đặt tên theo ngày ví dụ như sheet 28/9, 30/9... mình muốn tạo 1 form có cuốn lịch hoặc DTpicker để khi chọn ngày trên lịch thì sẽ copy một sheet mẩu và đặt lại tên là ngày đã chọn thì phải làm sao có bạn nào biết không giúp mình với, mình đã làm nhưng luôn bị báo lỗi đặt tên không biết là sao nữa. Cảm ơn trước nha!
Nếu bạn muốn đặt tên sheet là 28/9, 30/9,... thì không được là phải rồi, vì trong tên sheet không được sử dụng dấu "/". Thay vì đặt tên như vậy thì bạn đặt tên sheet có dạng 28.9, 30.9,... là được. Cụ thể, giả sử trên Form có 1 cuốn lịch tên là Calendar1, khi đó, bạn thay câu lệnh đặt tên sheet:
PHP:
ActiveSheet.Name=Calendar1
bởi câu lệnh sau:
PHP:
ActiveSheet.Name=Text(Calendar1,"dd.MM.yy")
 
Bạn không nói rõ tạo lịch xong rồi làm gì nữa nên cũng chẳng biết viết code thế nào cả
Còn như tạo chỉ để... ngó chơi thì dùng code này:
PHP:
Sub MakeCalendar()
  With ActiveSheet.OLEObjects.Add("MSCAL.Calendar.7")
    .Left = ActiveCell.Left: .Top = ActiveCell.Top
    .Width = 268: .Height = 164
    .Visible = False: .Visible = True
  End With
End Sub
Hi anh
Em có userform mak giờ e muốn tạo lịch, mak trên toolbox không có cho add calenda
Vậy làm sao để cho hiển thị được calenda lên ạ
Thanks Anh
 
Hi anh
Em có userform mak giờ e muốn tạo lịch, mak trên toolbox không có cho add calenda
Vậy làm sao để cho hiển thị được calenda lên ạ
Thanks Anh
Nếu bạn đang cài office 32 bit thì hiện tại chỉ có thể cài DTPicker để có lịch (bằng cách download file mscomct2.ocx về máy tính rồi đăng ký)
Hiện tại office 2013 trở đi đã không còn hổ trợ Calendar (MSCAL.OCX) nên chỉ có cách dùng DTPicter (mscomct2.ocx). Tuy nhiên nếu dùng office 64 bit thì không thể cài được bất cứ lịch nào được
 
Vâng ạ
Em đang cài office 2010, nhưng nếu bộ office 64bit thì bó tay hả...
Vậy phải cài lại bộ 32bit mới sử dụng đc ạ
Thanks Anh
 
Hi anh
Em có userform mak giờ e muốn tạo lịch, mak trên toolbox không có cho add calenda
Vậy làm sao để cho hiển thị được calenda lên ạ
Thanks Anh
Bạn có thể dùng lich tự tạo bằng user form nhé, dùng cho bất kì office nào
Vâng ạ
Em đang cài office 2010, nhưng nếu bộ office 64bit thì bó tay hả...
Vậy phải cài lại bộ 32bit mới sử dụng đc ạ
Thanks Anh
Trong trường hợp này thì bạn nên dùng lịch tự tạo (lịch tạo bằng userform control). Bạn tìm kiếm trên mạng sẽ có 1 số người chia sẻ.
 
Em tìm hoài mak không thấy ạ
Em cũng không biết làm sao hết....
vì trên toolsbox không cho add calenda,,,
Hỗ trợ giúp em ca này ạ
Thanks ANh
 
vâng ạ
em đọc rồi, nhưng không hiểu ạ, cái đoạn code này là copy vào trong chỗ nào ạ,,,
 
Private Sub btnSAVE_Click()
Dim EndR As Long
With Sheets("DATA")
EndR = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & EndR + 1) = txta..........
End With
Unload Me
End Sub
\chỗ dấu chấm á,,, sao nó không cho em chọn text ạ.
 
vâng ạ
em đọc rồi, nhưng không hiểu ạ, cái đoạn code này là copy vào trong chỗ nào ạ,,,
Em tải file của họ về chạy thử chưa? của họ là click vào những ô định dạng ngày sẽ xuất hiện form calendar. Để dùng cho trường hợp của em thì phải tùy biến thêm, tức là khi nhập ngày em gọi form đó lên và chọn ngày sau đó gán vào dữ liệu của em
 
Mình có file này tiện nhập ngày sinh của học sinh đầu năm học nè, tham khảo cho vui lúc rỗi nha.
 

File đính kèm

Có cao nhân nào nhận dạy vba online và viết code theo yêu cầu ko ạ. Em đang cần học mà ko có thời gian đi đến trung tâm. Liên hệ em 0946269217
 

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

Back
Top Bottom