hongphuong1997
Thành viên tiêu biểu

- Tham gia
- 12/11/17
- Bài viết
- 777
- Được thích
- 326
- Giới tính
- Nữ
Em học hay làm vậy mà toàn những dạng này.Thưa thầy cô và các bác, các anh chị!
Trong excel các công thức về dạng số thì quá nhiều, nhưng các công thức về ký tự và dạng chuỗi thì hầu như không có.
Vì vậy cháu muốn có 1 số hàm về dạng ký tự và chuỗi
Vậy mong các bác giúp đỡ.
Anh ơi, em vừa học vừa làm anh àEm học hay làm vậy mà toàn những dạng này.
Không hiểu gì luôn.Em đợi ai vào viết công thức nhé.Anh không biết công thức à.Anh ơi, em vừa học vừa làm anh à
Bởi vì công thức về dạng số thì chỉ áp dụng được cho dạng số
Nhưng mà công thức về dạng chuỗi thì nó sẽ bao quát hơn, nó sẽ làm được cho tất cả các trường hợp anh à
Vì vậy em muốn những dạng tổng quát này hơn
Anh @snow25 viết giúp em với anh nhé
Em cảm ơn anh.
à viết hàm anh @snow25Không hiểu gì luôn.Em đợi ai vào viết công thức nhé.Anh không biết công thức à.![]()
Anh oi cứ làm như hàm Sumifs nhưng lấy kết quả không phải là tổng mà chỉ lấy giống như hàm Vlookup đấy anhEm giải thích chi tiết xem nào.
Bác ơi cháu muốn tham chiếu kiểu giống hàm sumifs nhưng khi lấy kết quả thì lại giống như hàm vlookup bác @Vetkeu ơiTừ căn bản, SUMIFS/SUM thuộc về dạng tổng hợp, VLOOKUP/LOOKUP thuộc về dạng chọn lấy 1.
Hai cái hoàn toàn trái ngược mà bảo chỉnh thằng này ra theo dạng thằng kia thì là thế nào?
Anh ơi không phải công thức này anh àXem 1 cách khó áp dụng.
Dạ anh xem giúp em anh nhéEm phải cho ra kết quả nếu nhiều dữ liệu giống nhau thì mới nghiên cứu được.
Anh ơi, quy luật tham chiếu giống hàm sumifsCho xin cái quy luật cái coi.Nhìn mãi không hiểu.Hi
Em cảm ơn anhThì làm sao nhỉ ??
Bạn nên nhớ máy tính về bản chất là xử lý số và chỉ số (ngay các ký tự đều phải mã hóa thành số hết)Anh ơi, em vừa học vừa làm anh à
Bởi vì công thức về dạng số thì chỉ áp dụng được cho dạng số
Nhưng mà công thức về dạng chuỗi thì nó sẽ bao quát hơn, nó sẽ làm được cho tất cả các trường hợp anh à
Vì vậy em muốn những dạng tổng quát này hơn
Anh @snow25 viết giúp em với anh nhé
Em cảm ơn anh.
=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ê
Hi hi...Anh ơi, anh snow25Đâ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
Đúng là giải thích khó hiểu.Chứng tỏ VBA làm điều gì cũng được anh nhỉ
Ôi. ôi em cảm ơn anh @Ba Tê!Đúng là giải thích khó hiểu.
Các bảng dữ liệu sao không đều nhau 3 dòng như vùng lấy kết quả?
Ở đây có 4 bảng 3 dòng 6 cột, so trong 4 bảng từ cột 2, từng dòng, cùng vị trí mà đúng điều kiện thì lấy kết quả của vị trí đó trong vùng kết quả?
Nếu nhiều hơn 4 bảng bạn có thể xem file này.
Function dùng cho các cụm điều kiện rời rạcAnh ơ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 StrIfS(ByVal resRng As Range, ParamArray sArr() As Variant) As String
Dim Res(), cArr(), Dk As String, tmp As String
Dim n As Byte, i As Long, j As Long, sRow As Long, sCol As Long
Res = CreateArr(resRng)
sRow = UBound(Res): sCol = UBound(Res, 2)
For n = 0 To UBound(sArr) Step 2
cArr = CreateArr(sArr(n))
If sRow <> UBound(cArr) Or sCol <> UBound(cArr, 2) Then
StrIfS = "Vùng du lieu sai": Exit Function
End If
Dk = CStr(sArr(n + 1))
For i = 1 To sRow
For j = 1 To sCol
If Res(i, j) <> Empty Then
If InStr(1, cArr(i, j), Dk, 1) = 0 Then Res(i, j) = Empty
End If
Next j
Next i
Next n
For i = 1 To sRow
For j = 1 To sCol
If Res(i, j) <> Empty Then tmp = tmp & ";" & Res(i, j)
Next j
Next i
If Len(tmp) Then StrIfS = Replace(tmp, ";", "", 1, 1)
End Function
Private Function CreateArr(ByVal Rng As Range) As Variant
Dim Res()
If Rng.Count = 1 Then
ReDim Res(1 To 1, 1 To 1): Res(1, 1) = Rng
Else
Res = Rng.Value
End If
CreateArr = Res
End Function
Bác ơi bác HieuCD ơiFunction dùng cho các cụm điều kiện rời rạc
Mã:Function StrIfS(ByVal resRng As Range, ParamArray sArr() As Variant) As String Dim Res(), cArr(), Dk As String, tmp As String Dim n As Byte, i As Long, j As Long, sRow As Long, sCol As Long Res = CreateArr(resRng) sRow = UBound(Res): sCol = UBound(Res, 2) For n = 0 To UBound(sArr) Step 2 cArr = CreateArr(sArr(n)) If sRow <> UBound(cArr) Or sCol <> UBound(cArr, 2) Then StrIfS = "Vùng du lieu sai": Exit Function End If Dk = CStr(sArr(n + 1)) For i = 1 To sRow For j = 1 To sCol If Res(i, j) <> Empty Then If InStr(1, cArr(i, j), Dk, 1) = 0 Then Res(i, j) = Empty End If Next j Next i Next n For i = 1 To sRow For j = 1 To sCol If Res(i, j) <> Empty Then tmp = tmp & ";" & Res(i, j) Next j Next i If Len(tmp) Then StrIfS = Replace(tmp, ";", "", 1, 1) End Function Private Function CreateArr(ByVal Rng As Range) As Variant Dim Res() If Rng.Count = 1 Then ReDim Res(1 To 1, 1 To 1): Res(1, 1) = Rng Else Res = Rng.Value End If CreateArr = Res End Function
Điều kiện khác Empty có kiểm tra được số bằng không.Không anh.Function dùng cho các cụm điều kiện rời rạc
Mã:Function StrIfS(ByVal resRng As Range, ParamArray sArr() As Variant) As String Dim Res(), cArr(), Dk As String, tmp As String Dim n As Byte, i As Long, j As Long, sRow As Long, sCol As Long Res = CreateArr(resRng) sRow = UBound(Res): sCol = UBound(Res, 2) For n = 0 To UBound(sArr) Step 2 cArr = CreateArr(sArr(n)) If sRow <> UBound(cArr) Or sCol <> UBound(cArr, 2) Then StrIfS = "Vùng du lieu sai": Exit Function End If Dk = CStr(sArr(n + 1)) For i = 1 To sRow For j = 1 To sCol If Res(i, j) <> Empty Then If InStr(1, cArr(i, j), Dk, 1) = 0 Then Res(i, j) = Empty End If Next j Next i Next n For i = 1 To sRow For j = 1 To sCol If Res(i, j) <> Empty Then tmp = tmp & ";" & Res(i, j) Next j Next i If Len(tmp) Then StrIfS = Replace(tmp, ";", "", 1, 1) End Function Private Function CreateArr(ByVal Rng As Range) As Variant Dim Res() If Rng.Count = 1 Then ReDim Res(1 To 1, 1 To 1): Res(1, 1) = Rng Else Res = Rng.Value End If CreateArr = Res End Function
Empty hơi khó hiểu, giống như trong sheet ô trống xem như bằng 0, xét tổng thực sự dùng Len()=0Điều kiện khác Empty có kiểm tra được số bằng không.Không anh.
Thì người khác hỏi lại là chuyện bình thườngTôi vừa xóa 1 số bài tranh luận trong topic này. Đề nghị mọi người kiềm chế.
Ý kiến riêng của tôi:
Người cần hỏi thì phải hỏi. Hỏi để áp dụng trong công việc hay chỉ để biết, hay để học hỏi thêm cách mới, ... là chuyện của người hỏi. Về phía người trả lời thì tùy tâm, không muốn trả lời thì thôi, không cần thắc mắc.
Thí dụ tôi bắt đầu học VBA, tôi hỏi cách viết 1 hàm tính giai thừa của 1 số (trong khi Excel có sẵn) thì là hỏi sai sao?
Bạn đang suy luận chủ quan. Tôi hỏi hàm tính giai thừa chỉ để biết phương pháp suy luận, không áp dụng vào đâu cả. Và trong trường hợp thí dụ đó (người mới học VBA), còn chả biết vòng lặp, đệ quy là gì.Thí dụ của bạn cũng là 1 lý do, lý do để học nâng cao về giai thừa... nhưng nếu trả lời là áp dụng trường hợp cụ thể thì có thể chỉ cần viết giai thừa đơn giản là dùng vòng lặp thay vì dùng đệ quy như trong học thuật .
Bạn nói đúng. Nhưng trong những bài gần đây mà tôi đọc (và xóa), thì tôi rút ra 3 ý từ những bài của bạn:Nên có trao đổi có hỏi đáp thì mới học - đó cũng cái nguồn sống chính của 1 diễn đàn.
Về phía người trả lời thì tùy tâm, không muốn trả lời thì thôi, không cần thắc mắc.
Chẻ chữ quá, nhắc lại là: trao đổi thì mới có diễn đàn và ngược lại. Còn cứ dung dưỡng việc người hỏi kiểu đòi hỏi vô cớ sao được, khi biết ứng dụng vào đâu thì câu trả lời mới trọn vẹn hơn và đỡ phí thời gian hỏi đi hỏi lại (như nhiều chủ đề trên diễn đàn đã đang diễn ra - ngay topic này có người kêu đến 20 bài cũng không hiểu, đến cuối cũng không hiểu sao lại là sumif và vlookup là một minh chứng #20, đến #40, #42 )Bạn đang suy luận chủ quan. Tôi hỏi hàm tính giai thừa chỉ để biết phương pháp suy luận, không áp dụng vào đâu cả. Và trong trường hợp thí dụ đó (người mới học VBA), còn chả biết vòng lặp, đệ quy là gì.
Bạn nói đúng. Nhưng trong những bài gần đây mà tôi đọc (và xóa), thì tôi rút ra 3 ý từ những bài của bạn:
- Nếu không áp dụng vào đâu cả thì trả lời là phí sức
- Nếu bạn chưa hỏi được "áp dụng vào đâu" thì bạn không trả lời.
- Nếu người khác trả lời thì bạn phê phán (xem hình)
Do đó tôi mới viết:
View attachment 211708