Giúp tạo Checkbox cho việc cập nhật số liệu

  • Thread starter Thread starter hungpmu
  • Ngày gửi Ngày gửi
Liên hệ QC

hungpmu

Thành viên mới
Tham gia
14/4/10
Bài viết
13
Được thích
0
Tôi có 1 tình huống muốn nhờ mọi người giúp đỡ. Tôi có 1 file có nhiều Sheet 1,2,3,4....để cập nhật dự liệu cho từng công việc khác nhau.
Tôi dự tính sẽ làm Sheet 1 là Danh mục để làm mục lục cho các Sheet còn lại và ở trên Sheet 1 này sẽ có tên từng sheet kia và bên cạnh có 1 cái Checkbox để khi mình tích vào tên sheet nào thì sheet đó sẽ mở ra bên cạnh sheet 1 (khi không tich vào thì nó sẽ hide đi). Làm thế se đỡ mất công phải tìm từng sheet.
Vấn đề là tôi không biết phải làm như thế nào. Mong mọi người giúp đỡ giải quyết vấn đề này giúp tôi
Cảm ơn sự giúp đõ của mọi người
 
Tôi có 1 tình huống muốn nhờ mọi người giúp đỡ. Tôi có 1 file có nhiều Sheet 1,2,3,4....để cập nhật dự liệu cho từng công việc khác nhau.
Tôi dự tính sẽ làm Sheet 1 là Danh mục để làm mục lục cho các Sheet còn lại và ở trên Sheet 1 này sẽ có tên từng sheet kia và bên cạnh có 1 cái Checkbox để khi mình tích vào tên sheet nào thì sheet đó sẽ mở ra bên cạnh sheet 1 (khi không tich vào thì nó sẽ hide đi). Làm thế se đỡ mất công phải tìm từng sheet.
Vấn đề là tôi không biết phải làm như thế nào. Mong mọi người giúp đỡ giải quyết vấn đề này giúp tôi
Cảm ơn sự giúp đõ của mọi người
Bạn xem bài này:
http://www.giaiphapexcel.com/forum/showthread.php?37055-Tạo-nút-nhấn-để-link-đến-các-sheet
Tuy không giống lắm với yêu cầu của bạn nhưng tôi nghĩ nó xài được đấy
 
Upvote 0
Tôi có 1 tình huống muốn nhờ mọi người giúp đỡ. Tôi có 1 file có nhiều Sheet 1,2,3,4....để cập nhật dự liệu cho từng công việc khác nhau.
Tôi dự tính sẽ làm Sheet 1 là Danh mục để làm mục lục cho các Sheet còn lại và ở trên Sheet 1 này sẽ có tên từng sheet kia và bên cạnh có 1 cái Checkbox để khi mình tích vào tên sheet nào thì sheet đó sẽ mở ra bên cạnh sheet 1 (khi không tich vào thì nó sẽ hide đi). Làm thế se đỡ mất công phải tìm từng sheet.
Vấn đề là tôi không biết phải làm như thế nào. Mong mọi người giúp đỡ giải quyết vấn đề này giúp tôi
Cảm ơn sự giúp đõ của mọi người
Bạn tạo một Macro như sau:
PHP:
Sub RefreshList()
    Dim i As Byte
    Sheet1.ListBox1.Clear
    For i = 2 To ThisWorkbook.Sheets.Count
        Sheet1.ListBox1.AddItem Sheets(i).Name
        Sheet1.ListBox1.Selected(i - 2) = Sheets(i).Visible
    Next
End Sub
Hoặc cẩn thận hơn (để phòng trường hợp Sheet1 không phaie là Sheet đầu tiên của Workbook) thì bạn sử dụng Macro này:
PHP:
Sub RefreshList()
    Dim Sh As Worksheet
    Sheet1.ListBox1.Clear
    For Each Sh In ThisWorkbook.Sheets
        If Sh.Name <> Sheet1.Name Then
            With Sheet1
                .ListBox1.AddItem Sh.Name
                .ListBox1.Selected(.ListBox1.ListCount - 1) = Sh.Visible
            End With
        End If
    Next Sh
