hiennv.tsc
Thành viên chính thức


- Tham gia
- 13/4/19
- Bài viết
- 51
- Được thích
- 16
Mình có file dữ liệu bằng hàm Excel như này, kính nhờ các bạn trên diễn đàn viết giúp thành hàm UDF. Kính mong các bạn giúp đỡ. Xin trân thành cảm ơn!
Function DemBua_DungThiDung_KhongDungThiDung(strSou As String, _
deli As String, _
rng As Range) As String
Dim arrSou, arrcomp, arrCount
Dim i As Long, j As Long, k As Long, tmp1 As String, tmp2 As Long
Dim str As String
arrcomp = rng
arrSou = Split(strSou, deli)
ReDim arrCount(1 To rng.Columns.Count, 1 To 2)
'Dem so lan xuat hien
For i = 1 To rng.Columns.Count
arrCount(i, 1) = arrcomp(1, i)
k = 0
For j = LBound(arrSou) To UBound(arrSou)
If arrcomp(1, i) = arrSou(j) Then
k = k + 1
End If
Next j
arrCount(i, 2) = k
Next
'Sap xem lai mang - phuong phap noi bot
For i = 1 To UBound(arrCount)
For j = i + 1 To UBound(arrCount)
If arrCount(i, 2) < arrCount(j, 2) Then
' Hoan doi gia tri cua hang i và j
tmp1 = arrCount(i, 1)
arrCount(i, 1) = arrCount(j, 1)
arrCount(j, 1) = tmp1
tmp2 = arrCount(i, 2)
arrCount(i, 2) = arrCount(j, 2)
arrCount(j, 2) = tmp2
End If
Next j
Next i
'Noi ket qua
For i = 1 To UBound(arrCount)
str = str & deli & arrCount(i, 1)
Next i
str = Right(str, Len(str) - Len(deli))
DemBua_DungThiDung_KhongDungThiDung = str
End Function
Cảm ơn bạn rất nhiều.Chú ý giá trị từ ô I17 đến AB17 đã chuyển từ kiểu number sang kiểu string. Bác định dạng 5 cột đầu thì là kiểu string 20 cột sau thì định dạng kiểu Number làm ra kết quả không khớp dò mệt nghỉ lỗi sai. Ở ô AD29 gõ hàm =DemBua_DungThiDung_KhongDungThiDung(E4&","&H4;",";D$17:AB$17)Mã:Function DemBua_DungThiDung_KhongDungThiDung(strSou As String, _ deli As String, _ rng As Range) As String Dim arrSou, arrcomp, arrCount Dim i As Long, j As Long, k As Long, tmp1 As String, tmp2 As Long Dim str As String arrcomp = rng arrSou = Split(strSou, deli) ReDim arrCount(1 To rng.Columns.Count, 1 To 2) 'Dem so lan xuat hien For i = 1 To rng.Columns.Count arrCount(i, 1) = arrcomp(1, i) k = 0 For j = LBound(arrSou) To UBound(arrSou) If arrcomp(1, i) = arrSou(j) Then k = k + 1 End If Next j arrCount(i, 2) = k Next 'Sap xem lai mang - phuong phap noi bot For i = 1 To UBound(arrCount) For j = i + 1 To UBound(arrCount) If arrCount(i, 2) < arrCount(j, 2) Then ' Hoan doi gia tri cua hang i và j tmp1 = arrCount(i, 1) arrCount(i, 1) = arrCount(j, 1) arrCount(j, 1) = tmp1 tmp2 = arrCount(i, 2) arrCount(i, 2) = arrCount(j, 2) arrCount(j, 2) = tmp2 End If Next j Next i 'Noi ket qua For i = 1 To UBound(arrCount) str = str & deli & arrCount(i, 1) Next i str = Right(str, Len(str) - Len(deli)) DemBua_DungThiDung_KhongDungThiDung = str End Function
Đã kiểm tra như lời bác nói- thêm hàm tách chữ theo ký tự nối là"," sau đó ra các cột ở dưới, đồng thời do ngược lại bằng HLOOKUP ở bảng bên trên để xem giá trị đếm có được sắp xếp đúng không. Chưa hiểu ý bác là sai chỗ nàoCảm ơn bạn rất nhiều.
Lỗi đó là do mình (Đáng nhẽ tất cả là dạng Text nhưng mình làm bị sai sót)
Mình đang kiểm tra (Có khả năng là rất đúng nhưng mình đang ngờ ngợ có chút bị lỗi)
Có gì chưa đúng mong bạn chỉnh sửa code giúp mình nhé.
Mình có đánh dấu mấy chỗ trong file bạn chỉnh sửa giúp mình nhé.
Bạn ơi, ý của mình đã trình bày lại trong file. Bạn sửa code giúp mình với nhé bạn.Đã kiểm tra như lời bác nói- thêm hàm tách chữ theo ký tự nối là"," sau đó ra các cột ở dưới, đồng thời do ngược lại bằng HLOOKUP ở bảng bên trên để xem giá trị đếm có được sắp xếp đúng không. Chưa hiểu ý bác là sai chỗ nào
Tưởng xong rồi chứ quay lại diễn đàn thấy vẫn còn. Bác sửa lại theo code nàyBạn ơi, ý của mình đã trình bày lại trong file. Bạn sửa code giúp mình với nhé bạn.
Cảm ơn bạn.
Function DemBua_DungThiDung_KhongDungThiDung(strSou As String, _
deli As String, _
rng As Range) As String
Dim arrSou, arrcomp, arrCount
Dim i As Long, j As Long, k As Long, tmp1 As String, tmp2 As Long
Dim str As String
arrcomp = rng
arrSou = Split(strSou, deli)
ReDim arrCount(1 To rng.Columns.Count, 1 To 2)
'Dem so lan xuat hien
For i = 1 To rng.Columns.Count
arrCount(i, 1) = arrcomp(1, i)
k = 0
For j = LBound(arrSou) To UBound(arrSou)
If arrcomp(1, i) = arrSou(j) Then
k = k + 1
End If
Next j
arrCount(i, 2) = k
Next
'Sap xep lai mang - phuong phap noi bot
For i = 1 To UBound(arrCount)
For j = i + 1 To UBound(arrCount)
'Sap xep Nhieu xuong it
If arrCount(i, 2) < arrCount(j, 2) Then
' Hoan doi gia tri cua hang i và j
tmp1 = arrCount(i, 1)
arrCount(i, 1) = arrCount(j, 1)
arrCount(j, 1) = tmp1
tmp2 = arrCount(i, 2)
arrCount(i, 2) = arrCount(j, 2)
arrCount(j, 2) = tmp2
End If
'Sap xep lon ve nho
If arrCount(i, 2) = arrCount(j, 2) And CLng(arrCount(i, 1)) < CLng(arrCount(j, 1)) Then
' Hoan doi gia tri cua hang i và j
tmp1 = arrCount(i, 1)
arrCount(i, 1) = arrCount(j, 1)
arrCount(j, 1) = tmp1
tmp2 = arrCount(i, 2)
arrCount(i, 2) = arrCount(j, 2)
arrCount(j, 2) = tmp2
End If
Next j
Next i
'Sap xep lai mang - lan 2
'Noi ket qua
For i = 1 To UBound(arrCount)
str = str & deli & arrCount(i, 1)
Next i
str = Right(str, Len(str) - Len(deli))
DemBua_DungThiDung_KhongDungThiDung = str
End Function
Cảm ơn bạn @Mr.hieudoanxd rất nhiều.Tưởng xong rồi chứ quay lại diễn đàn thấy vẫn còn. Bác sửa lại theo code này
Mã:Function DemBua_DungThiDung_KhongDungThiDung(strSou As String, _ deli As String, _ rng As Range) As String Dim arrSou, arrcomp, arrCount Dim i As Long, j As Long, k As Long, tmp1 As String, tmp2 As Long Dim str As String arrcomp = rng arrSou = Split(strSou, deli) ReDim arrCount(1 To rng.Columns.Count, 1 To 2) 'Dem so lan xuat hien For i = 1 To rng.Columns.Count arrCount(i, 1) = arrcomp(1, i) k = 0 For j = LBound(arrSou) To UBound(arrSou) If arrcomp(1, i) = arrSou(j) Then k = k + 1 End If Next j arrCount(i, 2) = k Next 'Sap xep lai mang - phuong phap noi bot For i = 1 To UBound(arrCount) For j = i + 1 To UBound(arrCount) 'Sap xep Nhieu xuong it If arrCount(i, 2) < arrCount(j, 2) Then ' Hoan doi gia tri cua hang i và j tmp1 = arrCount(i, 1) arrCount(i, 1) = arrCount(j, 1) arrCount(j, 1) = tmp1 tmp2 = arrCount(i, 2) arrCount(i, 2) = arrCount(j, 2) arrCount(j, 2) = tmp2 End If 'Sap xep lon ve nho If arrCount(i, 2) = arrCount(j, 2) And CLng(arrCount(i, 1)) < CLng(arrCount(j, 1)) Then ' Hoan doi gia tri cua hang i và j tmp1 = arrCount(i, 1) arrCount(i, 1) = arrCount(j, 1) arrCount(j, 1) = tmp1 tmp2 = arrCount(i, 2) arrCount(i, 2) = arrCount(j, 2) arrCount(j, 2) = tmp2 End If Next j Next i 'Sap xep lai mang - lan 2 'Noi ket qua For i = 1 To UBound(arrCount) str = str & deli & arrCount(i, 1) Next i str = Right(str, Len(str) - Len(deli)) DemBua_DungThiDung_KhongDungThiDung = str End Function
Em nhờ chủ đề của chủ thớt với nhé.Tưởng xong rồi chứ quay lại diễn đàn thấy vẫn còn. Bác sửa lại theo code này
Mã:Function DemBua_DungThiDung_KhongDungThiDung(strSou As String, _ deli As String, _ rng As Range) As String Dim arrSou, arrcomp, arrCount Dim i As Long, j As Long, k As Long, tmp1 As String, tmp2 As Long Dim str As String arrcomp = rng arrSou = Split(strSou, deli) ReDim arrCount(1 To rng.Columns.Count, 1 To 2) 'Dem so lan xuat hien For i = 1 To rng.Columns.Count arrCount(i, 1) = arrcomp(1, i) k = 0 For j = LBound(arrSou) To UBound(arrSou) If arrcomp(1, i) = arrSou(j) Then k = k + 1 End If Next j arrCount(i, 2) = k Next 'Sap xep lai mang - phuong phap noi bot For i = 1 To UBound(arrCount) For j = i + 1 To UBound(arrCount) 'Sap xep Nhieu xuong it If arrCount(i, 2) < arrCount(j, 2) Then ' Hoan doi gia tri cua hang i và j tmp1 = arrCount(i, 1) arrCount(i, 1) = arrCount(j, 1) arrCount(j, 1) = tmp1 tmp2 = arrCount(i, 2) arrCount(i, 2) = arrCount(j, 2) arrCount(j, 2) = tmp2 End If 'Sap xep lon ve nho If arrCount(i, 2) = arrCount(j, 2) And CLng(arrCount(i, 1)) < CLng(arrCount(j, 1)) Then ' Hoan doi gia tri cua hang i và j tmp1 = arrCount(i, 1) arrCount(i, 1) = arrCount(j, 1) arrCount(j, 1) = tmp1 tmp2 = arrCount(i, 2) arrCount(i, 2) = arrCount(j, 2) arrCount(j, 2) = tmp2 End If Next j Next i 'Sap xep lai mang - lan 2 'Noi ket qua For i = 1 To UBound(arrCount) str = str & deli & arrCount(i, 1) Next i str = Right(str, Len(str) - Len(deli)) DemBua_DungThiDung_KhongDungThiDung = str End Function
Em thử tìm cách thay thế các dấu kia thành dấu phẩy "," xem thế nào. Một là thay thế trong code, hai là lồng thêm hàm Subtitute vào.nếu bây giờ dữ liệu đầu vào có các ký tự (3 dấu phân cách) là: (,) và (và (_) thì điều chỉnh hàm như nào hở anh?
Ủa mình đã trợ giúp cho bạn ở Inbox rồi mà??? công thức ở ô K11Em nhờ chủ đề của chủ thớt với nhé.
Anh oi, nếu bây giờ dữ liệu đầu vào có các ký tự (3 dấu phân cách) là: (,) và (và (_) thì điều chỉnh hàm như nào hở anh?
Em nhờ anh @Mr.hieudoanxd và các anh chị cùng các bác hướng dẫn em chỉnh sửa hàm này với ạ.
Em muốn thay đổi trong code cơ anh oi.Em thử tìm cách thay thế các dấu kia thành dấu phẩy "," xem thế nào. Một là thay thế trong code, hai là lồng thêm hàm Subtitute vào.
Có chính chủ rồi đó em.Em muốn thay đổi trong code cơ anh oi.
Vì em muốn các anh chị chỉnh sửa trong code cho em để em học hỏi và biết cách vận dụng cho các trường hợp khác nhau ạ.
Anh làm và hướng dẫn em với anh nhé.
Hihi em cảm ơn anh ạ.Ủa mình đã trợ giúp cho bạn ở Inbox rồi mà??? công thức ở ô K11
Anh hướng dẫn em với ạ, mỗi người mỗi cách thì em càng học đực nhiều anh oi.Có chính chủ rồi đó em.
Câu này em có nói thật lòng không đấy.em càng học đực nhiều anh oi.
Anh làm cho em với nhé anh.
Mình chỉnh code trong file sửa lại tham số 1 chút. Code trước mình đã gửi hàm SplitText2 kết quả trả về mảng để bạn vận dụng là ra rồi bạn thêm vào là xong màAnh chỉnh lại code của bài #6 cho em với ạ.
Em cảm ơn anh ạMình chỉnh code trong file sửa lại tham số 1 chút. Code trước mình đã gửi hàm SplitText2 kết quả trả về mảng để bạn vận dụng là ra rồi bạn thêm vào là xong mà
Huhu.....bàn phím máy của em bị kẹt nên bị thiếu đóa anh oi.Câu này em có nói thật lòng không đấy.