Tạo liên kết hai chiều trong Excel cũng sử dụng dữ liệu
Vì vậy, đây là tình thế khó khăn của tôi...Tôi nhận ra rằng điều này hơi phức tạp, đó là lý do tại sao tôi không biết làm thế nào để đến được nơi mình cần đến. Nó sẽ mất một chút giải thích, vì vậy hãy gắn bó với tôi.
Tôi sẽ có các trang tính chứa thông tin mà tôi sẽ gọi là "bản ghi". Có hai trong số đó cho mỗi dự án và sẽ có nhiều trang web cho mỗi dự án. Sau đó, tôi cũng sẽ có một định dạng "báo cáo" về thông tin về cơ bản sắp xếp nó ở định dạng dễ sử dụng có thể nhanh chóng được xem, thay đổi hoặc gửi cho khách hàng. Tôi cần báo cáo này được liên kết trở lại với "hồ sơ" của tôi nhưng tôi cũng cần "hồ sơ" để cập nhật "báo cáo". Tôi đã tìm thấy mã VBA bên dưới, mã này tôi chắc chắn sẽ hoạt động.
Private Sub Workbook_TwoWayMatch(ByVal Sh As Object, ByVal Target As Range) If UCase(Sh.Name) = "sheet1" Or UCase(Sh.Name) = "sheet2" Then If Not Application.Intersect(Target, Range("A1")) Is Nothing Then Application.EnableEvents = False If UCase(Target.Parent.Name) = "SHEET1" Then Sheets("Sheet2").Range("A1") = Target Else Sheets("Sheet1").Range("A1") = Target End If Application.EnableEvents = True End If End If End Sub
Tuy nhiên, điều khó khăn là tôi không chỉ cần liên kết thông tin mà nó cần được sắp xếp lại trong quá trình này. Đây là điểm mà tôi không biết phải tiến hành như thế nào. Tôi có thể sắp xếp lại thông tin hoặc tôi có thể liên kết thông tin, nhưng tôi không chắc làm thế nào để kết hợp cả hai lại với nhau.
Liên kết bên dưới chứa sổ làm việc với các ví dụ. Vui lòng bỏ qua tab "đề phòng" đầu tiên của tôi. Hai tab đầu tiên là "hồ sơ". Cuối cùng là "báo cáo." Tôi thực sự không có bất kỳ dữ liệu nào ở đây. Tôi đã cố gắng xây dựng một mẫu.
https://onedrive.live.com/redir?resid=618C0F223F9F63C8%21298
Tôi sẽ đánh giá rất cao phản hồi của bạn!
Cảm ơn.
Trả lời:
Hai tab đầu tiên là "hồ sơ". Cuối cùng là "báo cáo."
Hàng ngàn cách để lột da một con mèo... tất cả "bản ghi" phải liên kết với "báo cáo", điều đó có nghĩa là bạn có thể sử dụng một công thức trong "báo cáo" để lấy dữ liệu từ một "bản ghi", ví dụ: 'Mẫu dự án mới'! A6
Đây là phần khó khăn:
a) Bạn phải chọn một ô duy nhất trong "báo cáo" (có công thức). Khi lựa chọn thay đổi, chúng ta có thể lấy địa chỉ của ô "bản ghi" nếu có và nó ở đâu.
b) Khi bạn ghi đè công thức này trong "báo cáo" bằng một giá trị, chúng tôi biết rằng đã có một công thức. Vì vậy, chúng tôi có thể ghi giá trị vào địa chỉ này và sau đó khôi phục công thức.
Sao chép mã bên dưới vào mô-đun mã của trang "báo cáo".
Andreas.
Tùy chọn rõ ràng
Làm mờ LastRef()
Private Sub Worksheet_Change(ByVal Target As Range)
'Có một công thức ở đó?
Nếu UBound(LastRef) < 0 thì thoát Sub
Nếu Target.Count > 1 thì GoTo ExitPoint
'Đừng chạm vào công thức
Nếu Target.HasFormula thì GoTo ExitPoint
Application.EnableEvents = Sai
'Ghi giá trị vào sheet khác
Application.Range(LastRef(0)) = Mục tiêu
'Khôi phục công thức
Target.Formula = "=" & LastRef(0)
Application.EnableEvents = True
Điểm thoát:
'Xong
LastRef = Array()
kết thúc phụ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
LastRef = Array()
Nếu Target.Count > 1 thì Thoát Sub
'Lấy liên kết đến ô trong trang tính khác
LastRef = GetDirectPrecedents(Target)
kết thúc phụ
Hàm riêng GetDirectPrecedents(R As Range) Là biến thể
'Trả về một mảng các chuỗi với tất cả các tên phạm vi của tiền lệ trực tiếp của R
' Range.DirectPrecedents không hỗ trợ tham chiếu đến các trang tính hoặc tệp khác, điều này _
chức năng nào.
' Nhưng nó không hỗ trợ các tham chiếu được sử dụng trong công thức GIÁN TIẾP!
Công thức mờ (0 đến 1) dưới dạng biến thể
Dim i As Long, j As Long
Dim InQuotes(0 đến 2) dưới dạng Boolean
Từ điển Dim Dict As Object'
Phím mờ dưới dạng chuỗi
Dim C Theo phạm vi
'Tạo một từ điển để lưu kết quả
Đặt Dict = CreateObject("Scripting.Dictionary")
Dict.CompareMode = vbTextCompare
'Khu vực hỗ trợ
Cho Mỗi C Trong R.Khu Vực
'Nhận công thức trong hai phiên bản
Công thức(0) = C.Công thức
Công thức(1) = C.FormulaR1C1
'Thống nhất các toán tử
Với tôi = 0 Đến 1
Với j = 1 To Len(Công thức(i))
Chọn trường hợp Mid$(Công thức(i), j, 1)
Trường hợp "'"
'Bỏ qua các phần trong tên tập tin
Nếu Không (InQuotes(1) Hoặc InQuotes(2)) Thì InQuotes(0) = Not InQuotes(0)
Trường hợp """"
'Bỏ qua các phần trong chuỗi
Nếu Không (InQuotes(0) Hoặc InQuotes(2)) Thì InQuotes(1) = Not InQuotes(1)
Trường hợp "["
'Bỏ qua các phần trong ngoặc
Nếu Không (InQuotes(0) Hoặc InQuotes(1)) Thì InQuotes(2) = True
Trường hợp "]"
Nếu Không (InQuotes(0) Hoặc InQuotes(1)) Thì InQuotes(2) = Sai
Trường hợp "=", "&", "+", "-", "*", "/", "^", "%", "(", ")", "<", ">", " "
'Thay thế mọi toán tử bằng ASCII 0
Nếu Không (InQuotes(0) Hoặc InQuotes(1) Hoặc InQuotes(2)) Thì Mid$(Công thức(i), j, _
1) = Chr(0)
Kết thúc chọn
Kế tiếp
Kế tiếp
'Chia công thức thành các phần
Với tôi = 0 Đến 1
Công thức(i) = Tách(Công thức(i), Chr(0))
Kế tiếp
'Tìm kiếm sự khác biệt
Cho j = 0 Đến UBound(Công thức(0))
'Nếu các phần không khớp, chúng tôi đã tìm thấy một phạm vi
Nếu StrComp(Công thức(0)(j), Công thức(1)(j), vbTextCompare) <> 0 Thì
'Đã tìm thấy?
Khóa = Thay thế(Công thức(0)(j), "$", "")
Nếu không phải Dict.Exists(Key) thì Dict.Add Key, j
kết thúc nếu
Kế tiếp
Kế tiếp
GetDirectPrecedents = Dict.Keys
chức năng kết thúc
Trả lời:
Tôi đã thử mã ở trên. Những gì nó đã làm là thay đổi tất cả các ngày của tôi thành ngày mà tôi đã nhập, cả trên trang báo cáo và trang hồ sơ. Vì vậy, có điều gì đó không hoàn toàn đúng, nhưng tôi không biết bắt đầu từ đâu.
Liên kết dưới đây hiện có các công thức trên cả trang bản ghi và báo cáo, vì vậy có thể điều đó sẽ hữu ích hơn trong việc cố gắng tìm ra điều này.
https://onedrive.live.com/redir?resid=618C0F223F9F63C8%21298
Cảm ơn bạn một lần nữa cho bất kỳ và tất cả sự giúp đỡ!
Trả lời:
Liên kết dưới đây hiện có các công thức trên cả trang bản ghi và báo cáo, vì vậy có thể điều đó sẽ hữu ích hơn trong việc cố gắng tìm ra điều này.
Điều đó sẽ không bao giờ hoạt động và cũng không thể với các macro khác, bởi vì a) bạn không thể có các công thức phức tạp trong trang báo cáo và b) không thể có các công thức trong trang bản ghi.
- Trong sheet báo cáo, ô D3 hiển thị giá trị từ record sheet F6.
- Bạn nói muốn cập nhật sheet khác khi nhập giá trị.
- Có nghĩa là khi ghi giá trị vào báo cáo D3 thì giá trị này ghi vào bản ghi F6
Điều đó có thể xảy ra với mã của tôi, nhưng chỉ khi D3 chứa công thức ='Mẫu dự án mới'!F6
- Nhưng F6 cũng chứa một công thức, có nghĩa là công thức này sẽ bị ghi đè.
Mã mà bạn đã tìm thấy ở nơi khác sẽ có tác dụng tương tự. Và đó là điểm mà câu chuyện kết thúc.
Andreas.
Comments
Post a Comment