2012-12-12 34 views

Trả lời

3

Chức năng này trả lại cho bạn danh sách các ô nguồn được phân cách bằng dấu phẩy (tiền lệ):

 
Function References(rngSource As Range) As Variant 
    Dim rngRef As Range 
    Dim strTemp As String 
    On Error Resume Next 
    For Each rngRef In rngSource.Precedents.Cells 
     strTemp = strTemp & ", " & rngRef.Address(False, False) 
    Next 
    If Len(strTemp) 0 Then strTemp = Mid(strTemp, 3) 
    References = strTemp 
End Function 

Tuy nhiên, xin lưu ý rằng bạn không thể sử dụng điều này làm UDF trong trang tính, vì không may là rngRef.Address gây ra tham chiếu vòng tròn. Tuy nhiên, bạn có thể sử dụng nó trong một quy trình nhỏ để điền một cột khác, ví dụ:

 
Sub ShowPrecedents() 
    Dim rng As Range 
    'Will paste precedents of A1:A6 into D1:D6 
    For Each rng In Range("D1:D6") 
     rng.Value = References(rng.Offset(, -3)) 
    Next 
End Sub 
+0

Sẽ hoạt động đối với các tham chiếu trang tính cục bộ, nhưng không hoạt động đối với tài liệu tham khảo ngoài trang tính. – brettdj

1

Chỉ cần cung cấp cho bạn một sự thay thế ... Lưu ý rằng đây sẽ trả về kết quả trùng lặp nếu các tế bào được gọi là nhiều hơn một lần

Sub testing() 
Dim result As Object 
Dim r As Range 
Dim testExpression As String 
Dim objRegEx As Object 

Set r = Cells(1, 2) ' INPUT THE CELL HERE , e.g. cells("A1") 
Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.IgnoreCase = True 
objRegEx.Global = True 
objRegEx.Pattern = """.*""" ' remove expressions 
testExpression = CStr(r.Formula) 
testExpression = objRegEx.Replace(testExpression, "") 
objRegEx.Pattern = "(([A-Z])+(\d)+)" 'grab the address 

If objRegEx.test(testExpression) Then 
    Set result = objRegEx.Execute(testExpression) 
    If result.Count > 0 Then 
     For Each Match In result 
      Debug.Print Match.Value 
     Next Match 
    End If 
End If 
End Sub 

Kết quả được lưu trữ trong "Match.Value"

5

Đây là bản cập nhật cho:

Sẽ hoạt động đối với tham chiếu trang tính cục bộ chứ không phải cho tài liệu tham khảo ngoài trang tính. - brettdj 14 Tháng 5 '14 lúc 11:55

Bởi Sử dụng phương pháp Larrys, chỉ cần thay đổi objRegEx.Pattern tới:

(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?|\$?[A-Z]+:\$?[A-Z]+|(\$?[A-Z]+\$?(\d)+)) 

này sẽ:

  1. Tìm kiếm Liên kết ngoài tùy chọn : (['].*?['!])?
  2. Tìm kiếm tham chiếu Bảng tùy chọn: ([[A-Z0-9_]+[!])?
  3. Làm như sau ps để ưu tiên:
  4. Tìm kiếm dãy với số lượng hàng (Và tùy chọn $): \$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?
  5. Tìm kiếm dãy chưa có số hàng (Và tùy chọn $): \$?[A-Z]+:\$?[A-Z]+
  6. Tìm kiếm tài liệu tham khảo 1 cell (Và tùy chọn $): (\$?[A-Z]+\$?(\d)+)

Hệ quả này:

Sub testing() 
Dim result As Object 
Dim r As Range 
Dim testExpression As String 
Dim objRegEx As Object 

Set r = Cells(1, 2) ' INPUT THE CELL HERE , e.g. RANGE("A1") 
Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.IgnoreCase = True 
objRegEx.Global = True 
objRegEx.Pattern = """.*?""" ' remove expressions 
testExpression = CStr(r.Formula) 
testExpression = objRegEx.Replace(testExpression, "") 
objRegEx.Pattern = "(([A-Z])+(\d)+)" 'grab the address 

objRegEx.Pattern = "(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?|\$?[A-Z]+:\$?[A-Z]+|(\$?[A-Z]+\$?(\d)+))" 
If objRegEx.test(testExpression) Then 
    Set result = objRegEx.Execute(testExpression) 
    If result.Count > 0 Then 
     For Each Match In result 
      Debug.Print Match.Value 
     Next Match 
    End If 
End If 
End Sub 

việc làm này, sẽ cung cấp cho bạn các giá trị của tất cả các tài liệu tham khảo càng tốt, tôi có thể nghĩ của. (Cập nhật bài đăng này, bởi vì tôi cần giải quyết vấn đề).

+0

Rất đẹp. Một cách tiếp cận khác có thể đơn giản hơn là sử dụng thuộc tính 'FormulaR1C1' vì có thể dễ dàng phân tích cú pháp đó hơn kiểu mặc định địa chỉ' A1'. Cách tiếp cận của bạn có vẻ như nó ở một số cách vượt trội so với cách tiếp cận trong câu trả lời được chấp nhận ở chỗ nó có thể phân biệt giữa các tham chiếu tuyệt đối và tương đối.Mặt khác, không có sửa đổi lớn, cách tiếp cận của bạn sẽ không thể xác định các dải ô được đặt tên (câu trả lời được chấp nhận vẫn chọn). Một phương pháp lai có thể là giải pháp tối ưu. –

+0

Tôi đã thử điều này trên một ô có chứa công thức sau: = IF (ISBLANK ('Dữ liệu CU68X'! $ A9), "", NẾU ($ B45 & $ C45 & $ D45 & $ E45 = 'Dữ liệu CU68X'! D9 & 'Dữ liệu CU68X' ! E9 & 'Dữ liệu CU68X'! Dữ liệu F9 & 'CU68X'! G9, 'Dữ liệu CU68X'! $ Y9, "Lỗi trạng thái")). Nó chỉ trả lại tài liệu tham khảo đầu tiên ($ A9) ... làm thế nào đến ?? – Dan

+0

Dòng này phải được thay đổi: ' 'objRegEx.Pattern = '' ' '' *.?'' Xóa expressions'
Ngoài ra, bạn sẽ phải thay đổi các biểu thức cho dưới đây, để nắm bắt công thức của bạn chính xác:
'objRegEx.Pattern =" ([']. *? ['!])? ([[A-Z0-9 _] + [!])? (\ $? [AZ] + \ $? (\ d) + (: \ $? [AZ] + \ $? (\ d) +)? | \ $? [AZ] +: \ $? [AZ] + | (\ $? [AZ] + \ $? (\ d) +)) "'
(Chỉ nhập "?" trong nhóm đầu tiên, để ngăn chặn nhóm này quá tham lam) –

Các vấn đề liên quan