Giúp: Tạo Hyperlink (1 người xem)

Liên hệ QC

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
Chào các anh/chị/bạn,

cho mình xin lỗi nếu post sai mục.
Mình có vấn đề tạo hyperlink, cần anh/chị/bạn giúp. Mình có attached file mẫu và có ghi yêu cầu trong file.

Mong tin hồi âm sớm từ anh/chị/bạn :)

Trân trọng
 

File đính kèm

Cám ơn anh nhiều lắm. Sau khi chạy macro thì mình tùy chỉnh lại yêu cầu cho output hoàn thiện với mọi dự án luôn, nếu được thì mình mong muốn như sau:

1/ Do raw data lúc nào cũng có dòng: "Cell Contents: <BR/>- Count<BR/>- Column Percentage<BR/>" -> lúc nào cũng xuất hiện ở cột A. Do đó có thể tùy chỉnh macro lại để ignore dòng này - HOẶC: Di chuyển qua cột khác (khác cột A), sau khi chạy macro tạo hyperlink xong thì move lại cột A ngay vị trí ban đầu.
2/ Raw data ban đầu thì lúc nào cũng chỉ có 1 sheet "Table". Cho nên mình sẽ tạo 1 add-in để click lệnh, sau đó chương trình tự tạo 1 sheet với tên "Index" và trong sheet "Index" lúc nào cũng có sẵn template với nội dung như sau:
..................

Điều kiện: Trong file chỉ có 1 sheet Table?
Thử Sub này:
PHP:
Public Sub GPE()
Dim Rng As Range, Cll As Range, dArr(), I As Long, K As Long
With Sheets("Table")
    Set Rng = .Range(.[A1], .[A1048576].End(xlUp))
    ReDim dArr(1 To Rng.Rows.Count, 1 To 4)
    For Each Cll In Rng
        If InStr(UCase(Cll), "QUES") Then
            K = K + 1
            dArr(K, 1) = K
            dArr(K, 2) = Left(Cll, InStr(UCase(Cll), "<") - 1)
            dArr(K, 3) = Cll.Offset(6, 1)
            dArr(K, 4) = Cll.Row
            Cll.Offset(3).Select
            ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
        "Index!B2", TextToDisplay:="Back to Index"
        End If
    Next Cll
End With
Sheets.Add
With ActiveSheet
    .Name = "Index"
    .[B1] = "#TABLE INDEX#"
    .[A2] = "Table No": .[B2] = "Table Title": .[C2] = "Base"
    .[A3].Resize(K, 3) = dArr
    .Columns("A:C").EntireColumn.AutoFit
    For I = 1 To K
        Range("B" & I + 2).Select
        .Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
        "Table!A" & dArr(I, 4), TextToDisplay:=dArr(I, 2)
    Next I
End With
Set Rng = Nothing
End Sub
Nếu có sẵn sheet Index thì lỗi "ráng chịu". Tôi chưa bẫy lỗi này.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ. Thanks anh nhiều. chạy smooth rồi anh.
Nhưng Anh ơi, key word "QUES" trong template file là em demo thôi. thật tế mỗi table, tên title khác nhau, vì dụ:

A1_1 : OCCASIONS TO DRINK<BR/>
Project xxxx
Table: 1<BR/>Level: Top

Do đó, dòng title (như điều kiện cũ, lấy hết, chỉ bỏ "<BR/>") em muốn lấy là trên dòng Project xxxx, có thể xem 2 key rows ở đây là:
Project xxxx
Table: xxx

bên cạnh đó, nếu đã có sheet "Index" rồi, thì anh bẫy giúp em: show 1 thông báo: "Sheet Index đã tồn tại. Bạn có muốn Overwrite không? Nếu Yes thì clear nội dung sheet Index và chạy macro bình thường, nếu không thì chương trình sẽ tạo ra thêm 1 sheet khác với tên "Index_1", tương tự, lần sau chạy nữa thì tạo thêm sheet "Index_2"...

****xong vụ trên, nếu em muốn phát triển thêm, ví dụ, trong file em có 3 sheets, thì khi chạy macro, sẽ tự tạo 3 sheets index: Index_1, Index_2, Index_3. Vậy có quá phức tạo không anh? Mong anh tư vấn cho em với

