[Nhờ Giúp Đỡ] Ẩn Sheet bằng VBA

Liên hệ QC

M@trixs

Thành viên thường trực
Tham gia
3/3/11
Bài viết
257
Được thích
336
Mình có 1 file excel (đính kèm) đã được tạo TAB Menu là [Quan Ly Du An]. Trong đó mình muốn click vào nút tương ứng với Sheet nào thì Sheet đó sẽ được mở, còn lại thì ẩn tất cả các Sheet còn lại.

Mong các bạn giúp giùm. Chân thành cảm ơn !!!
 

File đính kèm

  • Menu.rar
    121.9 KB · Đọc: 286
Mình có 1 file excel (đính kèm) đã được tạo TAB Menu là [Quan Ly Du An]. Trong đó mình muốn click vào nút tương ứng với Sheet nào thì Sheet đó sẽ được mở, còn lại thì ẩn tất cả các Sheet còn lại.

Mong các bạn giúp giùm. Chân thành cảm ơn !!!

Hiện tại thì nút "Hop Dong Ky Ket" mở sheet "BieuDo", và nút "Huong Dan/Tro Giup" mở sheet "HoSo", tức không đúng. Còn mọi nút còn lại đều mở đúng sheet rồi. Vậy bạn còn muốn gì? Nếu muốn sửa 2 nút nói trên thì làm tương tự như các nút còn lại. Tức nút "Hop Dong Ky Ket" gán cho onAction = "HopDong" để mở sheet "HopDong" và nút "Huong Dan/Tro Giup" gán cho onAction = "HuongDan" để mở sheet "HuongDan"

Tức trong XML sửa 2 chỗ thành

Mã:
<button id="TTPL_BT_2" label="Hop Dong Ky Ket" imageMso="ReviewTrackChanges" size="large" screentip="Quan ly toan bo hop dong lien quan den du an, vi du: Tu van thiet ke, Tham tra, Lap thau, Xay dung, Thiet bi...." onAction="HopDong" />
...
<button id="HD_BT_1" label="Huong Dan/Tro Giup" image="help" size="large" screentip="Toan bo ho so, giay to lien quan den vong doi cua du an deu duoc tap trung xu ly tai day." onAction="HuongDan" />

Thế thôi.
 
Upvote 0
Hiện tại thì nút "Hop Dong Ky Ket" mở sheet "BieuDo", và nút "Huong Dan/Tro Giup" mở sheet "HoSo", tức không đúng. Còn mọi nút còn lại đều mở đúng sheet rồi. Vậy bạn còn muốn gì? Nếu muốn sửa 2 nút nói trên thì làm tương tự như các nút còn lại. Tức nút "Hop Dong Ky Ket" gán cho onAction = "HopDong" để mở sheet "HopDong" và nút "Huong Dan/Tro Giup" gán cho onAction = "HuongDan" để mở sheet "HuongDan"

Tức trong XML sửa 2 chỗ thành

Mã:
<button id="TTPL_BT_2" label="Hop Dong Ky Ket" imageMso="ReviewTrackChanges" size="large" screentip="Quan ly toan bo hop dong lien quan den du an, vi du: Tu van thiet ke, Tham tra, Lap thau, Xay dung, Thiet bi...." onAction="HopDong" />
...
<button id="HD_BT_1" label="Huong Dan/Tro Giup" image="help" size="large" screentip="Toan bo ho so, giay to lien quan den vong doi cua du an deu duoc tap trung xu ly tai day." onAction="HuongDan" />

Thế thôi.

Đã hiểu ra vấn đề là tại do xử lý XML toàn là chữ không nên bị "ngu chữ", nhìn chẳng ra. Thế nhưng M@trixs chỉ sửa được có Sheet [HuongDan] còn Sheet [HopDong] sao sửa mãi vẫn không được.

Thêm cái này nữa. Bạn có thể giúp mình viết lại code cho nó gọn lại được không. Kiểu như mình hiểu vầy nè:
- Khi click vào 1 nút nào đó nó sẽ tương ứng với 1 Sheet, lấy cái tên Sheet đó để giữ cho nó hiện, còn lại thì cho ẩn toàn bộ lun, không cần gọi tên từng sheet rồi đặt thuộc tính ẩn. Vì là nếu sau này mình thêm vào khoảng 20 Sheet nữa mà cứ gọi tên rồi đặt Hide-UnHide kiểu này thì có mà loạn cả lên với lại file cũng nặng nữa.

