Tạo mục lục tự động trong excel?

Liên hệ QC

LikeIt

Thành viên tiêu biểu
Tham gia
16/6/06
Bài viết
415
Được thích
254
Nghề nghiệp
Others
Kính gửi các anh chị,
Em đọc trên một báo nào đó (thực sự ko nhớ) có nói về một VD trong excel là tạo mục lục tự động trong một sheet, để di chuyển các sheet trong bảng tính cho dễ dàng, nhưng khi thực hiện theo chỉ dẫn thì ko đc, ko biết em hiểu có đúng ko? vì em nghĩ khi tạo đc mục lục tự động thì khi thêm hoặc bỏ tên một sheet nào trong file này thì nó sẽ hiện lên trên sheet MUCLUC? mong các anh chị biết về VBA chỉ giúp. Em xin post VD của em làm và nội dung bài báo đã sưu tầm.tks - NHT
Tạo mục lục các Sheet trong Excel 2003


Đây là một thủ thuật mà mình đánh giá là...4 sao cho tính tiện dụng...

Vấn đề:
Khi làm việc với một tập tin Excel (Worbook) có nhiều worksheet (bảng tính), các bạn sẽ gặp nhiều khó khăn khi di chuyển giữa các bảng tính này.

Giải pháp:
Chúng ta sẽ tạo ra một Sheet mới với tên là MụcLục. Sau đó thêm một đoạn code vào Sheet này để tạo mục lục tự động.
{ad_200x200_right}
Các bước thực hiện:
1. Trở về Sheet đầu tiên. Vào Insert > Worksheet. Đặt tên của Sheet này lại thành MụcLục hay để nguyên tùy thích.
2. Right-click lên thẻ của Sheet này chọn View Code.
3. Copy tất cả đoạn Code này vào:
PHP:
Private Sub Worksheet_Activate() 
Dim wSheet As Worksheet 
Dim M As Long 
M = 1 
    With Me 
        .Columns(1).ClearContents 
        .Cells(1, 1) = "INDEX" 
        .Cells(1, 1).Name = "Index" 
    End With 
    
    For Each wSheet In Worksheets 
        If wSheet.Name <> Me.Name Then 
        M = M + 1 
        With wSheet 
            .Range("H1").Name = "Start" & wSheet.Index 
            .Hyperlinks.Add Anchor:=.Range("H1"), Address:="", SubAddress:="Index", TextToDisplay:="Back to Index" 
        End With 
            Me.Hyperlinks.Add Anchor:=Me.Cells(M, 1), Address:="", SubAddress:="Start" & wSheet.Index, TextToDisplay:=wSheet.Name 
        End If 
        Next wSheet 
End Sub
4. Nhấn Alt + Q và Save lại.
5. Từ Excel, vào Tool > Macro > Security. Trong hộp thoại này, chọn mức Low. Vì trong file Excel của bạn có dùng Macro, nên đôi khi mức Macro security ở mức high, đoạn lệnh của bạn sẽ không có tác dụng. Nếu bạn chọn Mediup, bạn sẽ được nhắc là chạy macro không. Trong trường hợp này, bạn chọn Enable Macro để thấy tác dụng.
5. Nhấn Ctrl + W để đóng lại Workbook và mở lại Workbook này.
Đến đây, khi nhấp vào Sheet có tên là MụcLục, bạn sẽ thấy danh sách các bảng tính hiện ra. Nhấp vào Sheet nào mà bạn muốn di chuyển nhanh đến để làm việc....
 

File đính kèm

  • Mucluc.rar
    4.8 KB · Đọc: 4,806
Chỉnh sửa lần cuối bởi điều hành viên:
anhtuan1066 cho mình hỏi cái
Tại sao khi mình Define name như bạn mà lại không được vậy.
1. Không hiện ra ten sheet
2. Không hiện Hypelink

Bạn có thể chỉ cho mình cụ thể không
tks
 
Upvote 0
File này sao không thấy code đâu nhỉ.
Còn cái code này:
PHP Code:

Private Sub Worksheet_Activate()
Dim wSheet As Worksheet
Dim M As Long
M = 1
With Me
.Columns(1).ClearContents
.Cells(1, 1) = "INDEX"
.Cells(1, 1).Name = "Index"
End With

