Hàm dò tìm dữ liệu theo địa chỉ dạng text (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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
 
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
Không biết có phải tìm địa chỉ ô hay không? Bạn xem bài này có đúng như ý Bạn chưa nhé?
 

File đính kèm

Upvote 0
dạ tất cả các địa chỉ nàm trong 1 ô và cách nhau là dấu + (A1+A3+A5+A7+A9), tức là em muốn tìm trên A1 rồi A3..... theo như cái địa chỉ em ghi như ở trên
 
Lần chỉnh sửa cuối:
Upvote 0
Hay là Bạn thử đưa file lên xem sao. Giải thích rõ luôn nhé.
 
Upvote 0
Function addtxt(arr As Range)
Dim rng As Range
Dim tam As String
For Each rng In arr
If Not IsNumeric(rng) Then
tam = tam & rng.Address & "+"
End If
Next
If tam = "" Then
addtxt = ""
Else
addtxt = Left(tam, Len(tam) - 1)
End If
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Function addtxt(arr As Range)
Dim rng As Range
Dim tam As String
For Each rng In arr
If Not IsNumeric(rng) Then
tam = tam & rng.Address & "+"
End If
Next
If tam = "" Then
addtxt = ""
Else
addtxt = Left(tam, Len(tam) - 1)
End If
End Function
Đọc code của bạn hoangminhtien lại thấy chả giống tí nào so với mô tả của tác giả! Nhưng bạn thuyyeu99 đã THANKS, chứng tỏ bạn đồng ý với code này!
Vậy là sao ta?
Theo code của hoangminhtien thì yêu cầu phải được mô tả thế này mới đúng:
- Tìm trong 1 vùng nào đó
- Thu thập địa chỉ cell, nơi chưa dữ liệu dạn TEXT
- Nối các địa chỉ cell đã tìm được thành 1 chuổi ngăn cách nhau bởi dấu cộng (+)

--------------------
Hic... Còn tác giả mô tả... nói thật tôi chẳng hiểu gì
 
Upvote 0
Em hiểu nhầm bài toán, em nghĩ là từ dãy đưa ra địa chỉ các ô chứa dạng text, bây giờ mới hiểu đề. các bác xem file có đúng không nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Như mình hiểu thì cần xài macro này:

PHP:
Option Explicit
Sub InDiRect()
 Dim Arr, jJ As Byte
 
 Arr = Split(Selection.Value, "+")
 For jJ = 0 To UBound(Arr)
   With [D65500].End(xlUp).Offset(1)
      .Value = Range(Arr(jJ)).Value
   End With
 Next jJ
End Sub

Giải thích:
Giả dụ tại [H1] ta đang chọn chứa chuỗi A1+A3+A5+A7+A9+A11+B2

Macro trên sẽ liệt kê tuần tự giá tri các ô chứa trong chuỗi này tại các dòng của cột 'D'--=0
 
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dạ anh NDU nói đúng ạh, tại vì tự nhiên máy em không vô mạng được nên mới không trả lời được. Hì
 
Upvote 0
Sử dụng những hàm nào cho dạng bài tập này?

Mình có 1 file có 3 sheet trong đó sheet Flowchart dùng để báo cáo. Khi mình bấm vào ô B4 thì sẽ chọn được loại mã hàng tương ứng với các số liệu. Bài này trước kia có bạn minhtien.hoang đã giúp mình rồi. tuy nhiên khi mình mở rộng phần dữ liệu thì có mã được mã lại không được. Các bạn giúp mình với.(Và có những cách nào để thực hiện được điều này). Cảm ơn rất nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Sử dụng những hàm nào cho dạng bài tập này?

Mình có 1 file có 3 sheet trong đó sheet Flowchart dùng để báo cáo. Khi mình bấm vào ô B4 thì sẽ chọn được loại mã hàng tương ứng với các số liệu. Bài này trước kia có bạn minhtien.hoang đã giúp mình rồi. tuy nhiên khi mình mở rộng phần dữ liệu thì có mã được mã lại không được. Các bạn giúp mình với.(Và có những cách nào để thực hiện được điều này). Cảm ơn rất nhiều.
 

File đính kèm

Upvote 0
Mình có 1 file có 3 sheet trong đó sheet Flowchart dùng để báo cáo. Khi mình bấm vào ô B4 thì sẽ chọn được loại mã hàng tương ứng với các số liệu. Bài này trước kia có bạn minhtien.hoang đã giúp mình rồi. tuy nhiên khi mình mở rộng phần dữ liệu thì có mã được mã lại không được. Các bạn giúp mình với.(Và có những cách nào để thực hiện được điều này). Cảm ơn rất nhiều.
Bạn xem đã được chưa ?
 
Upvote 0
Nhờ các anh hướng dẫn em thêm 1 vấn đề nữa
bây giờ em có đoạn text là A1+E1+C1 vậy mình có cách nào xác định trong Range("A1,E1,C1") ô nào chứa dữ liệu không ạh (nhưng phải theo số thứ tự của cột tức là từ cột nhỏ cho đến cột lớn A1 - C1 - E1 . Nếu A1,C1,E1 đều có dữ liệu thì láy địa chỉ ô có cột lớn nhất là E1
 
Upvote 0
Nhờ các anh hướng dẫn em thêm 1 vấn đề nữa
bây giờ em có đoạn text là A1+E1+C1 vậy mình có cách nào xác định trong Range("A1,E1,C1") ô nào chứa dữ liệu không ạh (nhưng phải theo số thứ tự của cột tức là từ cột nhỏ cho đến cột lớn A1 - C1 - E1 . Nếu A1,C1,E1 đều có dữ liệu thì láy địa chỉ ô có cột lớn nhất là E1
Giả sử bạn gõ chuổi A1+E1+C1 vào cell A2
Vậy thử code này xem thế nào:
PHP:
Sub Test()
  Dim Tmp As String
  On Error Resume Next
  Tmp = Replace(Range("A2"), "+", ",")
  With Range(Tmp).SpecialCells(2, 2)
    MsgBox Intersect(Range(Replace(.Address, ",", ":")).EntireColumn.Resize(, 1), .Cells)(1, 1).Address
  End With
End Sub
Test giùm nhé ---> Không chắc lắm
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ồ hình như nó chạy chưa ổn anh ạh. Dữ liệu các ô chỉ nằm trên 1 dòng thôi anh
 
Lần chỉnh sửa cuối:
Upvote 0
Ồ hình như nó chạy chưa ổn anh ạh. Dữ liệu các ô chỉ nằm trên 1 dòng thôi anh
Chưa ổn trong trường hợp nào? Bạn cho file lên xem thử nhé
Thêm nữa, lúc nảy tôi cứ nghĩ bạn tìm dữ liệu dạng TEXT nên mới dùng SpecialCells(2,2) ---> Nếu là mọi kiểu dữ liệu thì sửa lại thành SpecialCells(2) là được
Ngoài ra bạn nên cho biết thêm: Dữ liệu ấy là dữ liệu thô hay có công thức? (Dạng này phải sửa lại code mới được)
 
Lần chỉnh sửa cuối:
Upvote 0
dạ nếu được nhờ anh tạo giùm em cái UDF
 
Upvote 0
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

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

Back
Top Bottom