hongphuong1997
Thành viên tiêu biểu
![](/diendan/data/PhoToDanhHieu/pip.gif)
- Tham gia
- 12/11/17
- Bài viết
- 771
- Được thích
- 321
- Giới tính
- Nữ
=SUBSTITUTE(IF(A1=1," ",J22&IFERROR("; "&INDIRECT(TEXT(AGGREGATE(15,6,(COLUMN(D21:H23)+ROW(D21:H23)*1000)/SEARCH(C5,D5:H7)/SEARCH(C9,D9:H11)/SEARCH(C13,D13:H15)/SEARCH(C17,D17:H19),A1-1),"R0C000"),0),""))," ; ","")
Đây em xem nhé.Dùng như hàm sumifs.Anh ơi, quy luật tham chiếu giống hàm sumifs
-Nhưng nó là tìm kiếm trong chuỗi
-Và kết quả trả về không phải là tính tổng
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String, min1 As Long, min2 As Long
min1 = 10000: min2 = 10000
Set dic = CreateObject("scripting.dictionary")
For k = LBound(mang) To UBound(mang) Step 2
arr = mang(k).Value
If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
Next k
arr = tong.Value
If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
For i = 1 To min1
For j = 1 To min2
dic.Add i & "#" & j, arr(i, j)
Next j
Next i
For k = LBound(mang) To UBound(mang) Step 2
arr = mang(k).Value
dk = mang(k + 1).Value
For i = 1 To min1
For j = 1 To min2
If UCase(dk) <> UCase(arr(i, j)) Then
If dic.exists(i & "#" & j) Then
dic.Remove (i & "#" & j)
End If
End If
Next j
Next i
Next k
arr = dic.keys
For i = LBound(arr) To UBound(arr)
If s = Empty Then
s = dic.Item(arr(i))
Else
s = s & ";" & dic.Item(arr(i))
End If
Next i
laygiatri = s
End Function
Em cảm ơn anh rất nhiềuĐây em xem nhé.Dùng như hàm sumifs.
Mã:Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String, min1 As Long, min2 As Long min1 = 10000: min2 = 10000 Set dic = CreateObject("scripting.dictionary") For k = LBound(mang) To UBound(mang) Step 2 arr = mang(k).Value If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1) If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2) Next k arr = tong.Value If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1) If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2) For i = 1 To min1 For j = 1 To min2 dic.Add i & "#" & j, arr(i, j) Next j Next i For k = LBound(mang) To UBound(mang) Step 2 arr = mang(k).Value dk = mang(k + 1).Value For i = 1 To min1 For j = 1 To min2 If UCase(dk) <> UCase(arr(i, j)) Then If dic.exists(i & "#" & j) Then dic.Remove (i & "#" & j) End If End If Next j Next i Next k arr = dic.keys For i = LBound(arr) To UBound(arr) If s = Empty Then s = dic.Item(arr(i)) Else s = s & ";" & dic.Item(arr(i)) End If Next i laygiatri = s End Function
Anh ơi!Không hiểu lắm.Khi hàm sumif bằng không thì làm gì còn ký tự nào.Em xem lại xem.Không thì nói rõ chỗ nào không đúng nhé.À ý em là có kết quả tìm ngược lại à.
Trường hợp đơn thuần là sao nhỉ.Anh ơi!
Anh hiểu ý của em một tý anh ơi
Chuỗi là gồm nhiều ký tự
Trong khi đó tìm ký tự trong chuỗi mà anh.
** Và tìm kiếm các ký tự trong các chuỗi đó để thành kết quả như của anh đó
(Kết quả của anh chỉ đúng với trường hợp đơn thuần thôi anh àh)
Anh ơi anh đang tìm là cả cụm "abc"Trường hợp đơn thuần là sao nhỉ.
Hi hi... em cảm ơn anhÀ hiểu.vậy mai anh chỉnh.Tại em bảo làm giống hàm sumifs.Chứ không phải là tương đối.
AnhĐổi lại công thức:
Mã:=SUBSTITUTE(IF(A1=1," ",J22&IFERROR("; "&INDIRECT(TEXT(AGGREGATE(15,6,(COLUMN(D21:H23)+ROW(D21:H23)*1000)/SEARCH(C5,D5:H7)/SEARCH(C9,D9:H11)/SEARCH(C13,D13:H15)/SEARCH(C17,D17:H19),A1-1),"R0C000"),0),""))," ; ","")
Dùng ParamArray rất hay và hợp với bài nàyĐây em xem nhé.Dùng như hàm sumifs.
Mã:Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String, min1 As Long, min2 As Long min1 = 10000: min2 = 10000 Set dic = CreateObject("scripting.dictionary") For k = LBound(mang) To UBound(mang) Step 2 arr = mang(k).Value If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1) If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2) Next k arr = tong.Value If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1) If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2) For i = 1 To min1 For j = 1 To min2 dic.Add i & "#" & j, arr(i, j) Next j Next i For k = LBound(mang) To UBound(mang) Step 2 arr = mang(k).Value dk = mang(k + 1).Value For i = 1 To min1 For j = 1 To min2 If UCase(dk) <> UCase(arr(i, j)) Then If dic.exists(i & "#" & j) Then dic.Remove (i & "#" & j) End If End If Next j Next i Next k arr = dic.keys For i = LBound(arr) To UBound(arr) If s = Empty Then s = dic.Item(arr(i)) Else s = s & ";" & dic.Item(arr(i)) End If Next i laygiatri = s End Function
Đây em xem.Anh ơi anh đang tìm là cả cụm "abc"
Nhưng ý của em là tìm ký tự "a" trong cụm "abc" anh à
Em cảm ơn anh!
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String
Set dic = CreateObject("scripting.dictionary")
arr = tong.Value
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
dic.Add i & "#" & j, arr(i, j)
Next j
Next i
For k = LBound(mang) To UBound(mang) Step 2
arr = mang(k).Value
dk = mang(k + 1).Value
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
If InStr(arr(i, j), dk) = 0 Then
If dic.exists(i & "#" & j) Then
dic.Remove (i & "#" & j)
End If
End If
Next j
Next i
Next k
arr = dic.keys
For i = LBound(arr) To UBound(arr)
If s = Empty Then
s = dic.Item(arr(i))
Else
s = s & ";" & dic.Item(arr(i))
End If
Next i
laygiatri = s
End Function
Tìm từng "chuỗi con" trong "chuỗi khác", nếu có thì lấy kết quả tương ứng trong vùng kết quả , nếu có nhiều kết quả thì nối lại với nhau bằng dấu phẩy? Cho kết quả mẫu cũng kèm giải thích kết quả lấy từ đâu, điều kiện nào thì lấy.Anh ơi anh đang tìm là cả cụm "abc"
Nhưng ý của em là tìm ký tự "a" trong cụm "abc" anh à
Em cảm ơn anh!
Vẫn sai anh oiĐây em xem.
Mã:Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String Set dic = CreateObject("scripting.dictionary") arr = tong.Value For i = 1 To UBound(arr, 1) For j = 1 To UBound(arr, 2) dic.Add i & "#" & j, arr(i, j) Next j Next i For k = LBound(mang) To UBound(mang) Step 2 arr = mang(k).Value dk = mang(k + 1).Value For i = 1 To UBound(arr, 1) For j = 1 To UBound(arr, 2) If InStr(arr(i, j), dk) = 0 Then If dic.exists(i & "#" & j) Then dic.Remove (i & "#" & j) End If End If Next j Next i Next k arr = dic.keys For i = LBound(arr) To UBound(arr) If s = Empty Then s = dic.Item(arr(i)) Else s = s & ";" & dic.Item(arr(i)) End If Next i laygiatri = s End Function
Em cảm ơn anhTìm từng "chuỗi con" trong "chuỗi khác", nếu có thì lấy kết quả tương ứng trong vùng kết quả , nếu có nhiều kết quả thì nối lại với nhau bằng dấu phẩy? Cho kết quả mẫu cũng kèm giải thích kết quả lấy từ đâu, điều kiện nào thì lấy.
Hoang mang quá!
Anh snow25 ơi. làm giống như bài của anhChỗ nào vậy ta.
Bạn nhập thủ công kết quả bạn muốn có đi, tôi sẽ cố hiểu và viết "nhiều mảng" cho bạn.Em cảm ơn anh
@Ba Tê
Đúng roài anh ơi
Nhưng của anh sao làm được có mỗi 1 mảng anh ơi
Anh làm thêm cho em nhiều mảng với anh
Anh ơi bài của anh như thế là đúng rồi anh àBạn nhập thủ công kết quả bạn muốn có đi, tôi sẽ cố hiểu và viết "nhiều mảng" cho bạn.
Sao bạn cứ "SumIf" hoài vậy, cứ giải thích cách lấy kết quả, điều kiện lấy, nếu người khác hiểu là được, chẳng liên quan gì đến SUMIF cả.Anh ơi bài của anh như thế là đúng rồi anh à
Bây giờ anh thêm mảng và điều kiện nữa thôi anh à
(Tức là tham chiếu giống như kiểu hàm sumifs)
Tức là các mảng có kích thước bằng nhau và các điều kiện cùng nằm vị trí các ô của các mảng đó anh
Ba Tê