For Each wSheet In Worksheets
If wSheet.Name <> Me.Name Then
M = M + 1
With wSheet
.Range("H1").Name = "Start" & wSheet.Index
.Hyperlinks.Add Anchor:=.Range("H1"), Address:="", SubAddress:="Index", TextToDisplay:="Back to Index"
End With
Me.Hyperlinks.Add Anchor:=Me.Cells(M, 1), Address:="", SubAddress:="Start" & wSheet.Index, TextToDisplay:=wSheet.Name
End If
Next wSheet
End Sub
Sao nó chạy rất chậm. khi back lại index.
Có cách nào cho nó chạy nhanh hơn được không các pac ơi.
 
Upvote 0
Bạn thử cái này xem (sửa lại cho gọn và dễ xem).

PHP:
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim sh As Worksheet, n As Long
n = 1
    With Me
        .Columns(1).ClearContents
        .[a1] = "INDEX"
        .[a1].Name = "Index"
    End With
    For Each sh In Worksheets
        If sh.Name <> Me.Name Then
            n = n + 1
            With sh
                .[a1].Name = "Start" & sh.Index
                .Hyperlinks.Add .[a1], "", "Index"
            End With
            Me.Hyperlinks.Add Me.Cells(n, 1), "", "Start" & sh.Index, sh.Name
        End If
    Next
End Sub
 

File đính kèm

  • MucLuc.rar
    10.5 KB · Đọc: 283
Upvote 0
Bạn thử cái này xem (sửa lại cho gọn và dễ xem).

PHP:
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim sh As Worksheet, n As Long
n = 1
    With Me
        .Columns(1).ClearContents
        .[a1] = "INDEX"
        .[a1].Name = "Index"
    End With
    For Each sh In Worksheets
        If sh.Name <> Me.Name Then
            n = n + 1
            With sh
                .[a1].Name = "Start" & sh.Index
                .Hyperlinks.Add .[a1], "", "Index"
            End With
            Me.Hyperlinks.Add Me.Cells(n, 1), "", "Start" & sh.Index, sh.Name
        End If
    Next
