Help: Tạo HyperLink giữa 2 sheet và nội dung trong sheet (1 người xem)

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

timhieu02

Thành viên hoạt động
Tham gia
30/9/09
Bài viết
114
Được thích
7
Giới tính
Nam
Xin chào các ace,

Do Tuần sau mình phải làm thành phẩm phải báo cáo mà nội dung phạm vi bảng biểu lên đến hàng ngàn bảng biểu. Mình mong các ace diễn dàn giúp mình bằng macro cho nhanh.
Sau đây là yêu cầu:

- Tổng cộng có 2 sheets.
- Sheet 1: Index
- Sheet 2: Table (chứa hàng ngàn bảng biểu)
- Khi chạy macro sẽ tự động lấy từng Title và 1 số thông tin chính ở sheet 2 qua sheet 1 để cho ra HyperLink.
- Đồng thời ở sheet 2 sẽ xuất hiện "back to Index" ở row thứ 3 trong mỗi table.

Mình có attached file mẫu và có comment cho result của mình.

Rất mong sự hồi âm của các ace

Chúc ace 1 ngày an lành & sức khỏe!

Tony Thành
 

File đính kèm

Các anh chị em ơi,
có ai giúp mình với.
Thanks nhiêu lắm.
Tony Thành
 
Xin chào các ace,

Do Tuần sau mình phải làm thành phẩm phải báo cáo mà nội dung phạm vi bảng biểu lên đến hàng ngàn bảng biểu. Mình mong các ace diễn dàn giúp mình bằng macro cho nhanh.
Sau đây là yêu cầu:

- Tổng cộng có 2 sheets.
- Sheet 1: Index
- Sheet 2: Table (chứa hàng ngàn bảng biểu)
- Khi chạy macro sẽ tự động lấy từng Title và 1 số thông tin chính ở sheet 2 qua sheet 1 để cho ra HyperLink.
- Đồng thời ở sheet 2 sẽ xuất hiện "back to Index" ở row thứ 3 trong mỗi table.

Mình có attached file mẫu và có comment cho result của mình.

Rất mong sự hồi âm của các ace

Chúc ace 1 ngày an lành & sức khỏe!

Tony Thành

Bạn xem file đính kèm nhé.
 

File đính kèm

Cảm ơn mhung12005 nhiều nhé.
Cơ bản đả ra được sheet Index nhưng Bạn có thể giúp thêm:
- Tự tạo hyperlink từ Index sheet link sang từng table một
- Và trong mỗi table tự động tạo Link "Back to Index" để trở về Index sheet.

Rất mong sự hồi âm của bạn.
 
Sửa lại như vậy, xem có dùng được không:
[gpecode=vb]
Private Sub CommandButton1_Click()
Dim Rng As Range
Dim I As Long, J As Long
Set Rng = Sheet2.Range("A1:A" & Sheet2.Range("A65536").End(3).Row)
Range("A3:D65535").ClearContents
For I = 1 To Rng.Rows.Count
If Len(Sheet2.Cells(I, 1)) Then
If InStr(1, UCase(Sheet2.Cells(I, 1)), "TABLE", 0) Then
J = J + 1
Sheet2.Cells(I + 2, 1).Hyperlinks.Add Sheet2.Cells(I + 2, 1), _
"# INDEX!" & Cells(J + 2, 1).Address(0, 0), , , "Back To Index"
Cells(J + 2, 1) = Trim(Mid(Sheet2.Cells(I, 1), 7, 5))
Cells(J + 2, 2) = _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
Cells(J + 2, 2).Hyperlinks.Add Cells(J + 2, 2), _
"#Table!" & Sheet2.Cells(I + 2, 1).Address(0, 0), , , _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
Cells(J + 2, 3) = CLng(Sheet2.Cells(I + 8, 2))
Cells(J + 2, 4) = _
Right(Sheet2.Cells(I + 1, 1), Len(Sheet2.Cells(I + 1, 1)) - 9)
End If
End If
Next I
End Sub
[/gpecode]
 

File đính kèm

Khi viết code xử lý trên sheet thì nên nhớ đến dòng lệnh đầu code và cuối code Application.ScreenUpdating= False (True)
 
Dạ. Đúng rồi anh ơi.

