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ữ
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