End Sub
Tiếp tục, trong code của Sheet1, bạn sử dụng 2 thủ tục:
PHP:
Private Sub Worksheet_Activate()
    RefreshList
End Sub
(mục đích là mỗi lần Sheet1 được chọn, danh sách lại được làm mới)

PHP:
Private Sub ListBox1_Change()
    Sheets(ListBox1.List(ListBox1.ListIndex)).Visible = ListBox1.Selected(ListBox1.ListIndex)
End Sub
để ẩn/hiện Sheet được chọn trong danh sách.
Thêm nữa, trong code của ThisWorkbook, bạn tạo thủ tục sau để mỗi lần mở Workbook, danh sách được làm mới:
PHP:
Private Sub Workbook_Open()
    RefreshList
End Sub
 

File đính kèm

Upvote 0
Cảm ơn mọi người đã giúp đỡ
@nghiaphuc: tôi đã xem vi dụ của bạn nhưng thú thật là tôi không làm như thế được vì tôi hoàn toàn mù tịt về VBA. Hôm trước tôi có tìm thấy bài này
http://www.giaiphapexcel.com/forum/showthread.php?17687-Xin-code-menu-ẩn-hiện-sheet-bằng-checkbox
và làm theo ví dụ của của Rollover79 và sử dụng được, tuy nhiên khi làm việc với file khoảng 40 sheet thì việc khai báo bắt đầu nhầm lẫn và rất mất thời gian.
Quan ví dụ của Nghiaphuc tôi thấy đơn gian quá nhưng không tài nào làm theo được. Bạn có thể chỉ rõ hơn cho tôi được không? cảm ơn nhiều
 
Upvote 0
Cảm ơn mọi người đã giúp đỡ
@nghiaphuc: tôi đã xem vi dụ của bạn nhưng thú thật là tôi không làm như thế được vì tôi hoàn toàn mù tịt về VBA. Hôm trước tôi có tìm thấy bài này
http://www.giaiphapexcel.com/forum/showthread.php?17687-Xin-code-menu-%E1%BA%A9n-hi%E1%BB%87n-sheet-b%E1%BA%B1ng-checkbox
và làm theo ví dụ của của Rollover79 và sử dụng được, tuy nhiên khi làm việc với file khoảng 40 sheet thì việc khai báo bắt đầu nhầm lẫn và rất mất thời gian.
Quan ví dụ của Nghiaphuc tôi thấy đơn gian quá nhưng không tài nào làm theo được. Bạn có thể chỉ rõ hơn cho tôi được không? cảm ơn nhiều
Giả sử bạn có một Workbook mới, chưa có code gì cả. Bạn làm những bước sau:
1. Trên Sheet1, bạn nháy chuột phải trên thanh công cụ bất kỳ phía trên, chọn Control Toolbox, nhấn nút Listbox trên thanh công cụ vừa bật và vẽ lên Sheet. Listbox này sẽ có tên là Listbox1.
2. Nhấn Alt+F11 để mở cửa sổ Visual Basic và nháy chuột phải tại cửa sổ Project (phía trên, bên trái), chọn Insert\Module. Sau đó dán Sub RefreshList vào.
3. Cũng trong cửa sổ Project, bạn nháy đúp chuột vào Sheet1 (tìm anh chàng nào có tên là Sheet1 ở bên ngoài, còn ở trong dấu ngoặc thì không nhất thiết phải là "Sheet1" mà có thể khác, ví dụ như "Mục lục" chẳng hạn) và dán vào 2 sub: Worksheet_Activate và Listbox1_Change.
4. Tương tự bước 3, bạn dán sub Workbook_Open vào ThisWorkbook.
Như vậy là OK.
Còn như bạn nói "tôi hoàn toàn mù tịt về VBA" thì chỉ có cách là học mới biết được bạn ạ. Mình cũng chỉ bắt đầu với VBA từ con số 0, chẳng qua trường lớp chính quy nào cả. Có thắc mắc gì, bạn cứ mạnh dạn hỏi, đừng ngại, chẳng ai tự mình biết mọi thứ cả. Trên GPE có vô số người sẵn sàng giúp bạn.
Chúc thành công!
 