- Anh có thể chỉnh lại code thay ButtonCommand thành add-ins em xài cho tất cả các jobs khác?
Xóa ButtonCommand ở sheet Index

- Khi em apply actual data, thi nó báo lỗi khi em click buttonCommand. Em có attached file. Anh xem giúp em nhé.

Cảm ơn anh nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Dạ. Đúng rồi anh ơi.
- Anh có thể chỉnh lại code thay ButtonCommand thành add-ins em xài cho tất cả các jobs khác?
Xóa ButtonCommand ở sheet Index
- Khi em apply actual data, thi nó báo lỗi khi em click buttonCommand. Em có attached file. Anh xem giúp em nhé.
Cảm ơn anh nhiều.
Mình chưa đủ trình để làm được code một cách trơn tru và chuyển nó thành Add-in, cái này nhờ các Thầy làm dùm.
Thay hàm Instr bằng phương thức Find, vẫn còn lỗi nên dùng On Error Resume Next, cái này nhờ các Thầy xem dùm luôn.
Có thể dùng tạm file:
[gpecode=vb]
Sub ThongKe()
Application.ScreenUpdating = False
On Error Resume Next
Dim Rng As Range
Dim I As Long, J As Long
Set Rng = Sheet2.Range("A1:A" & Sheet2.Range("A65536").End(3).Row)
Range("A3:D100").Clear
For I = 1 To Rng.Rows.Count
If Len(Sheet2.Cells(I, 1)) Then
If Not Sheet2.Cells(I, 1).Find("TABLE ", , , 2, , , True) Is Nothing Then
J = J + 1
Sheet2.Cells(I + 2, 1).Hyperlinks.Add Sheet2.Cells(I + 2, 1), _
"# INDEX!" & Cells(J + 2, 1).Address(0, 0), , , "Back To Index"
Cells(J + 2, 1) = Trim(Mid(Sheet2.Cells(I, 1), 7, 5))
Cells(J + 2, 2) = _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
Cells(J + 2, 2).Hyperlinks.Add Cells(J + 2, 2), _
"#Table!" & Sheet2.Cells(I + 2, 1).Address(0, 0), , , _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
Cells(J + 2, 3) = CLng(Sheet2.Cells(I + 8, 2))
Cells(J + 2, 4) = _
Right(Sheet2.Cells(I + 1, 1), Len(Sheet2.Cells(I + 1, 1)) - 9)
End If
End If
Next I
Range("A3:D" & J + 2).Borders.LineStyle = 1
Application.ScreenUpdating = False
End Sub
[/gpecode]
 

File đính kèm

Lần chỉnh sửa cuối:
cám ơn anh nhiều. Nhưng anh oi, con số BASE ở table số 18->21 (n=201) thì lấy đúng ở sheet Index. Còn con số từ table 1->17 (n=100) thì chưa chính xác. Đúng ra phải là 400 mới đúng - column B tương ứng với row "UNWEIGHTED BASE" ở sheet Table.

Các thầy, cô cùng các bạn giúp em nhé. (fixed vấn đề ở trên và tạo Add-in)

Em cám ơn nhiều.
Mong tin hồi âm sớm.
 
cám ơn anh nhiều. Nhưng anh oi, con số BASE ở table số 18->21 (n=201) thì lấy đúng ở sheet Index. Còn con số từ table 1->17 (n=100) thì chưa chính xác. Đúng ra phải là 400 mới đúng - column B tương ứng với row "UNWEIGHTED BASE" ở sheet Table.

Các thầy, cô cùng các bạn giúp em nhé. (fixed vấn đề ở trên và tạo Add-in)


Em cám ơn nhiều.
Mong tin hồi âm sớm.