Em cám ơn anh và các pác trên forum đã dành thời gian cho đề tài của em vào ngày Chủ Nhật ạ :)
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ. Thanks anh nhiều. chạy smooth rồi anh.
Nhưng Anh ơi, key word "QUES" trong template file là em demo thôi. thật tế mỗi table, tên title khác nhau, vì dụ:

A1_1 : OCCASIONS TO DRINK<BR/>
Project xxxx
Table: 1<BR/>Level: Top

Do đó, dòng title (như điều kiện cũ, lấy hết, chỉ bỏ "<BR/>") em muốn lấy là trên dòng Project xxxx, có thể xem 2 key rows ở đây là:
Project xxxx
Table: xxx

bên cạnh đó, nếu đã có sheet "Index" rồi, thì anh bẫy giúp em: show 1 thông báo: "Sheet Index đã tồn tại. Bạn có muốn Overwrite không? Nếu Yes thì clear nội dung sheet Index và chạy macro bình thường, nếu không thì chương trình sẽ tạo ra thêm 1 sheet khác với tên "Index_1", tương tự, lần sau chạy nữa thì tạo thêm sheet "Index_2"...

****xong vụ trên, nếu em muốn phát triển thêm, ví dụ, trong file em có 3 sheets, thì khi chạy macro, sẽ tự tạo 3 sheets index: Index_1, Index_2, Index_3. Vậy có quá phức tạo không anh? Mong anh tư vấn cho em với

Em cám ơn anh và các pác trên forum đã dành thời gian cho đề tài của em vào ngày Chủ Nhật ạ :)

1/ Điều kiện nhờ giúp ban đầu là trong sheet chỉ có 1 sheet Table. Tôi làm theo yêu cầu.
2/ Raw data ban đầu thì lúc nào cũng chỉ có 1 sheet "Table". Cho nên mình sẽ tạo 1 add-in để click lệnh, sau đó chương trình tự tạo 1 sheet với tên "Index" và trong sheet "Index" lúc nào cũng có sẵn template với nội dung như sau:
2/ Dò điều kiện dòng có "Project Test" chứ không phải "ques", tôi đã sửa bằng Code dưới.
3/ Lỗi nếu đã có sheet "Index" rồi (cũng không có yêu cầu), thì tôi bẫy lỗi bằng cách không Insert thêm sheet nữa, yêu cầu thông báo và Index1, Index2.... không có trong yêu cầu ban đầu.
4/ Chuyện gì VBA cũng "có thể" làm, nhưng nói rõ từ đầu, làm xong rồi bạn mới "nếu như" thì ít ai theo lắm.
PHP:
Public Sub GPE()
Dim Ws As Worksheet, Rng As Range, Cll As Range, dArr(), I As Long, K As Long, DK As Boolean
On Error Resume Next
With Sheets("Table")
    Set Rng = .Range(.[A1], .[A1048576].End(xlUp))
    ReDim dArr(1 To Rng.Rows.Count, 1 To 4)
    For Each Cll In Rng
        If Cll.Value = "Project Test" Then
            K = K + 1
            dArr(K, 1) = K
            dArr(K, 2) = Left(Cll.Offset(-1), InStr(Cll.Offset(-1), "<") - 1)
            dArr(K, 3) = Cll.Offset(5, 1)
            dArr(K, 4) = Cll.Offset(-1).Row
            Cll.Offset(2).Select
            ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
        "Index!B2", TextToDisplay:="Back to Index"
        End If
    Next Cll
End With
For Each Ws In Worksheets
    If Ws.Name = "Index" Then DK = True
Next Ws
If DK = False Then
    Sheets.Add
    ActiveSheet.Name = "Index"
End If
Sheets("Index").Select
With ActiveSheet
    .[B1] = "#TABLE INDEX#"
    .[A2] = "Table No": .[B2] = "Table Title": .[C2] = "Base"
    .[A3:C1000].Clear
    .[A3].Resize(K, 3) = dArr
    .Columns("A:C").EntireColumn.AutoFit
    For I = 1 To K
        .Range("B" & I + 2).Select
        .Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
        "Table!A" & dArr(I, 4), TextToDisplay:=dArr(I, 2)
    Next I
End With
Set Rng = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ. Em cảm ơn anh. Em sẽ rút kinh nghiệm lần sau --=0
Do ban đầu gấp quá nên chỉ capture những ý chính. càng về sau thì muốn tool hoàn thiện hơn nên phát sinh 1 số vấn đề khác.
Anh ơi, do bên em sau này sẽ có nhiều dự án với tên khác nhau, trong tình huống này em đặt "Project Test" (Do vấn đề bảo mật thông tin trong công ty nên em không tiện nêu rõ dự án đang làm). Vì vậy, anh sữa code giúp em chỉ dò "Project" và dòng dưới nó là "Table:" để xác định key word