Mong các bạn giúp mình thêm tí nữa vậy. Cám ơn thật nhiều nhé !!
 
Upvote 0
Đã hiểu ra vấn đề là tại do xử lý XML toàn là chữ không nên bị "ngu chữ", nhìn chẳng ra. Thế nhưng M@trixs chỉ sửa được có Sheet [HuongDan] còn Sheet [HopDong] sao sửa mãi vẫn không được.

Thêm cái này nữa. Bạn có thể giúp mình viết lại code cho nó gọn lại được không. Kiểu như mình hiểu vầy nè:
- Khi click vào 1 nút nào đó nó sẽ tương ứng với 1 Sheet, lấy cái tên Sheet đó để giữ cho nó hiện, còn lại thì cho ẩn toàn bộ lun, không cần gọi tên từng sheet rồi đặt thuộc tính ẩn. Vì là nếu sau này mình thêm vào khoảng 20 Sheet nữa mà cứ gọi tên rồi đặt Hide-UnHide kiểu này thì có mà loạn cả lên với lại file cũng nặng nữa.

Mong các bạn giúp mình thêm tí nữa vậy. Cám ơn thật nhiều nhé !!

Vì muốn cho gọn nên ngay từ đầu tôi đã nói với bạn là chỉ cần 1 onAction và gán cho mỗi button. Bằng cách nào?
Giả sử button để mở sheet "HopDong". Thế thì ta gán cho nó id = "HopDong", và onAction = ButtonClick. Tương tự button để mở sheet "HuongDan" ta gán cho id = "HuongDan" và onAction = ButtonClick. Tương tự cho các nút khác. Tóm lại button để mở sheet "xyz" thì ta gán cho id = "xyz". Như vậy thì trong Sub ButtonClick chỉ cần đọc ra id là biết tên sheet cần mở, đúng không? Nhưng sau khi mở sheet đó rồi thì ta phải đóng sheet mà trước đó được mở. Sheet cần đóng xác định như thế nào? Ta dùng currSheetName để lưu tên sheet hiện hành, đang mở. Vậy thì khi mở tập tin ta phải xác định currSheetName rồi cứ mỗi lần nhấn button thì trong ButtonClick ta thay đổi currSheetName.
-----------
XML
Mã:
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RibbonLoad">
  <ribbon>
    <tabs>
      <tab id="NewTab" label="Quan Ly Du An">
        <group id="Nhom1" label="Gioi Thieu Chuong Trinh">
          <labelControl id="GTCT_LB_1" getLabel="Tenchuongtrinh" />
          <labelControl id="GTCT_LB_2" getLabel="Tacgia" />
          <labelControl id="GTCT_LB_3" getLabel="Lienhe" />
        </group>
        <group id="Nhom2" label="Quan Ly Chung">

          <button id="ThongTinDuAn" label="Thong Tin Du An" imageMso="BlogHomePage" size="large" screentip="Quan ly tong quan cac thong tin cua du an" supertip="Bao gom TMDT, dia diem, cac don vi lien quan..." onAction="ButtonClick" />

          <button id="BieuDo" label="Bieu Do" imageMso="ChartInsert" size="large" screentip="Quan ly truc quan cac thong tin du an thong qua bieu do" onAction="ButtonClick" />

          <button id="TienDo" label="Tien Do" imageMso="ChartTypeOtherInsertGallery" size="large" screentip="Quan ly tien do du an" onAction="ButtonClick" />

        </group>
        <group id="Nhom3" label="Thu Tuc Plap Ly">

          <button id="HoSo" label="Ho So Phap Ly" imageMso="TranslationToolTip" size="large" screentip="Toan bo ho so, giay to lien quan den vong doi cua du an deu duoc tap trung xu ly tai day." onAction="ButtonClick" />

          <button id="HopDong" label="Hop Dong Ky Ket" imageMso="ReviewTrackChanges" size="large" screentip="Quan ly toan bo hop dong lien quan den du an, vi du: Tu van thiet ke, Tham tra, Lap thau, Xay dung, Thiet bi...." onAction="ButtonClick" />

        </group>
        <group id="Nhom4" label="Thanh/Quyet toan">

          <button id="GiaiNgan" label="Giai Ngan" image="tien" size="large" screentip="Toan bo ho so, giay to lien quan den vong doi cua du an deu duoc tap trung xu ly tai day." onAction="ButtonClick" />

        </group>
        <group id="Nhom5" label="Tien Ich">

          <button id="TraCuuVanBan" label="Tra Cuu Van Ban" imageMso="FunctionsLookupReferenceInsertGallery" size="large" screentip="Tong hop cac Quyet Dinh, Nghi Dinh, Thong Tu..." onAction="ButtonClick" />

          <button id="PhanLoaiDuAn" label="Phan Loai Du An" imageMso="FunctionsTextInsertGallery" size="large" screentip="Cac du an nhom A, nhom B, nhom C." onAction="ButtonClick" />

          <button id="HinhThucDauThau" label="Hinh Thuc Dau Thau" imageMso="FunctionsRecentlyUsedtInsertGallery" size="large" screentip="Tim hieu cac hinh thuc dau thau: Chi dinh thau, dau thau rong rai, chao hang canh tranh..." onAction="ButtonClick" />

          <button id="HinhThucHopDong" label="Hinh Thuc Hop Dong" imageMso="FunctionsFinancialInsertGallery" size="large" screentip="Tim hieu ve cac hinh thuc hop dong." onAction="ButtonClick" />

          <button id="QuyDinhThoiGian" label="Quy Dinh Thoi Gian" imageMso="FunctionsDateTimeInsertGallery" size="large" screentip="Cac khoang thoi gian trong vong doi du an" onAction="ButtonClick" />

        </group>
        <group id="Nhom6" label="Huong Dan">

          <button id="HuongDan" label="Huong Dan/Tro Giup" image="help" size="large" screentip="Toan bo ho so, giay to lien quan den vong doi cua du an deu duoc tap trung xu ly tai day." onAction="ButtonClick" />

        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Module
