Xin hàm sumifs dạng Vlookup

Liên hệ QC

hongphuong1997

Thành viên tiêu biểu
Tham gia
12/11/17
Bài viết
771
Được thích
321
Giới tính
Nữ
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 đỡ.
 

File đính kèm

Đâ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
Hi hi...Anh ơi, anh snow25
Em không để ý,đúng roài anh ơi
Em cảm ơn anh nhiều nhé
Chứng tỏ VBA làm điều gì cũng được anh nhỉ
Em chúc anh vui vui anh nhé
 
Upvote 0
Chứng tỏ VBA làm điều gì cũng được anh nhỉ
Đú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.
 

File đính kèm

Upvote 0
Đú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.
Ôi. ôi em cảm ơn anh @Ba Tê!
Anh ơi hàm của anh ngắn gọn quá anh ơi
Và rất chuẩn anh àh
Em cảm ơn anh @Ba Tê rất nhìu
Em chúc anh ngày vui anh nhé
 
Upvote 0
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 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
 
Upvote 0
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
Bác ơi bác HieuCD ơi
Cháu cảm ơn bác rất nhiều, đúng quá bác ơi
Cháu chúc bác vui vui bác nhé
Cháu chúc bác chơi tết vạn sự như ý bác nhé!
 
Upvote 0
Tô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?
 
Upvote 0
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
Điều kiện khác Empty có kiểm tra được số bằng không.Không anh.
 
Upvote 0
Tô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?
Thì người khác hỏi lại là chuyện bình thường
Có hỏi mới ra vấn đề, mở rộng vấn đề, bạn nói như vậy là thiếu khách quan - 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 .

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.
 
Upvote 0
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 đ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ì.

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.
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:
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.
1548596197004.png
 
Lần chỉnh sửa cuối:
Upvote 0
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
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 )
 
Lần chỉnh sửa cuối:
Upvote 0
Gởi tam888,
Như tôi nói trong bài trên, 2 gạch đầu dòng 1 và 2 thì chỉ là kêu gọi những người "có thể trả lời" nên tùy tâm mà trả lời. Còn gạch đầu dòng thứ 3 thì là 1 thái độ không hay.
Trước đây bạn cũng từng bị gởi cảnh báo 1 lần (Hai Lúa Miền Tây gởi) do có bài sau:
1548596939993.png
Tôi không tranh luận. Tất cả những bài không giúp ích cho người hỏi hoặc không đúng chủ đề tôi sẽ xóa, nếu xóa nhiều lần tôi cảnh báo, cảnh báo 2 lần thì tôi ban nick.
 
Upvote 0
Web KT

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

Back
Top Bottom