A1_1 : OCCASIONS TO DRINK<BR/>
Project xxxx
Table: 1<BR/>Level: Top

-> để em chạy cho mọi dự án.
**Và khi click vào vị "Back To Index" của table đó trong sheet "Table", thì em muốn move qua sheet "Index" ngay tại vị trí link của table đó. Hiện tại thì con trỏ move lên dòng B2 của sheet "Index"


**Anh giúp em thêm code nếu trong file có nhiều sheet thì khi chạy macro sẽ tự tạo nhiều sheet "Index_1", "Index_2", tương ứng được không ạ?

Cám ơn anh trước
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ. Em cảm ơn anh. Em sẽ rút kinh nghiệm lần sau --=0
Do ban đầu gấp quá nên chỉ capture những ý chính. càng về sau thì muốn tool hoàn thiện hơn nên phát sinh 1 số vấn đề khác.
Anh ơi, do bên em sau này sẽ có nhiều dự án với tên khác nhau, trong tình huống này em đặt "Project Test" (Do vấn đề bảo mật thông tin trong công ty nên em không tiện nêu rõ dự án đang làm). Vì vậy, anh sữa code giúp em chỉ dò "Project" và dòng dưới nó là "Table:" để xác định key word

A1_1 : OCCASIONS TO DRINK<BR/>
Project xxxx
Table: 1<BR/>Level: Top

-> để em chạy cho mọi dự án.
**Và khi click vào vị "Back To Index" của table đó trong sheet "Table", thì em muốn move qua sheet "Index" ngay tại vị trí link của table đó. Hiện tại thì con trỏ move lên dòng B2 của sheet "Index"


**Anh giúp em thêm code nếu trong file có nhiều sheet thì khi chạy macro sẽ tự tạo nhiều sheet "Index_1", "Index_2", tương ứng được không ạ?

Cám ơn anh trước

1/ Nếu chỉ muốn xét dòng nào có chữ "Project" thì tìm trong code:
PHP:
For Each Cll In Rng
        If Cll.Value = "Project Test" Then '<-----Sửa dòng này thành: If Cll.Value Like "Project*" Then'
            K = K + 1

2/ Bạn vẫn chưa rút kinh nghiệm việc hỏi bài. Muốn hỏi thì phải kèm file.
Ai biết bạn đặt tên cho sheet là gì, có quy luật tên sheet không, trong file có bao nhiêu sheet, sheet nào của Index1, sheet nào của Index2,.... Ít nhất cũng có các sheet để người viết code còn kiểm tra kết quả sau khi chạy code.
3/ Bấm nút "Back to Index" thì trở về sheet Index, ở ô nào thì có "bất lợi" chỗ nào? Không lẽ ở sheet Index bạn chỉ bấm link vào 1 ô cố định hoài sao? Không chọn bấm vào ô khác ?
 
Upvote 0
hihihi..cám ơn anh đã nhắc nhẹ em :-=

em đã thay code và xong vụ "Project*" rồi.

***em có attached file mẫu cho hyperlink_multi_sheet.
hiện tại file có 3 sheets, nếu sau khi chạy code xong, thì sẽ có 3 sheets Index, mỗi sheet Index sẽ đứng trước sheet dữ liệu. Với thứ tên theo thứ tự: Index 1, Index 2, Index 3, v.v..
hiện tại em đang thả lỏng với tên sheet data bất kỳ, không cố định tên

Mong anh xem giúp em nhé
 
Upvote 0
Cám ơn anh nhiều lắm. Sau khi chạy macro thì mình tùy chỉnh lại yêu cầu cho output hoàn thiện với mọi dự án luôn, nếu được thì mình mong muốn như sau:

