Tạo nút bấm chọn lịch trong vba excel

Liên hệ QC

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

  • Calendar_Example.xls
    27.5 KB · Đọc: 1,789
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")
 
Web KT
Back
Top Bottom