Xử lý chuỗi: Từ nhóm mã, nối nhóm tên (4 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

saobang1902

Thành viên mới
Tham gia
23/5/09
Bài viết
16
Được thích
2
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é!
 

File đính kèm

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é!
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).
 

File đính kèm

Lần chỉnh sửa cuối:
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).
Đú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ức
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, 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
Cú pháp hàm gần giống VLOOKUP:
GroupJoin(Trị dò, bảng dò, cột dò, dấu phân cách)
Như trong file thì ta sẽ gõ vào cell D3 công thức:
PHP:
=GroupJoin($C3,$A$2:$B$7,2,"-")
Hoặc:
PHP:
=GroupJoin($C3,$A$2:$B$7,2)
Vì dấu phân cách mặc định là dấu "-" nếu bỏ qua tham số này
 

File đính kèm

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 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ác có thể giải thích thêm về dòng này không?
PHP:
Set Dic = CreateObject("Scripting.Dictionary")
Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
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
Dùng Find Method thì phải bẩy lổi chứ đồng chí ---> Lở tìm không có thì sao?
Ngoài ra phải ghi đầy đủ các thông số chẳng hạn như tìm chính xác hay không chính xác, phân biết chử HOA, thường hay không?
Bác có thể giải thích thêm về dòng này không?
PHP:
Set Dic = CreateObject("Scripting.Dictionary")
Thân.
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!

attachment.php


Dictionary Object này dùng để xử lý mãng là VÔ ĐỊCH, lại cực kỳ đơn giản
Nó được ứng dụng vào rất nhiều việc... Bạn xem đây là 1 ví dụ:
http://www.giaiphapexcel.com/forum/showthread.php?p=184549
 

File đính kèm

  • untitled.JPG
    untitled.JPG
    52.1 KB · Đọc: 153
Lần chỉnh sửa cuối:
Theo ý bác! Em biên thêm 1 cách nữa! kha kha kha...
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
<Code này chỉ đúng cho trường hợp này thôi đấy nhá!>
Thân.
 
Lần chỉnh sửa cuối:
Theo ý bác! Em biên thêm 1 cách nữa! kha kha kha...
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
<Code này chỉ đúng cho trường hợp này thôi đấy nhá!>
Thân.
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ứ
Tôi nghĩ chỉ có thể dùng Find hoặc VLOOKUP thôi
Mặc khác:
Vì hàm của ta được định nghĩa As String nên chỉ cần On Error Resume Next là đủ ---> Không tìm thấy gì chắc chắn nó ra giá trị rổng ngay
 
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.
 
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.
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:
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.
 
Lần chỉnh sửa cuối:
Bác lo nhiều quá thì bạc đầu nhanh lắm đó!
Cứ để người ta biết sai mà sữa chứ! Lo nhiều quá làm gì?
Họ đã đưa ra ví dụ thì phải có 70-80% đúng với dữ liệu thật rồi. Còn việc sai đến đâu thì sữa đến đó. Và cũng để họ rút kinh nghiệm đưa ví dụ chính sát với điều mình cần hơn. Và cũng để họ học hỏi được nhiều kinh nghiệm trong việc xử lý tình huống hơn.
Vậy chẳng phải tốt cho đôi bên sao?
Thân.
 
Từ nhóm mã, nối nhóm tê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ự)
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:
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!
 

File đính kèm

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!
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 đính kèm

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
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é!
 

File đính kèm

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é!
File bạn có tí code nào đâu mà chẳng báo lổi name
- Mở file của bạn lên ---> Bấm Alt + F11
- Trong cửa sổ soạn thảo code này, vào menu Insert\Module
- Copy code của bạn Huuthang và paste vào cửa sổ bên phải
- Bấm Alt + Q để trở về bảng tính rồi bấm F9 để cập nhật
 
Trích lọc dữ liệu thỏa mãn nhiều điều kiện

Mình có bài tập này đang bị vướng mong các bạn chỉ giúp! Mình muốn lấy một số dữ liệu từ bảng dữ liệu cho trước thỏa mãn hai điều kiện (Các bạn xem file đính kèm). Mình muốn dùng công thức để làm mà chưa biết cách. Vậy các bạn chỉ giúp mình nhé! cảm ơn nhiều!!!
 

File đính kèm

Trích lọc dữ liệu thỏa mãn nhiều điều kiện (Hướng dẫn từ xa)

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.
 
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?
 
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 hiểu rồi do mình vẫn để ngoặc kép ở ô >=8 và ô <5 nên k được, mình mới bỏ dấu ngoặc kép đi thì được rồi bạn ạ. Cảm ơn bạn nhiều nhé nhưng mà mình vẫn chưa làm được câu 2, bạn giúp mình 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?
Làm vầy đây:

untitled2.JPG


-----------------
Câu 2 bạn phải tính thành tiền trước chứ
- Gõ vào cell F2 công thức:
PHP:
=HLOOKUP(MID($A2,2,2),$C$9:$F$11,3,0)
- Vậy tổng thành tiền thu được của những mặt hàng mua vào quý I có số lượng >=20 là:
PHP:
=SUMPRODUCT((MONTH($C$2:$C$7)>=1)*(MONTH($C$2:$C$7)<=3)*($D$2:$D$7>=20)*($F$2:$F$7))
 

File đính kèm

Web KT

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

Back
Top Bottom