Upvote 0
Tôi không làm thế nào để đưa các checkbox vào Listbox được , nó toàn bị mất đi. Làm sao để tạo Listbox trong đó có các checkbox như của bạn vậy? giúp tôi với.
 
Upvote 0
Tôi không làm thế nào để đưa các checkbox vào Listbox được , nó toàn bị mất đi. Làm sao để tạo Listbox trong đó có các checkbox như của bạn vậy? giúp tôi với.
Bạn nhấn nút Design mode (phía trên bên trái) trên thanh công cụ Control Toolbox, sau đó nhấn nút Properties bên cạnh.
Tiếp theo, bạn chọn Listbox1 và chọn thuộc tính ListStyle (trên hộp Properties) là 1-fmListStyleOption.
 
Upvote 0
Thủ tục thì đúng như bạn đã hướng dẫn đây là hình ảnh lúc chưa tắt Design Mode:

còn nhìn thấy ô Check box 3.
Sau khi tắt Design Mode

Thế là như thế nào? bạn có thể nói rõ hơn giúp tôi không?

Uploaded with ImageShack.us
 
Upvote 0
Thủ tục thì đúng như bạn đã hướng dẫn đây là hình ảnh lúc chưa tắt Design Mode:

còn nhìn thấy ô Check box 3.
Sau khi tắt Design Mode

Thế là như thế nào? bạn có thể nói rõ hơn giúp tôi không?

Uploaded with ImageShack.us
Ấy chết, bạn hiểu sai rồi. Những vị trí đặt dấu tick mà bạn nhìn thấy trên Listbox1 là của bản thân Listbox1 (quy định bởi thuộc tính ListStyle) chứ không phải là bạn vẽ thêm Checkbox vào đó đâu. Bạn làm đúng như hướng dẫn ở trên nhé (đừng vẽ Checkbox vào đây làm gì cả).
Thêm nữa, để có thể chọn nhiều giá trị trong Listbox1, bạn chọn thuộc tính MultiSelect của nó là 1-fmMultiSelectMulti nhé.
 
Upvote 0
Được rồi tôi đã làm được tuy nhiên tôi chỉ làm được khi áp dụng vào 1 file mới khởi tạo chứ đối với 1 file có sẵn của tôi ( có nhiều sheet bao gồm tên sheet và số liệu) thì toàn báo lỗi ở mục Modun
Chả hiểu thế nào nữa. Sẵn đây cho tôi hỏi là muốn tạo 1 check box có nội dung là mở hết các sheet thì có được không?
camr ơn bạn đã giúp đỡ
 
Upvote 0
Được rồi tôi đã làm được tuy nhiên tôi chỉ làm được khi áp dụng vào 1 file mới khởi tạo chứ đối với 1 file có sẵn của tôi ( có nhiều sheet bao gồm tên sheet và số liệu) thì toàn báo lỗi ở mục Modun
Chả hiểu thế nào nữa. Sẵn đây cho tôi hỏi là muốn tạo 1 check box có nội dung là mở hết các sheet thì có được không?
camr ơn bạn đã giúp đỡ
- Câu hỏi 1: Mình nghĩ lý do là bạn đặt Listbox1 không đúng tại Sheet1 mà ở Sheet khác. Cần nói thêm: Trong VBA, mỗi Sheet có 2 loại tên, hay đúng hơn là 2 thuộc tính về tên: Loại thứ nhất là Name, đây là tên mà bạn nhìn thấy trong Excel, tên này có thể là "Mục lục" hay "Báo cáo",... và do người dùng đặt trong Excel (nháy đúp vào tên Sheet và đổi tên). Loại thứ hai là CodeName, đây là tên sử dụng trong khi viết Code, nếu để tự động, tên của chúng sẽ là Sheet1, Sheet2,.... Nếu bạn để ý, tại cửa sổ Project, mỗi Sheet có 2 tên, ví dụ: Sheet1 (Home), trong đó Sheet1 là CodeName, "Home" là Name. Như vậy, cách sửa lỗi cho trường hợp của bạn là: Bạn nhấn Alt+F11, nhìn trong cửa sổ Project xem Sheet mà bạn đặt Listbox1 có CodeName là gì và trong toàn bộ code, bạn đổi Sheet1 thành CodeName mà bạn nhìn thấy. Nếu vẫn không được thì tốt nhất là bạn gửi file lên (nếu vì vấn đề riêng tư thì bạn có thể xóa toàn bộ nội dung trong Sheet vì điều này không quan trọng trong bài toán của chúng ta)
- Câu hỏi 2: Mình đã thử thêm một tuỳ chọn là "All Sheets", tuy nhiên chưa ưng ý, có vẻ nó chạy chưa ổn, để mình nghiên cứu thêm đã. Hy vọng sớm có câu trả lời cho bạn.
 