Mã:
Private rb As IRibbonUI
Private currSheetName As String

Sub CheckBox4_Click()
If Columns("F:J").EntireColumn.Hidden = True Then Columns("F:J").EntireColumn.Hidden = False Else Columns("F:J").EntireColumn.Hidden = True
End Sub

Sub LocHopDong()
Dim i As Long
Dim sArr(), dArr()
sArr = Sheets("Ho So").Range("B5:B" & Sheets("Ho So").[B65536].End(xlUp).Row).Resize(, 9).Value
ReDim dArr(1 To UBound(sArr), 1 To 18)
For i = 1 To UBound(sArr)
    If sArr(i, 1) = ActiveSheet.Name Then
        k = k + 1
        dArr(k, 1) = k
        dArr(k, 2) = sArr(i, 5)
        dArr(k, 3) = sArr(i, 2)
        dArr(k, 5) = sArr(i, 3)
        dArr(k, 8) = sArr(i, 6)
        dArr(k, 9) = sArr(i, 4)
    End If
Next
[A5:R1000].ClearContents
If k Then [A5].Resize(k, 18) = dArr
End Sub

'## Gioi Thieu ##
'################

' Ten chuong trinh
Sub Tenchuongtrinh(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "Ten chuong trinh: Quan Ly Du An"
End Sub
' Ten Tac gia
Sub Tacgia(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "Tac gia: Nguyen Manh Tuan"
End Sub
' Lien he
Sub Lienhe(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "Lien he: ksnguyenmanhtuan@gmail.com"
End Sub
'## Ket Thuc Gioi Thieu ##
'#########################

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
Dim sh As Worksheet
    Set rb = ribbon
    For Each sh In Sheets
        If sh.Visible = -1 Then
            currSheetName = sh.Name
            Exit For
        End If
    Next sh
End Sub

Sub ButtonClick(control As IRibbonControl)
    If currSheetName <> control.ID Then
        Sheets(control.ID).Visible = -1
        Sheets(currSheetName).Visible = 0
        currSheetName = control.ID
    End If
End Sub
----------------


Về sau bạn có thể thêm 1000 sheet và 1000 button để mở theo nguyên tắc: button để mở sheet "xyz" thì ta gán cho id = "xyz". code không cần thêm gì cả vì thực ra bạn chỉ cần thao tác với 2 sheet: mở sheet có control.id và đóng sheet currSheetName. Các sheet còn lại thì vốn dĩ vẫn đang đóng mà.
 

File đính kèm

  • Menu.rar
    118.2 KB · Đọc: 312
Lần chỉnh sửa cuối:
Upvote 0
XML
Mã:
...................
' Ten chuong trinh
Sub Tenchuongtrinh(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "Ten chuong trinh: Quan Ly Du An"
End Sub
' Ten Tac gia
Sub Tacgia(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "[COLOR=#ff0000][B]Tac gia: Nguyen Manh Tuan[/B][/COLOR]"
End Sub
....................
----------------


Về sau bạn có thể thêm 1000 sheet và 1000 button để mở theo nguyên tắc: button để mở sheet "xyz" thì ta gán cho id = "xyz". code không cần thêm gì cả vì thực ra bạn chỉ cần thao tác với 2 sheet: mở sheet có control.id và đóng sheet currSheetName. Các sheet còn lại thì vốn dĩ vẫn đang đóng mà.
Làm tất tần tật từ A đến Z thế này thì cái chổ màu đỏ kia chắc phải ghi là thành SIWTOM quá _)()(-
 
Upvote 0
Thật là cảm ơn bạn @SiwTom quá, biển học vô bờ thật.

Tiếp thu ý kiến của bạn @ndu96081631 và có ý từ trước nên mình sẽ để tên những bạn đã giúp mình vào trong chú thích của code. Sau này mình làm trong phần Hướng Dẫn sẽ để tên các bạn đã giúp mình vào luôn, có cả tên bạn nữa và @SiwTom cùng một vài anh em trên giaiphapexcel.

Thậtt ra mình cũng chỉ có ý tưởng thôi, không có các bạn thì mình chẳng làm gì được. Chân thành cảm ơn !!!
 
Upvote 0
Thật là cảm ơn bạn @SiwTom quá, biển học vô bờ thật.

Tiếp thu ý kiến của bạn @ndu96081631 và có ý từ trước nên mình sẽ để tên những bạn đã giúp mình vào trong chú thích của code. Sau này mình làm trong phần Hướng Dẫn sẽ để tên các bạn đã giúp mình vào luôn, có cả tên bạn nữa và @SiwTom cùng một vài anh em trên giaiphapexcel.

Thật ra mình cũng chỉ có ý tưởng thôi, không có các bạn thì mình chẳng làm gì được. Chân thành cảm ơn !!!
Mình chỉ nói thế thôi chứ biết dù anh siwtom đã giúp bạn gần như toàn bộ nhưng anh ấy sẽ chẳng cần bạn "GHI TÊN" gì đó đâu
Còn mình thì bạn khỏi quan tâm đi (mình có giúp cóc khô gì mà ghi)
Ẹc... ẹc...
 
Upvote 0
Có cách nào để mình thiết lập khi mở file lên thì sẽ tự động chọn Tab [Quan Ly Du An] luôn không nhỉ. Kiểu như set làm mặc định luôn hiện Tab [Quan Ly Du An] trước tiên không ạ ??? Vì bây giờ khi mở lên thì Excel toàn chọn Tab [Home] làm mặc định !!!

Mong mọi người lại giúp M@trixs tiếp với !!!
 
Upvote 0
Có cách nào để mình thiết lập khi mở file lên thì sẽ tự động chọn Tab [Quan Ly Du An] luôn không nhỉ. Kiểu như set làm mặc định luôn hiện Tab [Quan Ly Du An] trước tiên không ạ ??? Vì bây giờ khi mở lên thì Excel toàn chọn Tab [Home] làm mặc định !!!

Mong mọi người lại giúp M@trixs tiếp với !!!

Để làm một cách đẹp nhất thì phải thao tác với Ribbon: tìm các "con" - tab của nó và chọn. Tôi biết chắc chắn làm được, vd. dùng hàm API AccessibleChildren, thao tác với interface IAccessible
Vì tôi chưa cần nên chưa bao giờ dùng cách ở trên. Nếu bạn muốn thì tự tìm đọc trên mạng về AccessibleChildren và interface IAccessible.

Tôi chỉ cho bạn cách "củ chuối". Trước tiên vài lời về "nguyên tắc trong Windows"
Bạn hãy mở notepad rồi nhấn Alt (trái). Bạn sẽ thấy trên menu thì "F" được gạch chân trong menu File, "E" được gạch chân trong menu "Edit" v...v Nếu tiếp theo bạn nhấn "e" thì menu "Edit" được mở, và nếu bạn nhấn tiếp Enter thì menu Edit được đóng. Nhưng nếu khi "Edit" đang mở mà bạn nhấn phím mũi tên xuống cho ới mục vd. Paste rồi mới Enter thì menu Paste được chọn (thực thi. Ngoài lề một chút thì trong Windows bạn có thể chỉ dùng bàn phím để: mở My computer, desktop, các thư mục, di chuyển tới các thư mục hay tập tin trên desktop hay thư mục để mở chúng, mở các chương trình và làm việc: viết văn bản, nhập dữ liệu, tính toán. Bởi ngoài các phím tắt ra thì ta có thể mở menu bất kỳ, di chuyển tới mục bất kỳ đrồi Enter để chọn. Tất cả chỉ cần sử dụng các phím (ngoài các phím thông dụng như Run, lá cờ Windows ...): Alt, Tab, 4 phím mũi tên, Enter.

Trong Excel hoàn toàn tương tự. Bạn nhấn Alt thì thấy "H" xuất hiên ở thẻ "Home", "N" ở thẻ "Insert" v...v
Nếu nhấn tiếp "n" thì thẻ "Insert" được chọn.

Ta lợi dụng nguyên tắc trên và dùng SendKeys để gửi các phím nhấn.

Các bước:

1. Ta gán cho thẻ "Quan Ly Du An" ký tự Q (Q được "gạch chân"). Để làm điều này trong XML bạn thay

Mã:
<tab id="NewTab" label="Quan Ly Du An">

bằng

Mã:
<tab id="NewTab" label="[B][COLOR=#ff0000]&amp;[/COLOR][/B]Quan Ly Du An">

Để đề phòng thì tôi miêu tả cho bạn: Trước ký tự Q (nếu cần ký tự khác thì trước ký tự đó) là chuỗi - "&", "amp" và ";" - tất nhiên viết liền và không có các dấu nháy kép.

2. Ta thay đổi sub RibbonLoad thành

Mã:
Sub RibbonLoad(ribbon As IRibbonUI)
Dim sh As Worksheet
    Set rb = ribbon
    For Each sh In Sheets
        If sh.Visible = -1 Then
            currSheetName = sh.Name
            Exit For
        End If
    Next sh

    [B][COLOR=#ff0000]SendKeys "%q~"[/COLOR][/B]
End Sub

Chỗ đỏ đỏ là mới thêm vào.
 
Lần chỉnh sửa cuối:
Upvote 0
@SiwTom: Công nhận bái phục bạn, kiến thức rộng thật, biết biến cái không thành có chỉ nhờ vận dụng tý logic + cái có sẵn. Công nhận bạn hay, bài nào M@trixs cũng phải cảm ơn bạn thật lòng hết. Cái HotKey này nhiều khi cũng quên béng nó đi thật, vậy mà bạn vẫn nhớ và vận dụng đơn giản ghê...Giải thích thì cặn kẽ, GPE có những người như bạn thì Newbie có đất sống rồi....
 
Upvote 0
Chào các bác!
Sau khi đọc xong topic này, em cũng mầy mò tạo được cái menu tab giống như file "Menu" mà bác SiwTom đã hướng dẫn và up ở trang 1.
Em có 1 thắc mắc muốn hỏi các cao thủ là đối với file đã tạo menu ẩn sheet như thế, khi muốn link dữ liệu giữa các sheet với nhau (Vi dụ khi tổng hợp khối lượng từ các sheet khối lượng phụ), click vào các button để chọn sheet khác để lấy dữ liệu thì ko chuyển sheet được giống như cách làm thông thường khi các sheet hiển thị tất cả ở thanh Tab phía dưới theo mặc định của Excel.
Các bác có cách khắc phục nào ko thì giúp em với!
Thanks all!
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện tại thì nút "Hop Dong Ky Ket" mở sheet "BieuDo", và nút "Huong Dan/Tro Giup" mở sheet "HoSo", tức không đúng. Còn mọi nút còn lại đều mở đúng sheet rồi. Vậy bạn còn muốn gì? Nếu muốn sửa 2 nút nói trên thì làm tương tự như các nút còn lại. Tức nút "Hop Dong Ky Ket" gán cho onAction = "HopDong" để mở sheet "HopDong" và nút "Huong Dan/Tro Giup" gán cho onAction = "HuongDan" để mở sheet "HuongDan"

Tức trong XML sửa 2 chỗ thành

Mã:
<button id="TTPL_BT_2" label="Hop Dong Ky Ket" imageMso="ReviewTrackChanges" size="large" screentip="Quan ly toan bo hop dong lien quan den du an, vi du: Tu van thiet ke, Tham tra, Lap thau, Xay dung, Thiet bi...." onAction="HopDong" />
...
<button id="HD_BT_1" label="Huong Dan/Tro Giup" image="help" size="large" screentip="Toan bo ho so, giay to lien quan den vong doi cua du an deu duoc tap trung xu ly tai day." onAction="HuongDan" />

Thế thôi.
Bác cho mình hỏi file XML để chỗ nào, sao mình tìm hoài không thấy ?
 
Upvote 0
Web KT

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

Back
Top Bottom