Hàm dò tìm dữ liệu theo địa chỉ dạng text

Liên hệ QC

thuyyeu99

Trùm Nhiều Chuyện
Tham gia
6/6/08
Bài viết
1,729
Được thích
875
Em có danh sách các địa chỉ là A1+A3+A5+A7+A9 (dạng tetxt). như vậy mình có cách nào dò tìm dữ liệu theo địa chỉ trên không (Tương tự như hàm INDIRECT()).Nếu được nhờ các anh chị hướng dẫn giúp.
Cám ơn các anh chị quan tâm
 
dạ nếu được nhờ anh tạo giùm em cái UDF
Thử code này xem:
PHP:
Function GetVal(RngText As String)
  Dim Tmp As String, Clls As Range
  Application.Volatile
  On Error Resume Next
  Tmp = Replace(RngText, "+", ",")
  For Each Clls In Range(Tmp)
    If Clls <> "" Then GetVal = Clls
  Next
End Function
Ngoài ra tôi nghĩ bài này có thể dùng công thức được đấy ---> Mời các cao thủ thử sức xem!
 

File đính kèm

Upvote 0
Em cung mới suu tầm được cái UDF lam bằng lệnh Find còn cái vụ công thức thì Hichic. Nếu mà làm được bằng công thức thì các anh nhớ thêm dấu bằng vào A1+C1+E1+G1 (=A1+C1+E1+G1) nhé
 
Upvote 0
Em cung mới suu tầm được cái UDF lam bằng lệnh Find còn cái vụ công thức thì Hichic. Nếu mà làm được bằng công thức thì các anh nhớ thêm dấu bằng vào A1+C1+E1+G1 (=A1+C1+E1+G1) nhé
Code ở trên vẫn chưa hoàn chỉnh đâu!
Lấy ví dụ tại cell I1, thay vì gõ A1+C1+E1+G1, bạn đảo lại thành G1+A1+C1+E1 (tức cột lớn hơn đứng trước) thì đồng chí UDF sẽ cho kết quả sai ngay
Các bạn thử nghĩ sẽ cải tiến lại code như thế nào đây?
Ẹc... Ẹc...
Dùng Find cũng là 1 cách (bạn thử đưa code ấy lên tham khảo với)...
Nói chung thì tạo code chẳng khó gì, cái ăn tiền ở đây là làm sao biết cột nào là cột lớn nhất (cột cuối cùng) có dữ liệu trong trường hợp chuổi của ta không nhập đúng thứ tự
 
Upvote 0
Dạ anh nói đúng cách này cũng bị tình trạng tương tự như code của anh
On Error Resume Next
lrw = rng.Find(What:="*", _
After:=rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0

On Error Resume Next
lcol = rng.Find(What:="*", _
After:=rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0

On Error Resume Next
Last1 = rng.Parent.Cells(lrw, lcol).Address(False, False)
If Err.Number > 0 Then
Last1 = rng.Cells(1).Address(False, False)
Err.Clear
End If
On Error GoTo 0

End Select
 
Upvote 0
Dạ anh nói đúng cách này cũng bị tình trạng tương tự như code của anh
Thử tiếp UDF tôi vừa cải tiến xong!
PHP:
Function GetVal(RngText As String)
  Dim Clls As Range
  Application.Volatile
  On Error Resume Next
  For Each Clls In Range(Replace(RngText, "+", ":"))
    If Not Intersect(Clls, Range(Replace(RngText, "+", ","))) Is Nothing Then
      If Clls <> "" Then GetVal = Clls
    End If
  Next
End Function
Quan trọng nằm ở chổ này: Range(Replace(RngText, "+", ":")) ---> Nó biến 1 vùng rời rạc thành 1 vùng liên tục ---> Từ đó ta sẽ duyệt các cell trong vùng này rồi xét giao điểm với vùng gốc (chính là Range(Replace(RngText, "+", ",")) ) ---> Nếu giao điểm ấy có dữ liệu thì lấy
Vậy thôi!
Ghi chú: Giải thuật được lấy từ bài viết này:
http://www.giaiphapexcel.com/forum/showthread.php?t=7146&p=221532#post221532
 

File đính kèm

Upvote 0
Anh cho em hoi chút xíu về Application.Volatile
Sao Em dùng cong thức GetVal ở sheet1 và em qua Sheet 2 và chở về sheet1 lại thì hàm GetVal không chạy ?
 
Upvote 0
Anh cho em hoi chút xíu về Application.Volatile
Sao Em dùng cong thức GetVal ở sheet1 và em qua Sheet 2 và chở về sheet1 lại thì hàm GetVal không chạy ?
Chính vì lý do hàm không tự cập nhật nên tôi phải dùng Application.Volatile ---> Có cái này vào, ta sẽ có thể bấm F9 cho hàm cập nhật lại giá trị mới
Bạn thử F9 xem!
 
Upvote 0
nấu ở Sheet chứa công thức thì nó chạy nhưng ờ Sheet khác thì nó cũng im re
 
Upvote 0
nấu ở Sheet chứa công thức thì nó chạy nhưng ờ Sheet khác thì nó cũng im re
Ái chà... còn vụ này nữa chứ!!!
Vậy thì sửa lại thế này xem:
PHP:
Function GetVal(RngText As Range)
  Dim Clls As Range
  Application.Volatile
  On Error Resume Next
  For Each Clls In RngText.Parent.Range(Replace(RngText, "+", ":"))
    If Not Intersect(Clls, RngText.Parent.Range(Replace(RngText, "+", ","))) Is Nothing Then
      If Clls <> "" Then GetVal = Clls
    End If
  Next
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh giải thích Parent gíup em được không ạh
 
Upvote 0
Anh giải thích Parent gíup em được không ạh
Parent là CHA MẸ ---> RngText là vùng dữ liệu mà ta chọn làm tham chiếu, như trong file thì RngText là cell I1
Vậy CHA MẸ của cell I1 ---> chính là sheet chứa cell I1
Vậy:
RngText.Parent.Range(...)
tương đương với:
Sheet1.Range(...)
Với Sheet1 chính là sheet chứa RngText
 
Upvote 0
Web KT

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

Back
Top Bottom