Bài này mình sẽ làm theo hướng sử dụng GoTo
Code thống kê thì viết theo hướng dùng mảng
PHP:
Sub ThongKe2()
Application.ScreenUpdating = False
Dim I As Long, J As Long, x, str1, str2, Darr(1 To 10000, 1 To 4)
With Sheet2
    Sheet1.Range("A3:D1000").Clear
    For I = 1 To .[A65536].End(3).Row
        If InStr(.Cells(I, 1), "TABLE") Then
            .Cells(I, 1) = Application.Trim(.Cells(I, 1))
            J = J + 1
            str1 = Replace(.Cells(I, 1), "TABLE ", "")
            str2 = .Cells(I + 1, 1)
            Darr(J, 1) = Left(str1, InStr(str1, " "))
            Darr(J, 2) = Right(str1, Len(str1) - InStr(str1, " "))
            Darr(J, 4) = Right(str2, Len(str2) - 1 - InStr(str2, ":"))
            For x = 8 To 1 Step -1
                If .Cells(I + x, 1) = "UNWEIGHTED BASE" Then
                    Darr(J, 3) = Val(.Cells(I + x, 2))
                    Exit For
                End If
            Next
        End If
    Next I
End With
Sheet1.[a3].Resize(J, 4) = Darr
Sheet1.[a3].Resize(J, 4).Borders.Value = 1
Application.ScreenUpdating = True
End Sub
Code này cho sheet Table, double click tại dòng chứa Table
PHP:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 1 Then
    If Left(Target, 5) = "TABLE" Then
        Dim Found, Str
        Str = Mid(Target, 6, InStr(7, Target, " ") - InStr(1, Target, " "))
        Set Found = Sheet1.[A:A].Find(Trim(Str))
        If Not Found Is Nothing Then
            Application.Goto "INDEX!R" & Found.Row & "C2"
        End If
    End If
End If
End Sub
Code này cho sheet INDEX
PHP:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 2 Then
    Dim Found, Str
    Str = "TABLE " & Target.Offset(, -1) & " " & Target.Value
    Set Found = Sheet2.[A:A].Find(Str)
    If Not Found Is Nothing Then
        Application.Goto "Table!R" & Found.Row & "C1"
    End If
End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Dạ. Em cám ơn Anh nhiều. Đã lấy được số Base đúng nhưng:
- Trong sheet Index chưa có HyperLink để link tới các table trong sheet Table.
- Trong sheet Table - nguyên thủy/ban đầu thì chưa có Back to Index - khi chạy Macro thì tự tạo ra "Back To Index" tương ứng cho mỗi table.

Không biết em có thao tác thì say không mà em chạy không ra.

Em có gửi lại Example yêu cầu trong attached file. Anh xem giúp em nhé.

