saobang1902
Thành viên mới

- Tham gia
- 23/5/09
- Bài viết
- 16
- Được thích
- 2
Bài này nếu dùng code thì đối với các cao thủ VB rất dễ. Còn nếu dùng công thức Bạn chép file về kiểm tra xem sao nhé (Mình chỉ dùng cho điều kiện có 5 ký tự thôi).Mình có bài toán này đang bị vướng, nhờ mọi người chỉ giúp!
Các bạn xem file đính kèm nhé!
Đúng là bài này dùng VBA thật đơn giản! Những bài toán nối chuổi không hợp dùng công thứcBài này nếu dùng code thì đối với các cao thủ VB rất dễ. Còn nếu dùng công thức Bạn chép file về kiểm tra xem sao nhé (Mình chỉ dùng cho điều kiện có 5 ký tự thôi).
Function GroupJoin(Find_String As String, Find_Range As Range, Col_Index As Long, Optional Sep As String = "-") As String
Dim i As Long, Dic
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To Len(Find_String)
With Find_Range.Find(Mid(Find_String, i, 1), , , xlWhole, , , False)
If Not .Cells Is Nothing Then
Dic.Add i, .Cells(, Col_Index)
End If
End With
Next i
GroupJoin = Join(Dic.Items, Sep)
End Function
=GroupJoin($C3,$A$2:$B$7,2,"-")
=GroupJoin($C3,$A$2:$B$7,2)
Function Gjoin(str As String, rng As Range, col As Long, Optional Sep As String = "-") As String
Dim i As Long, temp As String
For i = 1 To Len(str)
temp = temp & rng.Find(Mid(str, i, 1)).Offset(, col - 1) & Sep
Next i
Gjoin = Left(temp, Len(temp) - 1)
End Function
Set Dic = CreateObject("Scripting.Dictionary")
Dùng Find Method thì phải bẩy lổi chứ đồng chí ---> Lở tìm không có thì sao?Em xin góp vui 1 đoạn code như vầy:
PHP:Function Gjoin(str As String, rng As Range, col As Long, Optional Sep As String = "-") As String Dim arr() As String, i As Long, temp As String For i = 1 To Len(str) temp = temp & rng.Find(Mid(str, i, 1)).Offset(, col - 1) & Sep Next i Gjoin = Left(temp, Len(temp) - 1) End Function
Bạn vào cửa sổ VBE, xong vào menu Help\Microsoft Visual Basic Help rồi gõ vào từ khóa Dictionary sẽ thấy ngay!Bác có thể giải thích thêm về dòng này không?
Thân.PHP:Set Dic = CreateObject("Scripting.Dictionary")
Function Gj(str As String, rng As Range, col As Long, Optional Sep As String = "-") As String
Dim i As Long, temp As String
If str = "" Then Exit Function '<-DK loai bo
For i = 1 To Len(str)
temp = temp & rng.Cells(Asc(LCase(Mid(str, i, 1))) - 96, rng.Column + col - 1) & Sep
Next
Gj = Left(temp, Len(temp) - 1)
End Function
Bạn thử sửa cell A3 thành chử "g" xem hàm của bạn nó ra cái gì? ---> Dò tìm theo kiểu Asc tôi nghĩ không ăn thua, vì dử liệu của tác giả chắc chắn chỉ là giả lập, đâu thể theo thứ tự a, b, c chứTheo ý bác! Em biên thêm 1 cách nữa! kha kha kha...
<Code này chỉ đúng cho trường hợp này thôi đấy nhá!>PHP:Function Gj(str As String, rng As Range, col As Long, Optional Sep As String = "-") As String Dim i As Long, temp As String If str = "" Then Exit Function '<-DK loai bo For i = 1 To Len(str) temp = temp & rng.Cells(Asc(LCase(Mid(str, i, 1))) - 96, rng.Column + col - 1) & Sep Next Gj = Left(temp, Len(temp) - 1) End Function
Thân.
Vì tôi đoán đây chỉ là dử liệu giả lập nên tôi còn đang lo chiêu này nữa: Có khi cột Nhóm Mã (cột C) trong file thật người ta chơi kiểu A5B3C10 ---> Tức phải dò mấy chứ A5, B3, C10 trong bảng thì... phê hơn rất nhiều (tức dò nhiều ký tự chứ không phải 1 ký tự)Trường hợp duy nhất ấy mà! "<Code này chỉ đúng cho trường hợp này thôi đấy nhá!>"
Thân.
Các cao thủ viết công thức hoặc bài trả lời cho người hỏi, người ta phải test lên test xuống, thì những người mới học như tôi và bạn lại càng phải cẩn thận hơn.
Cảm ơn các bác rất nhiều vì đã quan tâm đến bài viết của em. Đúng là trong file giả định phần cột mã em đã thiếu ký tự thực ra nó có thể là nhiều ký tự như bác đã nói. Vậy em xin gửi lại file thật mà em phải làm để các bác giúp em thêm nhé! À mới cả là em cũng mới chỉ biết áp dụng công thức thôi chứ còn cách áp dụng các đoạn code mà các bác đã viết em chưa biết cụ thể cách làm như thế nào em nhờ các bác chỉ giùm em luôn nhé. Chân thành cảm ơn sự giúp đỡ nhiệt tình của các bác!Vì tôi đoán đây chỉ là dử liệu giả lập nên tôi còn đang lo chiêu này nữa: Có khi cột Nhóm Mã (cột C) trong file thật người ta chơi kiểu A5B3C10 ---> Tức phải dò mấy chứ A5, B3, C10 trong bảng thì... phê hơn rất nhiều (tức dò nhiều ký tự chứ không phải 1 ký tự)
Hic...
Bởi vậy có khi khổ vì tác giả đưa dử liệu không tổng quát chứ không sợ viết code
-------------------------
Kết nhất câu này:
Xin phép sửa lại bài của bác Ndu theo yêu cầu mới của bạn.Cảm ơn các bác rất nhiều vì đã quan tâm đến bài viết của em. Đúng là trong file giả định phần cột mã em đã thiếu ký tự thực ra nó có thể là nhiều ký tự như bác đã nói. Vậy em xin gửi lại file thật mà em phải làm để các bác giúp em thêm nhé! À mới cả là em cũng mới chỉ biết áp dụng công thức thôi chứ còn cách áp dụng các đoạn code mà các bác đã viết em chưa biết cụ thể cách làm như thế nào em nhờ các bác chỉ giùm em luôn nhé. Chân thành cảm ơn sự giúp đỡ nhiệt tình của các bác!
Function GroupJoin(Find_String As String, Find_Range As Range, Col_Index As Long, Optional Sep As String = "-") As String
Dim i As Long, Ma As Long, Dic
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
i = 1
GPE:
Ma = IIf(IsNumeric(Mid(Find_String, i + 1, 1)), 2, 1)
With Find_Range.Find(Mid(Find_String, i, Ma), , , xlWhole, , , False)
If Not .Cells Is Nothing Then
Dic.Add i, .Cells(, Col_Index)
End If
End With
i = i + Ma
If i < Len(Find_String) Then GoTo GPE:
GroupJoin = Join(Dic.Items, Sep)
End Function
Cảm ơn bạn thật nhiều mình xem file của bạn thì được rồi nhưng sao khi mình dùng công thức đó vào file của mình thì lại báo lỗi là #Name? nhỉ mình gửi lại file của mình bạn xem giùm bị sai ở đâu nhé!Xin phép sửa lại bài của bác Ndu theo yêu cầu mới của bạn.
PHP:Function GroupJoin(Find_String As String, Find_Range As Range, Col_Index As Long, Optional Sep As String = "-") As String Dim i As Long, Ma As Long, Dic On Error Resume Next Set Dic = CreateObject("Scripting.Dictionary") i = 1 GPE: Ma = IIf(IsNumeric(Mid(Find_String, i + 1, 1)), 2, 1) With Find_Range.Find(Mid(Find_String, i, Ma), , , xlWhole, , , False) If Not .Cells Is Nothing Then Dic.Add i, .Cells(, Col_Index) End If End With i = i + Ma If i < Len(Find_String) Then GoTo GPE: GroupJoin = Join(Dic.Items, Sep) End Function
File bạn có tí code nào đâu mà chẳng báo lổi nameCảm ơn bạn thật nhiều mình xem file của bạn thì được rồi nhưng sao khi mình dùng công thức đó vào file của mình thì lại báo lỗi là #Name? nhỉ mình gửi lại file của mình bạn xem giùm bị sai ở đâu nhé!
Bạn ơi sao mình làm y hệt bạn nói mà vẫn k ra được là sao nhỉ. Mới cả câu 2 của bài tập đó mình cũng chưa làm được bạn có thể giúp mình được k?Mình sẽ hướng dẫn bạn thực hiện AdvancedFilter, như sau
(*) Bạn copy vùng A1:E1 đến ô trái trên nhất là [G4]; Sau đó chép [G4] lên [G1] & [K4] đến [H1]
(*) Tại [G2] bạn nhập công thức: ="?"&"AA"& "*" & copy xuống ô dưới nó
(*) Tại [H2] ta nhập ">=8" & ô dưới ô này ta nhập "<5"
(*) Tô chọn vùng A1:E7, Vô menu Data => Filter > Advanced Filter. . .
Tại cửa sổ mới xuất hiện, ta chọn nút Copy to another location;
Tại dòng List range ta nhập, (hay có sẵn) $A$1:$E$7
Tại dòng Criteria range ta nhập $G1$H3;
& Cuối cùng tại dòng Copy to ta nhập $G$4:$K$4 & bấm nút OK
Kết quả sẽ được liệt kê trên trang tính.
Chúc thành công.
Bạn ơi sao mình làm y hệt bạn nói mà vẫn k ra được là sao nhỉ. Mới cả câu 2 của bài tập đó mình cũng chưa làm được bạn có thể giúp mình được k?
Làm vầy đây:Bạn ơi sao mình làm y hệt bạn nói mà vẫn k ra được là sao nhỉ. Mới cả câu 2 của bài tập đó mình cũng chưa làm được bạn có thể giúp mình được k?
=HLOOKUP(MID($A2,2,2),$C$9:$F$11,3,0)
=SUMPRODUCT((MONTH($C$2:$C$7)>=1)*(MONTH($C$2:$C$7)<=3)*($D$2:$D$7>=20)*($F$2:$F$7))