1/ Do raw data lúc nào cũng có dòng: "Cell Contents: <BR/>- Count<BR/>- Column Percentage<BR/>" -> lúc nào cũng xuất hiện ở cột A. Do đó có thể tùy chỉnh macro lại để ignore dòng này - HOẶC: Di chuyển qua cột khác (khác cột A), sau khi chạy macro tạo hyperlink xong thì move lại cột A ngay vị trí ban đầu.
Xử lý vấn đề này chỉ cần thêm vào một điều kiện giới hạn max chuỗi của nó là được
Mã:
If Len(Sheet2.Cells(n, 1)) > 6 and [COLOR=#ff0000]Len(Sheet2.Cells(n, 1)) < 40[/COLOR] And Right(Sheet2.Cells(n, 1), 5) = "<BR/>" Then
Vấn đề của bạn nó hơi dỡ khi bạn quản lí như thế
(1) ứng với mỗi sheet ("Table") là một sheet("Index") vấn đề này làm AddIn khá rắc rối và không ai có nhiều thời gian để làm cho bạn

Cách xử lí dữ liệu của mình nếu là bạn:

- Với mỗi sheet("Table") có thể đặt theo stt Table1,Table2,...Table3

-và tại mỗi sheet(Table") đó sẽ có hyperlink tại dòng chữ "Back To Index" sẽ link về một sheet("Index") duy nhất, và tại sheet("Index") sẽ link tới đứng vị trí bảng dữ liệu dành riêng cho hyperlink tại mỗi sheet("Table") . nghĩa là một sheet("Index") sẽ chứ nhiều bảng và mỗi bảng quản lí một hyperlink cho riêng mỗi sheet("Table")

-Vậy là khi bạn tạo một sheet("Table") mới thì sheet(Index) tự động tạo một bảng mới quản lí Hyperlink của sheet("Table") bạn mới tạo(Nghĩa là khi sheet("Table") bạn tạo mới đó thì dòng "Back To Index" sẽ phải tự động link tới đúng bảng quản lí Hyperlink của nó trong sheet("Index")

Cách quản lí này có thể đơn giản hơn của bạn, nhưng để giải quyết nó không phải đơn giản,nếu bạn muốn theo hướng này thì mình có thể giúp bạn, nhưng khá tốn nhiều thời gian,do mình còn bận rộn với công việc!
 
Upvote 0
Dạ, em cảm ơn anh nhiều lắm! :)--=0
 
Upvote 0
Xử lý vấn đề này chỉ cần thêm vào một điều kiện giới hạn max chuỗi của nó là được
Mã:
If Len(Sheet2.Cells(n, 1)) > 6 and [COLOR=#ff0000]Len(Sheet2.Cells(n, 1)) < 40[/COLOR] And Right(Sheet2.Cells(n, 1), 5) = "<BR/>" Then
Vấn đề của bạn nó hơi dỡ khi bạn quản lí như thế
(1) ứng với mỗi sheet ("Table") là một sheet("Index") vấn đề này làm AddIn khá rắc rối và không ai có nhiều thời gian để làm cho bạn

Cách xử lí dữ liệu của mình nếu là bạn:

- Với mỗi sheet("Table") có thể đặt theo stt Table1,Table2,...Table3

-và tại mỗi sheet(Table") đó sẽ có hyperlink tại dòng chữ "Back To Index" sẽ link về một sheet("Index") duy nhất, và tại sheet("Index") sẽ link tới đứng vị trí bảng dữ liệu dành riêng cho hyperlink tại mỗi sheet("Table") . nghĩa là một sheet("Index") sẽ chứ nhiều bảng và mỗi bảng quản lí một hyperlink cho riêng mỗi sheet("Table")

-Vậy là khi bạn tạo một sheet("Table") mới thì sheet(Index) tự động tạo một bảng mới quản lí Hyperlink của sheet("Table") bạn mới tạo(Nghĩa là khi sheet("Table") bạn tạo mới đó thì dòng "Back To Index" sẽ phải tự động link tới đúng bảng quản lí Hyperlink của nó trong sheet("Index")

Cách quản lí này có thể đơn giản hơn của bạn, nhưng để giải quyết nó không phải đơn giản,nếu bạn muốn theo hướng này thì mình có thể giúp bạn, nhưng khá tốn nhiều thời gian,do mình còn bận rộn với công việc!


dạ.thanks anh đã đóng góp ý kiến. Nó giúp mình khai sáng sau này quản lý file trong dự án của mình.
Anh Ba Tê đã giúp mình làm multisheet_hyperlink rồi. nhận tiện đây, nếu anh có thời gian thì giúp mình để sau này khách hàng có yêu cầu như vậy thì mình áp dụng liền.
 
Upvote 0
Web KT

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

Back
Top Bottom