Mong các thầy/ anh chị em giúp em sớm. Chiều tối nay em nạo cho sếp rồi :(
 

File đính kèm

Dạ. Em cám ơn Anh nhiều. Đã lấy được số Base đúng nhưng:
- Trong sheet Index chưa có HyperLink để link tới các table trong sheet Table.
- Trong sheet Table - nguyên thủy/ban đầu thì chưa có Back to Index - khi chạy Macro thì tự tạo ra "Back To Index" tương ứng cho mỗi table.

Không biết em có thao tác thì say không mà em chạy không ra.

Em có gửi lại Example yêu cầu trong attached file. Anh xem giúp em nhé.

Mong các thầy/ anh chị em giúp em sớm. Chiều tối nay em nạo cho sếp rồi :(
Không chứa HyperLink nhưng nếu nhấp đúp chuột tại cột B của INDEX thì tự động tìm qua sheet Table, và trong sheet table thì nhấp đúp tại cột A dòng có chứa Table thì sẽ quay về INDEX
 
Anh ơi,

Client của em cho dự án này cực kỳ khó tính. Họ bắt buột phải theo template của họ:
- Có Hyperlink ở Index
- Có Back To Index ở sheet Table - Sau dòng Filter ở mỗi table (hic)
- Em có làm 1 số table thật thì macro chưa get được số Base.

Em có attached file. Anh xem giúp em nhé.
 

File đính kèm

Anh ơi,

Client của em cho dự án này cực kỳ khó tính. Họ bắt buột phải theo template của họ:
- Có Hyperlink ở Index
- Có Back To Index ở sheet Table - Sau dòng Filter ở mỗi table (hic)
- Em có làm 1 số table thật thì macro chưa get được số Base.

Em có attached file. Anh xem giúp em nhé.

Dữ liệu của bạn không có chuẩn gì ráo
PHP:
Sub ThongKe2()
Application.ScreenUpdating = False
Dim I As Long, J As Long, x, str1, str2, Darr(1 To 10000, 1 To 4)
With Sheet2
    Sheet1.Range("A3:D1000").Clear
    For I = 1 To .[A65536].End(3).Row
        If InStr(.Cells(I, 1), "TABLE") Then
            .Cells(I, 1) = Application.Trim(.Cells(I, 1))
            J = J + 1
            str1 = Replace(.Cells(I, 1), "TABLE ", "")
            str2 = .Cells(I + 1, 1)
            Darr(J, 1) = Left(str1, InStr(str1, " "))
            Darr(J, 2) = Right(str1, Len(str1) - InStr(str1, " "))
            Darr(J, 4) = Right(str2, Len(str2) - 1 - InStr(str2, ":"))
            For x = I To .[A65536].End(3).Row
                If .Cells(x, 1) = "UNWEIGHTED BASE" Then
                    Darr(J, 3) = Val(.Cells(x, 2))
                    Exit For
                End If
            Next
        End If
    Next I
End With
Sheet1.[a3].Resize(J, 4) = Darr
Sheet1.[a3].Resize(J, 4).Borders.Value = 1
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
cám ơn anh nhiều. Nhưng anh oi, con số BASE ở table số 18->21 (n=201) thì lấy đúng ở sheet Index. Còn con số từ table 1->17 (n=100) thì chưa chính xác. Đúng ra phải là 400 mới đúng - column B tương ứng với row "UNWEIGHTED BASE" ở sheet Table.

Các thầy, cô cùng các bạn giúp em nhé. (fixed vấn đề ở trên và tạo Add-in)

Em cám ơn nhiều.
Mong tin hồi âm sớm.
Mượn vòng For thứ 2 của anh Hải:
[gpecode=vb]
Sub ThongKe()
Application.ScreenUpdating = False
On Error Resume Next
Dim Rng As Range
Dim I As Long, J As Long, X As Long
Set Rng = Sheet2.Range("A1:A" & Sheet2.Range("A65536").End(3).Row)
Range("A3:D100").Clear
For I = 1 To Rng.Rows.Count
If Len(Sheet2.Cells(I, 1)) Then
If Not Sheet2.Cells(I, 1).Find("TABLE ", , , 2, , , True) Is Nothing Then
J = J + 1
Sheet2.Cells(I + 2, 1).Hyperlinks.Add Sheet2.Cells(I + 2, 1), _
"# INDEX!" & Cells(J + 2, 1).Address(0, 0), , , "Back To Index"
Cells(J + 2, 1) = Trim(Mid(Sheet2.Cells(I, 1), 7, 5))
Cells(J + 2, 2) = _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
Cells(J + 2, 2).Hyperlinks.Add Cells(J + 2, 2), _
"#Table!" & Sheet2.Cells(I + 2, 1).Address(0, 0), , , _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
For X = 8 To 1 Step -1
If Sheet2.Cells(I + X, 1) = "UNWEIGHTED BASE" Then
Cells(J + 2, 3) = Sheet2.Cells(I + X, 2)
Exit For
End If
Next X
Cells(J + 2, 4) = _
Right(Sheet2.Cells(I + 1, 1), Len(Sheet2.Cells(I + 1, 1)) - 9)
End If
End If
Next I
Range("A3:D" & J + 2).Borders.LineStyle = 1
Application.ScreenUpdating = False
End Sub
[/gpecode]
 

File đính kèm

Mượn vòng For thứ 2 của anh Hải:
[gpecode=vb]
Sub ThongKe()
Application.ScreenUpdating = False
On Error Resume Next
Dim Rng As Range
Dim I As Long, J As Long, X As Long
Set Rng = Sheet2.Range("A1:A" & Sheet2.Range("A65536").End(3).Row)
Range("A3:D100").Clear
For I = 1 To Rng.Rows.Count
If Len(Sheet2.Cells(I, 1)) Then
If Not Sheet2.Cells(I, 1).Find("TABLE ", , , 2, , , True) Is Nothing Then
J = J + 1
Sheet2.Cells(I + 2, 1).Hyperlinks.Add Sheet2.Cells(I + 2, 1), _
"# INDEX!" & Cells(J + 2, 1).Address(0, 0), , , "Back To Index"
Cells(J + 2, 1) = Trim(Mid(Sheet2.Cells(I, 1), 7, 5))
Cells(J + 2, 2) = _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
Cells(J + 2, 2).Hyperlinks.Add Cells(J + 2, 2), _
"#Table!" & Sheet2.Cells(I + 2, 1).Address(0, 0), , , _
Application.Trim(Right(Sheet2.Cells(I, 1), Len(Sheet2.Cells(I, 1)) - 15))
For X = I To 65536
If Sheet2.Cells(X, 1) = "UNWEIGHTED BASE" Then
Cells(J + 2, 3) = Sheet2.Cells( X, 2)
Exit For
End If

Next X
Cells(J + 2, 4) = _
Right(Sheet2.Cells(I + 1, 1), Len(Sheet2.Cells(I + 1, 1)) - 9)
End If
End If
Next I
Range("A3:D" & J + 2).Borders.LineStyle = 1
Application.ScreenUpdating = False
End Sub
[/gpecode]

Dữ liệu của tác giả phải sửa lại chỗ màu xanh
 
Cám ơn các anh. Gần chuẩn rồi nhưng em chạy chưa lấy được số BASE cột C - Sheet Index.
Em có attached file sau khi chạy Macro. Nhờ các anh xem giúp em.
 

File đính kèm

Cám ơn các anh. Gần chuẩn rồi nhưng em chạy chưa lấy được số BASE cột C - Sheet Index.
Em có attached file sau khi chạy Macro. Nhờ các anh xem giúp em.
Sửa lại đoạn này
PHP:
                For X = I To 65536
                    If Sheet2.Cells(X, 1) = "UNWEIGHTED BASE" Then
                        Cells(J + 2, 3) = Sheet2.Cells(X, 2)
                        Exit For
                    End If
                Next X
 
Cám ơn anh nhiều lắm. Em sửa lại đoạn anh chỉ thì chạy quá good anh ơi.
Anh có thể giúp em 1 tí xíu nữa được không.
Ý tưởng như thế này:

- 1 file excel chỉ có 1 sheet duy nhất - với bấy kỳ tên gì (Nếu cần thì em fixed tên sheet là "Table" luôn)
- Anh tạo Add-in
- Chỉ cần chạy Add-in thì tự động tạo sheet "Index" với mẫu như attached luc trước

Vì sau này em cũng có những dự án giống như vậy

Em cảm ơn các anh trước
 
Các thầy/cô cùng các anh chị nhín chút thời gian giúp em với nhé. :)
 
Các anh chị ơi,
Em đã làm add-in cho tool Tạo Index tự động và kết hợp với code của các anh.
sau khi ráp lại thì bị báo lỗi mà em hổng biết fix làm sao. (gà gì đâu --=0)
Em có attached 2 files: 1 add-in và 1 là table mẫu.
các anh chị xem qua và fixed giúp em nhé.

Yêu cầu của Add-in này hoạt động là:
- 1 sheet table/data với bất kỳ tên gì và sẽ chạy sheet nào nếu mình đang hiện hành là sheet đó.
- Add-in sẽ tự tạo 1 sheet "Index"

Mong tin các anh, chị sớm.
 

File đính kèm

Chào các anh chị ngày đầu tuần làm việc tốt nhé.
Các anh chi nhín chút giời gian fix giúp em với.
Best regards,
Lon
 
Các anh chị ơi,
Em đã làm add-in cho tool Tạo Index tự động và kết hợp với code của các anh.
sau khi ráp lại thì bị báo lỗi mà em hổng biết fix làm sao. (gà gì đâu --=0)
Em có attached 2 files: 1 add-in và 1 là table mẫu.
các anh chị xem qua và fixed giúp em nhé.

Yêu cầu của Add-in này hoạt động là:
- 1 sheet table/data với bất kỳ tên gì và sẽ chạy sheet nào nếu mình đang hiện hành là sheet đó.
- Add-in sẽ tự tạo 1 sheet "Index"

Mong tin các anh, chị sớm.
Mấy bài dạng này ít ai muốn làm vì khả năng đáp ứng yêu cầu không cao.
Bạn thử cái này hên xui nha. Mình chỉnh lại chút theo cách của mình.
Code trong file bạn nhìn như cái rừng ai muốn đọc chứ
 

File đính kèm

Dạ. em cảm ơn anh Hải. :)
 

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

Back
Top Bottom