End Sub
Nhân tiện nghiên cứu về Hyperlink, em có code này hơi bị độc đáo đây: Add Hyperlink cho tất cả các sheet mà không cần đến vòng lập nào
Chúng ta thực hiện như sau:
1> Tạo 1 file gồm nhiều sheet, trong đó có 1 sheet tên là Index (bắt buộc)
2> Chèn code này vào 1 Module
PHP:
Function GetSh()
  Dim Temp()
  ActiveWorkbook.Names.Add String(240, "z"), "=SUBSTITUTE(GET.WORKBOOK(1),""[""&GET.WORKBOOK(16)&""]"","""")"
  Temp = Evaluate("Transpose(" & String(240, "z") & ")")
  Temp = WorksheetFunction.Transpose(Temp)
  ActiveWorkbook.Names(String(240, "z")).Delete
  GetSh = Temp
End Function
PHP:
Sub Auto_Open()
  Sheets("Index").Activate
  Range("A2:A1000").Clear
  ActiveWorkbook.Names.Add "Link", "=INDIRECT(""'""&INDIRECT(""A""&CELL(""Row""))&""'!A1"")"
  Range("A1").Resize(Sheets.Count).Value = WorksheetFunction.Transpose(GetSh)
  Range("A1").Hyperlinks.Add Range("A1"), "", "Index!A1"
  Sheets.FillAcrossSheets Range("A1")
  With Range([A2], [A65536].End(xlUp))
    .Hyperlinks.Add .Cells, "", "Link"
  End With
End Sub
3> Đóng file lại rồi mở lần nữa ---> Hyperlink sẽ tự động add
4> Trong quá trình làm việc, nếu có nhu cầu thêm sheet, xóa sheet, cứ chạy code Auto_Open để cập nhật
 

File đính kèm

  • MucLuc.xls
    77.5 KB · Đọc: 348
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử cái này xem (sửa lại cho gọn và dễ xem).

PHP:
Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim sh As Worksheet, n As Long
n = 1
    With Me
        .Columns(1).ClearContents
        .[a1] = "INDEX"
        .[a1].Name = "Index"
    End With
    For Each sh In Worksheets
        If sh.Name <> Me.Name Then
            n = n + 1
            With sh
                .[a1].Name = "Start" & sh.Index
                .Hyperlinks.Add .[a1], "", "Index"
            End With
            Me.Hyperlinks.Add Me.Cells(n, 1), "", "Start" & sh.Index, sh.Name
        End If
    Next
End Sub


Bác ơi, em làm copy code của bác thì ok luôn. Nhưng mà có 1 vấn đề là index đều là Start.... Em muốn trên index có tên sheet thì làm thế nào bác? Bác giúp em với ạ
Tks bác
 
Upvote 0
Bác ơi, em làm copy code của bác thì ok luôn. Nhưng mà có 1 vấn đề là index đều là Start.... Em muốn trên index có tên sheet thì làm thế nào bác? Bác giúp em với ạ
Tks bác
Thì bạn thay sh.index thành sh.name là được.
 
Upvote 0
Bác ơi, em làm copy code của bác thì ok luôn. Nhưng mà có 1 vấn đề là index đều là Start.... Em muốn trên index có tên sheet thì làm thế nào bác? Bác giúp em với ạ
Tks bác

Bạn dùng thử Code này xem.
Chú ý: Tên Sheet không được chứa dấu cách, dấu ngoặc và các ký tự đặc biệt

PHP:
Private Sub Worksheet_Activate()
With Me
    .Columns(1).Clear
    .[a1].Name = "Index"
    For Each sh In Worksheets
        If sh.Name <> Me.Name Then sh.Hyperlinks.Add sh.[a1], "", "Index"
        .[a65536].End(3)(2) = sh.Name
        .[a65536].End(3).Select
        .Hyperlinks.Add Selection, "", sh.Name & "!A1", sh.Name
        Selection.Font.Underline = 1
    Next
End With
End Sub
 

File đính kèm

  • Muc luc_Sheet.rar
    12.6 KB · Đọc: 249
Lần chỉnh sửa cuối:
Upvote 0
Tạo mục lục trên excel

Mình đang muốn tạo một mục lục ứng dụng trên Excel với tiện ích là: Bấm vào nút lựa chọn đó để lấy kết quả. VD: mình muốn chọn ngày để điền vào ô ngày, thi bấm vào nút lựa chọn trong ô đó và chon ngày thích hợp. Có bạn nào biết cách thì bày cho mình với nha. Cảm ơn nhìu!
 
Upvote 0
Cái này cũng lâu lâu rồi. Nhưng em vẫn muốn hỏi thêm, có bác nào ghé thăm thì giải thích giùm em với. Cái mục lục này rất hay. Nhưng em chỉ biết tác dụng là xem từng sheet thôi. Chứ nếu em đang dùng ở sheet thứ 20 mà em quay về 1 sheet thứ 5(ví dụ tên là "abc" gì đó) để lấy 1 giá trị áp dụng vào một biểu thức đang sử dụng ở sheet thứ 20 thì hơi khó khăn. Có giải pháp nào không các bác
 
Upvote 0
Chào các ae, mình là 1 thành viên mới xin được các ae chỉ giáo.

"LinkToSheet.xls" của bạn anhtuan1066 rất hay, nhưng mình muốn hỏi thêm 1 chút: Thay vì mình muốn đặt link bằng tên sheet mà mình muốn đặt link bằng nội dung của ô A2 (tất cả các sheet - đây chính là tiêu đề của các sheet).

AE nào chỉ giúp mình với!

Cám ơn mọi người.
http://www.giaiphapexcel.com/forum/member.php?5605-anhtuan1066
 
Upvote 0
Chào Tuấn,
Mình là một thành viên mới, minh rất hứng thú về đề tài này của bạn nhung mình không hiểu cụm từ GetSheetName là nói về cái gì? Bạn có thể giải thích thêm giùm mình không?
 
Upvote 0
Chào Tuấn,
Mình là một thành viên mới, minh rất hứng thú về đề tài này của bạn nhung mình không hiểu cụm từ GetSheetName là nói về cái gì? Bạn có thể giải thích thêm giùm mình không?

Cái này là sử dụng hàm Marco4 đây, bác Anhtuan là cao thủ trong vấn đề này.
 
Upvote 0
Chào Tuấn,
Mình là một thành viên mới, minh rất hứng thú về đề tài này của bạn nhung mình không hiểu cụm từ GetSheetName là nói về cái gì? Bạn có thể giải thích thêm giùm mình không?
Ở đây là File Help về các hàm Macro 4 anh Duyệt gửi lên. Bạn tải về nghiên cứu nha
 
Upvote 0
hỏi cách tạo mục lục trong một word sheet

xin chào các bạn, mình mới gia nhập diễn đàn, các bạn cho mình hỏi là mình muốn tạo mục lục trong 1 sheet thì phái làm cách nào? bạn nào biết thì giúp mình với. cảm on các bạn
 
Upvote 0
Vì em cho code vào This Worbook nên nó ko chạy là phải rồi...
Hướng dẩn có đoạn: Vậy em cắt đoạn code ấy và cho nó vào Sheet Index đi, nó sẽ chạy ngay lập tức

He... he...
Món này ko cần dùng VBA vẩn làm dc... Dùng công thức quá dể luôn...
Dựa trên nền file GetSheetName (May quá, nghĩ chơi chơi mà giờ có cái để ứng dụng đây)
Xem file... Sheet Index sẽ tự động cập nhật bất kể ta đổi tên sheet, xóa sheet hay thêm sheet gì nó cũng chơi tuốt.... Tất cả chỉ dùng chức năng Hyperlink và các name trong Define Name... 1 Name Link duy nhất nó có thể hiểu dc bạn đang muốn link đến Sheet nào... he...he.. 1 phát 1 cho tất cả...
ANH TUẤN

Bác Anh Tuấn ơi coi lại giúp em với,
Workbook của em có hơn 70 sheets, mà dùng công thức của bác chỉ hiện tối đa có 35 sheets à, bác có cách nào cho nó hiện hết lên không bác
 
Upvote 0
Vì em cho code vào This Worbook nên nó ko chạy là phải rồi...
Hướng dẩn có đoạn: Vậy em cắt đoạn code ấy và cho nó vào Sheet Index đi, nó sẽ chạy ngay lập tức

He... he...
Món này ko cần dùng VBA vẩn làm dc... Dùng công thức quá dể luôn...
Dựa trên nền file GetSheetName (May quá, nghĩ chơi chơi mà giờ có cái để ứng dụng đây)
Xem file... Sheet Index sẽ tự động cập nhật bất kể ta đổi tên sheet, xóa sheet hay thêm sheet gì nó cũng chơi tuốt.... Tất cả chỉ dùng chức năng Hyperlink và các name trong Define Name... 1 Name Link duy nhất nó có thể hiểu dc bạn đang muốn link đến Sheet nào... he...he.. 1 phát 1 cho tất cả...
ANH TUẤN

Dear cả nhà.

Cho tớ hỏi. Tớ đang dùng excel 2007 thì các bước sẽ như thế nào.

vì tớ cũng copy đoạn code trên rồi, save file rồi nhưng vẫn ko chạy.

Xin cảm ơn
 
Upvote 0
giúp mình với,mình đã thử làm theo các bước như trên(vì dùng excels 2010 nên phần macro mình vào fiel->options-> trust center->trust center setting-> macro setting->disable all macro without notification) nhưng không có kết quả.giúp mình nhé,tks!
 
Upvote 0
giúp mình với,mình đã thử làm theo các bước như trên(vì dùng excels 2010 nên phần macro mình vào fiel->options-> trust center->trust center setting-> macro setting->disable all macro without notification) nhưng không có kết quả.giúp mình nhé,tks!
Lý ra phải chọn mục disable all macro with notification mới đúng
(dịch câu tiếng Anh mấy tùy chọn này cũng hiểu phải chọn cái nào rồi)
 
Upvote 0
Hnay mình đã làm lại đc.Không hiểu hôm trước nhầm ở đâu.hehe.Chọn Disable all macro without notification vẫn Ok.Tks cả nhà
 
Lần chỉnh sửa cuối:
Upvote 0
Nhưng code nay khi quay trở lại index thi tốc độ hơi chậm, có cách nào cho nó chay nhanh không giật không?
 
Upvote 0
Web KT
Back
Top Bottom