Upvote 0
Ban giup minh vụ nay nhé vì mình phai tổng hợp nhiều dự án quá mà lại không đủ kiến thức để giải quyết hết được. Cảm ơn bạn nhiều
 

File đính kèm

Upvote 0
Sau một hồi mày mò với gợi ý của Nghiaphuc về việc Name code va Name thi tôi đã làm được tuy nhiên có việc nữa là tôi không muốn cái Check box của "Main chính" hiện ra. Nếu hó hiện ra mà lại click vào thì sẽ báo lỗi hoặc mất luôn cái Sheet đó do vậy tôi không muốn hiện ra cái đó thì phải làm sao?

còn nữa khi save vào thì nó luôn báo

Vậy phải làm sao giải quyết đây. Mong mọi người chỉ giúp.
PS; Nghiaphuc: bạn giup tôi xem lại cái mục sub "đề phòng sheet của list box không ở đầu tiên" cua Modun toàn báo lỗi.
Cảm ơn sự giúp đỡ của mọi người
 
Upvote 0
Sau một hồi mày mò với gợi ý của Nghiaphuc về việc Name code va Name thi tôi đã làm được tuy nhiên có việc nữa là tôi không muốn cái Check box của "Main chính" hiện ra. Nếu hó hiện ra mà lại click vào thì sẽ báo lỗi hoặc mất luôn cái Sheet đó do vậy tôi không muốn hiện ra cái đó thì phải làm sao?

còn nữa khi save vào thì nó luôn báo...

Vậy phải làm sao giải quyết đây. Mong mọi người chỉ giúp.
PS; Nghiaphuc: bạn giup tôi xem lại cái mục sub "đề phòng sheet của list box không ở đầu tiên" cua Modun toàn báo lỗi.
Cảm ơn sự giúp đỡ của mọi người
1. Để không có tên Sheet chính (trong file của bạn là Sheet1 (Bang chinh)), bạn sử dụng sub RefreshList phía sau (ở bài trước). Chú ý là trong sub này có câu lệnh:
PHP:
If Sh.Name <> Sheet1.Name Then...
Câu lệnh này sẽ kiểm tra, nếu sheet nào có tên khác tên của Sheet1 (là "Bang chinh") thì mới thêm vào Listbox1.
2. Mình không dùng Excel 2007 (để mở file của bạn, mình đã phải convert sang Excel 2003 mới đọc được) nhưng khi save, excel luôn báo lỗi đó, hình như là do định dạng khi bạn lưu file (file của bạn là .xlsx), bạn phải chọn định dạng cho phép lưu và chạy Macro (Chọn *.xlsm trong mục Save as type của hộp thoại Save as) mới được.
3. Mình đã sửa file của bạn (mình lưu ở định dạng Excel 2003 do máy mình không có Excel 2007), thêm tùy chọn "Xem hết". Dù chưa ổn lẳm nhưng phần nào đáp ứng được yêu cầu của bạn. Bạn tham khảo trong file đính kèm nhé.
 

File đính kèm

Upvote 0
Cảm ơn Nghiaphuc nhiều. Qua đây tôi đã học được rất nhiều kinh nghiệm phục vụ cho bản thân, cảm ơn GPE.
 
Upvote 0
Web KT

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

Back
Top Bottom