Đăng ký học Excel và VBA cùng GPE tháng 10 - TPHCM

Đăng ký học Excel và VBA cùng GPE tháng 11 - TPHCM

Liên kết động trong Excel

Thảo luận trong 'Cấu trúc dữ liệu Excel và việc Xử lý dữ liệu' bắt đầu bởi Đào Việt Cường, 7 Tháng bảy 2007.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. Đào Việt Cường

    Đào Việt Cường Cu Tí sành điệu

    Dear all,
    -------
    Mình không biết đặt tên chủ đề như vậy đã thích hợp chưa nhưng vấn đề mình sắp nêu dưới đây thì tin rằng nó sẽ được ứng dụng hữu ích.

    Chúng ta biết đến chức năng Link Manager như một công cụ quản lý các liên kết bên ngoài, từ Workbook hiện hành với 1 hay nhiều Workbook khác. Người dùng Excel thường gặp hộp thoại Edit or Update link nếu Workbook liên kết chưa mở. Dĩ nhiên là bạn có thể tắt chức năng cảnh báo này bằng tuỳ chọn "Don't alert..." trong Startup Prompt. Tuy nhiên bạn vẫn có thể gặp rắc rối nếu như cố gắng cập nhật liên kết từ một Workbook chưa mở, không tồn tại do di chuyển hoặc đổi tên.

    Một ví dụ điển hình khác, bạn có một Workbook bao gồm nhiều Name (Workbook lưu trữ các bảng danh mục chẳng hạn) và bạn muốn tham chiếu đến Name này trong một Book khác. Tất nhiên điều mà bạn mong muốn là khi định nghĩa lại tham chiếu của Name trong Workbook nguồn thì Name trong Book kia cũng thay đổi theo (về bản chất là một).

    "Liên kết động" là công cụ để giải quyết các yêu cầu trên.

    Thật ra chưa có tài liệu nào nói về khái niệm này một cách chính tắc. Từ "động" ở đây bao hàm ý nghĩa là sự tương ứng so với những thay đổi của nguồn dữ liệu được liên kết tới một Workbook bên ngoài. Đây là phương thức liên kết với một Workbook thực sự tồn tại, được lưu trữ tại bất cứ ở đâu, miễn sao khi cần cập nhật liên kết thì Workbook đó phải được mở.

    Nghe có vẻ chẳng có tác dụng gì vì lấy thông tin từ một Workbook đang mở thì có nhất thiết phải liên kết?

    Câu trả lời là "Có"!

    Một ứng dụng rất hữu ích mà mình vẫn đang làm đó là tạo ra mối liên kết giữa Workbook bảng cân đối phát sinh (CDPS) với Workbook sổ nhật ký (SNK). Chúng ta hiểu mối quan hệ giữa 2 Workbook này: SNK được xem là Workbook nguồn (Workbook được liên kết) và CDPS là Workbook liên kết. Vì rất nhiều lý do, sổ nhật ký thường bị di chuyển, đổi tên dẫn đến CDPS không tìm đọc được số liệu từ SNK. Mặt khác SNK là bảng dữ liệu thường xuyên được mở để cập nhật còn CDPS chỉ được mở khi có nhu cầu xem báo cáo. Việc tách biệt giữa số liệu và báo cáo sẽ cải thiện đáng kể tốc độ cập nhật và tính toán trên SNK. Một lý do khác nữa khiến bạn có ý tưởng về "liên kết động" là bạn muốn chỉ cần một CDPS để xem số phát sinh các tài khoản với nhiều kỳ khác nhau, mỗi kỳ được tổ chức trên một Workbook nhật ký, có cấu trúc giống nhau. Nếu bạn cung cấp cho liên kết biết bạn có ý định tham chiếu đến SNK nào thì liên kết đó thực sự có hiệu lực và đáp ứng cho bạn theo tham số kỳ kế toán mà bạn đưa vào.

    Có lẽ chúng ta không mất thời gian để xây dựng khái niệm "Liên kết động" là gì nữa. Hi vọng rằng bạn đã hiểu được nhu cầu về việc liên kết với một Workbook bên ngoài mà nguồn dữ liệu đó không cố định.

    Bây giờ bạn sẽ hỏi: liên kết theo dạng đó như thế nào?

    Nào, hãy định nghĩa một Name để thể hiện rằng chúng ta muốn liên kết đến các SNK của các kỳ: năm 2004, 2005, 2006, 2007... được lưu trữ trong các Workbook: SNK_2004.xls, SNK_2005.xls, SNK_2006.xls, SNK_2007.xls...

    Chúng ta nhận thấy tham số ở đây là các kỳ kế toán và tham số này được truyền vào khi người dùng lựa chọn kỳ kế toán (được thiết kế trên sheet). Giả sử Sheet1!$A$1 của Workbook hiện hành chứa giá trị tham số kỳ kế toán, chúng ta sẽ có một Name:
    SNK:= "SNK_" & Sheet1!$A$1 & ".xls"

    Với Name này, bạn chưa thể tạo ra một bảng CDPS với những con số sống động. Một Name khác sẽ cho phép bạn tham chiếu đến vùng dữ liệu NHATKY_Range trên SNK:

    Như đã đề cập, bạn có thể "mượn" Name của một Workbook này để sử dụng cho một Workbook khác: bảng danh mục khác hàng (KHACHHANG) có thể được sử dụng cho nhiều SNK mà bất cứ một thông tin nào của khách hàng bị thay đổi thì thông tin ở tất cả các SNK được cập nhật theo. Đây là ưu điểm chính giúp bạn quản lý dữ liệu trên Excel tập trung và đồng bộ hơn.

    Kỹ thuật không có gì mới mẻ, bạn dễ dàng tạo ra liên kết giữa CDPS với SNK thông qua sử dụng Name NHATKY_Range đã được định nghĩa trong Workbook nhật ký bằng việc sử dụng kết hợp hàm INDIRECT. Công thức sau sẽ liên kết thông tin từ SNK sang CDPS ở mức Worksheet:

    NHATKY_Range:= INDIRECT(SNK & "!NHATKY_Range" )
    trong đó SNK là Name đã được định nghĩa như ở trên

    Tất nhiên bạn có thể kết hợp để tham chiếu thẳng đến vùng dữ liệu NHATKY_Range trên sổ nhật ký bằng công thức cải tiến trong reference to của name NHATKY_Range trên CDPS như sau:

    NHATKY_Range:=INDIRECT("SNK_" & Sheet1!$A$1 & ".xls!NHATKY_Range")

    Tuy vậy mình khuyến nghị các bạn nên sử dụng name SNK để thuận tiện cho việc bảo trì các tham chiếu có sử dụng SNK sau này!

    Công thức trên được diễn giải như sau: chúng ta cần tham chiếu đến Name SNK trong Workbook SNK_????.xls, trong đó ???? là giá trị được tham chiếu từ Sheet1!$A$1. (???? được thay đổi theo người dùng nhập vào)

    Bây giờ, trên CDPS, bạn có thể kết hợp các hàm có sử dụng Name SNK một cách bình thường.

    Lưu ý rằng, nếu workbook nguồn đóng lại thì công thức có sử dụng Name này sẽ báo lỗi #REF! vì dữ liệu của Name luôn được cập nhật (online). Ngược lại khi bạn mở Workbook liên kết (CDPS) excel không đưa ra hộp thoại cảnh báo về việc không tìm thấy dữ liệu nguồn. Đây có thể là lợi điểm khiến chúng ta yêu thích khi sử dụng liên kết động.

    Kiến thức về liên kết động không có gì mới nhưng khả năng ứng dụng thì rất đa dạng. Hi vọng bài viết này gợi mở cho bạn cách thức quản lý thông tin bằng Excel tốt hơn, nhanh hơn và tối ưu hơn.

    Chúng ta sẽ cùng nhau thảo luận kỹ hơn về khả năng ứng dụng của liên kết động cũng như có điều kiện để chỉ ra những ưu nhược điểm của nó.

    Thân ái
     
    Lần chỉnh sửa cuối: 8 Tháng bảy 2007
  2. tedaynui

    tedaynui (*_*)

    Xin chào
    Trong khi chờ anh Cu Tí, mình gởi các bạn một số ví dụ về cách dùng hàm INDIRECT (có cả Lookup và Validation)

    Thân!
     

    Các file đính kèm:

  3. connhangheo

    connhangheo Thành viên thường trực

    các bác xem hộ em cái liên kết động này với, em làm thấy các ô tòn là REF
     

    Các file đính kèm:

  4. tedaynui

    tedaynui (*_*)

    Công thức của bạn: =INDIRECT("book1.xls!sheet2!B7")
    Như vậy là chưa chính xác, bạn thử công thức này xem nhé :
    =INDIRECT("[book1.xls]sheet2!B7")

    TDN
     
  5. connhangheo

    connhangheo Thành viên thường trực

    em thử rồi nhưng không được bác ah, các ô vẫn hiện ra là #REF,mong bác xem lại hộ em
     
  6. anhtuan1066

    anhtuan1066 Thành viên gạo cội

    Công thức sẽ đúng với điều kiện bạn mở 2 file cùng 1 lúc
     
  7. Mr Okebab

    Mr Okebab Ngon Ngất Ngây

    Đọc kỹ bạn nhé :
    Thân!
     
    myhau212 thích bài này.
  8. connhangheo

    connhangheo Thành viên thường trực

    em mở cả 2 workbook cùng 1 lúc mà
     
  9. LEHOANGANHTUAN

    LEHOANGANHTUAN Thành viên mới

    Em cũng có tìm hiểu về vấn đề này, nhưng không biết có thể đưa vào VBA không.
    co đoạn code nay các anh cho ý kiến (hơi ẹ <--- Nghiệp dư mà)
    Sub kiemtraDM()
    Dim i As Long
    Dim ketthuc As String
    Application.Goto Reference:="R2C2"
    ketthuc = InputBox("", "", 10)

    'TAOCONGTHUC
    For i = 1 To ketthuc
    ActiveCell.FormulaR1C1 = _
    "RE#RA='D:\[BANG KE VAT LIEU NHAP KHAU.xls]" & Sheet1.Cells(i + 1, 1).Value & "'!$B$1"
    Cells.Replace What:="RE#RA", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    Application.Goto Reference:="R[1]C"
    Next

    End Sub
    Em dùng ghi macro để có các anh đừng cươi nhé
    Còn nữa,
    Em thử nghiệm với indirect() thi trường hợp:
    'D:\[Book1.xls]Sheet1'!$A$1
    'D:\[Book2.xls]Sheet1'!$A$1
    'D:\[Book3.xls]Sheet1'!$A$1
    .......
    'D:\[Bookn.xls]Sheet1'!$A$1
    Thì mình làm sao?
    À ma làm sao attach file khi pót bai nhi?
     
    Lần chỉnh sửa cuối: 4 Tháng mười hai 2007
  10. emnhattrendoi

    emnhattrendoi Thành viên mới

    Xin chào! minh la thành viên mới của diễn đàn. Mình biết rất ít về Excel, mong các bạn chỉ thêm cho ạ.

    Mình đang có một vướng mắc xin các bạn giải đáp giùm cho:
    Trong 1 file có 3 sheet chi tiết và 1 sheet tổng hợp, mình muốn số liệu từng khoản mục trong 3 sheet chi tiết tự động chạy qua sheet tổng hợp nhung không biết dùng công thức nào để link. Các bạn giúp mình nhé.
    Mình gởi kèm theo file.
    cam on nhiu nhiu

    Emnhattrendoi chú ý: Bài viết phải có dấu, bạn phải sửa lại không sẽ bị xóa!
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 10 Tháng mười hai 2007
  11. nokia6230ivn

    nokia6230ivn Thành viên mới

    Bạn chỉ cần link 1 cell rồi dùng chuột kéo thì sẽ được toàn bộ!
     

    Các file đính kèm:

    Shopngoo thích bài này.
  12. emnhattrendoi

    emnhattrendoi Thành viên mới

    Cám ơn bạn, nhưng ý của mình không phải vậy, vậy thì đơn giản quá, mình muốn số liệu từng khoản mục của cả 3 sheet được tổng hợp vào sheet tổng hợp.
    VD như là khoản mục AA (sheet TCKT )+ AA (sheet TCNS) + AA (sheet KDXK) sẽ được tổng hợp bên sheet TH, mỗi khoản mục trong mỗi sheet có thể có ở sheet này và không có ở sheet kia, mình có dùng thử hàm sumif nhưng hình như hơi dài, vì còn rất nhiều sheet chi tiết như vậy nữa, mình chỉ đưa ra 3sheet VD thoi. bạn thử xem còn cách nào khác không nha. có thể dùng 1 danh mục khoản mục làm trung gian không?
    Mình không biết nói vậy có khó hiểu không nữa.
     

    Các file đính kèm:

  13. connhangheo

    connhangheo Thành viên thường trực

    theo em thì bác gộp tất cả các khoản mục của tất cả các sheet vào cùng 1 sheet rồi dùng hàm sumif hay hàm sumproduct cũng được
     
  14. anhtuan1066

    anhtuan1066 Thành viên gạo cội

    Có 1 cách tổng quát cho trường hợp của bạn... Nhưng bạn phải sửa lại đôi chút... : Bạn sữa lại tên tất cả các sheet (trừ TH) thành nguyên mẫu Sheet1, Sheet2, Sheet3... vân vân... rồi tạo công thức sau:
    Mã:
    =SUMPRODUCT(SUMIF(INDIRECT("'Sheet"&ROW(INDIRECT("1:3"))&"'!$C$10:$C$21"),C10,INDIRECT("'Sheet"&ROW(INDIRECT("1:3"))&"'!$E$10:$E$21")))
    Chú ý ngay chổ INDIRECT("1:3")... ở đây là 3 sheet, nếu bạn có 30 sheet thì sữa thành INDIRECT("1:30")...
    Cách này dc cái là số lượng sheet càng nhiều bạn càng thấy sự thuận lợi của nó... Hiện công thức hơi dài hơn công thức của bạn... Nhưng từ 4 sheet trở lên thì độ dài công thức vẫn ko đổi...
    Cách thì có đấy! Tuy nhiên tôi vẫn ũng hộ việc gôm chung dử liệu thành 1 sheet, dễ tổng hợp hơn!
    Mến
    ANH TUẤN
     
    myhau212 thích bài này.
  15. emnhattrendoi

    emnhattrendoi Thành viên mới

    Cám ơn bạn. Mình thử công thức của bạn nhưng báo lỗi #REF!, không biết sai chỗ nào nữa. bạn chỉ lại giùm mình với.
    những dữ liệu đó mình phải báo cáo theo từng phòng ban. việc thực hiện của từng phòng ban có đúng kế hoạch đề ra hay không nên khó để gôm lại thành 1 sheet.
    Mình không hiểu về hàm Indirect lắm ( dù đã đọc qua sách ), bạn có thể giải thích rõ hơn về hàm này không.
    Cám ơn nhiều nhé
     
  16. anhtuan1066

    anhtuan1066 Thành viên gạo cội

    Đây... làm cho bạn đây... xem file nhé... công thức nằm trong cell màu vàng ấy
    Làm xong còn phát hiện bạn sai ngay dòng 11, đáng lý AB phải có kết quả =10.000 còn công thức của bạn lại ra kết quả 7.000
    Công thức này có 1 cái lợi là dù bạn có bao nhiêu sheet thì công thức vẫn thế... chỉ phải sửa lại chổ INDIRECT("1:....)
    Mến
    ANH TUẤN
     

    Các file đính kèm:

  17. connhangheo

    connhangheo Thành viên thường trực

    em ko hiểu chỗ row(indirect("1:3")) nghĩa là thế nào, mong bác giải thích giúp. (dùng indirect thế này em thấy hơi là, chẳng hiểu gì :) )
     
  18. anhtuan1066

    anhtuan1066 Thành viên gạo cội

    Lý ra thì chỉ cần ROW($1:$3) cũng đũ rồi... ko cần INDIRECT phía trước làm gì (tại tôi quen tay..hi..hi)... INDIRECT sẽ cần thiết nếu ta có 1 cell nào đó đếm số sheet.. Và nếu làm thật kỹ thì tôi sẽ dùng thêm hàm CELL("filename") đễ trích ra con số thứ tự của tên sheet cuối cùng và sẽ tạm xem số này chính là số lượng sheet nếu như tên sheet là mặc định... (lòng vòng quá nhỉ)
    Cái này chỉ là tạo 1 mãng từ 1 đến 3 mà thôi... Nếu thay = 1:30 sẽ thành 1 mãng từ 1 đến 30
    Đây là kỹ thuật mánh khóe khi ta muốn tạo 1 số thứ tự nào đó, chẳng hạn muốn tạo số thứ tự từ 1 đến 10 ta sẽ tận dụng hàm ROW trong trường hợp này
    Ví dụ mãng {1,2,3,4,5,6,7,8,9,10} sẽ tương đương với công thức mãng ROW($1:$10)...
    Nếu bạn chịu khó theo dỏi các file trích dử liệu duy nhất ko dùng VBA bạn sẽ thấy người ta thường áp dụng kỹ thuật này...
    Tôi tất nhiên hiểu rõ nó đễ làm cái gì nhưng ko biết giãi thích sao cho thật dễ hiểu nữa đây... (món này chắc phải nhờ thầy giáo ttphong2007)
    ANH TUẤN
     
    Lần chỉnh sửa cuối: 21 Tháng mười hai 2007
  19. tranghaiduong

    tranghaiduong Thành viên mới

    Chuyển hàng thành cột

    Xin chào tất cả các thành viên của diễn đàn. Em xin hỏi có cách nào chuyển hàng thành cột trong excel ko để khi thay đổi giá trị của hàng thì cột tự động thay đổi theo. Bác nào biết thì giúp em với. Em cảm ơn.
    VD: Em muốn chuyển hàng ngang của bảng V: Dòng tiền tệ (cụ thể là hàng tính tổng dòng tiền chi phí của chủ đầu tư và dự án thành cột các loại chi phí ở bảng phân tích hiệu ích tài chính của dự án (cột giá trị thứ 2 sau VĐT mà khi thay đổi hàng ngang ở bảng V thì cột đó tự thay đổi theo).
     

    Các file đính kèm:

    Lần chỉnh sửa cuối: 3 Tháng tư 2008
    Shopngoo thích bài này.
  20. anhtuan1066

    anhtuan1066 Thành viên gạo cội

    Hoàn toàn có thể làm dc bằng rất nhiều công thức:
    1> TRANSPOSE
    2> INDIRECT
    3> OFFSET
    4> INDEX
    vân vân và vân vân...
    Nhưng nói cho cùng thì kết quả chỉ có thể đúng trong dử liệu cụ thể nào đó... tức là bạn đưa file lên, hiểu ko?
    ANH TUẤN
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này