Xin nhờ các ACE hỗ trợ về code copy cột paste sang hàng có điều kiện

manhnt.npsc

Yêu THVBA
Số là e có cái bảng này, cũng chập chững học VBA chưa biết đi từ đâu với tình huống này, em xin nhờ các ACE trợ giúp ạ, e xin chân thành cám ơn ạ
Chọn
ABA hoặc B
A1.1B1.1
1​
2​
3​
4​
A1.2B1.2A1.1A1.2A1.3A1.4
A1.3B1.3A2.1A2.2A2.3A2.4
A1.4
B1.4A3.1A3.2A3.3A3.4
A2.1B2.1
A2.2B2.2AN.1AN.2AN.3AN.4
A2.3B2.3
A2.4B2.4
A3.1B3.1
A3.2B3.2
A3.3B3.3
A3.4B3.4
AN.1BM.1
AN.2BM.2
AN.3BM.3
AN.4BM.4
 
@manhnt.npsc Thử 1 cách khác
Mã:
Sub ABC()
Dim Dic As Object, Arr(), Res(), i&, Tmp$, Ma, cot%
Dim c1&, c2&, c3&, c4&, a&
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    Arr = .Range("B3:C" & .Range("B" & Rows.Count).End(3).Row).Value
    Tmp = .Range("D2").Value
    ReDim Res(1 To UBound(Arr, 1), 1 To 4)
    If Tmp = "A" Then cot = 1
    If Tmp = "B" Then cot = 2
    For i = 1 To UBound(Arr, 1)
        Ma = Split(Arr(i, cot), ".")
        If Dic.exists(Arr(i, cot)) = False Then
            Dic.Add (Arr(i, cot)), ""
        If Ma(1) = 1 Then
            c1 = c1 + 1
            Res(c1, 1) = Arr(i, cot)
        ElseIf Ma(1) = 2 Then
            c2 = c2 + 1
            Res(c2, 2) = Arr(i, cot)
        ElseIf Ma(1) = 3 Then
            c3 = c3 + 1
            Res(c3, 3) = Arr(i, cot)
        ElseIf Ma(1) = 4 Then
            c4 = c4 + 1
            Res(c4, 4) = Arr(i, cot)
        End If
        End If
    Next
    a = Application.WorksheetFunction.Max(c1, c2, c3, c4)
    .Range("E4").Resize(1000, 4).ClearContents
    If a Then .Range("E4").Resize(a, 4).Value = Res
End With
End Sub
 

snow26

Yêu THVBA
Bạn cho mình xin file demo có nhiều cột.
Hiện tại code chỉ xử lý logic theo file demo mà bạn đã đưa thôi.
INPUT:
Bạn cần đăng nhập để thấy hình ảnh

OUTPUT:
Bạn cần đăng nhập để thấy hình ảnh
 

manhnt.npsc

Yêu THVBA

đây bác ạ, file này là để cho 24 cột để nhặt ạ
 

manhnt.npsc

Yêu THVBA
@snow26 @Binana xin cám ơn 2 cao nhân, xin 2 cao nhân giúp cho về trường hợp 24 cột e đã tải trên ạ (nếu có thể xin 2 bạn cho mình xin chỉ dẫn' để hiểu code với ạ, nếu có được bài toán tổng quát thì e nghĩ trường hợp này nhiều người sẽ cần lắm ạ, xin đa tạ ạ
 

snow26

Yêu THVBA
Bạn ơi
File này không có chọn A,B như ban đầu nữa à bạn?
Số 4 này có ý nghĩa gì vậy bạn?
Bạn cần đăng nhập để thấy hình ảnh
 

manhnt.npsc

Yêu THVBA
Bạn ơi
File này không có chọn A,B như ban đầu nữa à bạn?
Số 4 này có ý nghĩa gì vậy bạn?
Bạn cần đăng nhập để thấy hình ảnh
dạ e chưa kịp xóa, số đấy ở file cũ, nó ko quan trọng đâu ạ, dạ e ko để A, B vì như thế thì ko tính cho dài được ý ạ
 

snow26

Yêu THVBA
Hình như logic không còn giống như bạn mô tả lúc đầu.
Lúc đầu định dạng chỉ có một dấu chấm .
A1.4
Bây giờ định dạng có hai dấu chấm.
A1.4.1

Lúc đầu tách đuôi. Nếu như ban đầu thì kết quả bây giờ là:
Bạn cần đăng nhập để thấy hình ảnh

Bây giờ bạn tách lấy phần đầu:
Bạn cần đăng nhập để thấy hình ảnh


Tóm lại là như thế nào vậy bạn? Có nhầm lẫn gì không vậy?
 

manhnt.npsc

Yêu THVBA
Hình như logic không còn giống như bạn mô tả lúc đầu.
Lúc đầu định dạng chỉ có một dấu chấm .
A1.4
Bây giờ định dạng có hai dấu chấm.
A1.4.1

Lúc đầu tách đuôi. Nếu như ban đầu thì kết quả bây giờ là:
Bạn cần đăng nhập để thấy hình ảnh

Bây giờ bạn tách lấy phần đầu:
Bạn cần đăng nhập để thấy hình ảnh


Tóm lại là như thế nào vậy bạn? Có nhầm lẫn gì không vậy?
Dạ, e xin kết quả ở sheet kq đó anh. Nếu trước mình phần đầu A, B thì nay là từ A1 A2 đến A24 ạ, vẫn lấy dữ liệu bên dưới A1.1.1 đến A24.n.4, chỉ là tổng quát cho bài toán trên ý ạ
 
Code như thế này là bạn mặc định các chỉ số chỉ từ XXX.1 => XXX.4, nếu là .5, .6 thì code bạn hình như sẽ gặp rắc rối. Bạn kiểm tra thử xem.
Em viết chỉ cho file demo của bạn ấy thôi. Chứ nếu như cách bạn ấy nói. Sẽ sử dụng cách. Khác. Ko còn phải là cách đó nữa
 
T

thanhphong

Guest
@snow26 @Binana mình xin chỉ dẫn' để hiểu code với ạ
Chính là anh em ở đây phải xin bạn chỉ dẫn để hiểu yêu cầu mới đúng. Bạn chỉ dẫn sơ sài, sau đó thay đổi cấu trúc file (từ 1 sheet thành 2 sheet), khiến cho các bạn ở đây, người thì code không đáp ứng được biến thiên dữ liệu, người thì phải code lại.

Tôi thấy đã giải quyết rồi nên tôi không code nữa. Tôi đưa vài bình luận như dưới đây, hi vọng giúp ích cho bạn.

Nói về thuật toán, đầu tiên nói về yêu cầu. Nên viết làm sao để người code dễ nắm bắt thông tin.

INPUT:
Cấu trúc file gồm 2 sheet : data, kq
Có một danh sách trên sheet data
Bạn cần đăng nhập để thấy đính kèm

Người dùng nhập keyword (từ khóa) trên sheet kq vào ô A2 :
Bạn cần đăng nhập để thấy đính kèm


Output:
Ghi kết quả vào sheet kq
Bạn cần đăng nhập để thấy đính kèm


Trình bày như trên thì người code sẽ dễ hiểu hơn. Bạn nên sử dụng hình vẽ minh họa trong bài viết. Cách post hình trên diễn đàn thì bạn tham khảo ở đây:

Về thuật toán: Tôi nghĩ có nhiều cách giải quyết bài toán này, vì nó không khó. Dựa theo những gì các bạn trong topic này đã trình bày, tôi trình bày như sau:
Bạn cần đăng nhập để thấy đính kèm

Đầu tiên cần xây dựng đường ngang 1,2,3,4...
Nhìn vào input đầu vào, có thể thấy dãy số này là các số ký tự cuối cùng sau dấm chấm.
Việc lấy ký tự cuối cùng sau dấu chấm thì có nhiều cách.
Trên data input, có thể thấy danh sách ký tự cuối cùng này bị trùng lặp, mà chúng ta chỉ cần lấy một lần thôi.
Ví dụ sau khi lấy 1,2,3,4-ở các dòng tiếp theo nếu nhìn thấy 1,2,3,4 thì thôi không lấy nữa vì đã có rồi.
Như vậy ở bước lấy ký tự cuối cùng này cần phải kiểm tra, trước đó ta đã lấy ký tự cuối cùng nào giống lần này hay không.
-Dựa vào dữ liệu mô tả này thì:
+)Nếu ký tự cuối cùng là 1 (vd: A1.1.1 hoặc A1.2.1 ) thì sẽ được ghi ở cột B (cột 2) trên sheet kq.
+)Nếu ký tự cuối cùng là 2 (vd: A1.1.2 hoặc A1.2.2 ) thì sẽ được ghi ở cột C (cột 3) trên sheet kq.
...
Từ đây đã có thể thấy, dựa vào ký tự cuối cùng ta có thể tính được là nó sẽ được ghi ở vị trí cột nào trên sheet kq.
INPUT (ký tự cuối cùng)OUTPUT (vị trí cột ghi kết quả)
12
23

Khi ghi kết quả thì tất nhiên sẽ xác định dòng cuối là dòng nào, và lùi xuống một dòng để viết.
Bạn cần đăng nhập để thấy đính kèm
 

snow26

Yêu THVBA
Đọc bình luận của @thanhphong , mình nhầm chút.
Update lại code:
Bạn cần đăng nhập để thấy hình ảnh
 

manhnt.npsc

Yêu THVBA
Chính là anh em ở đây phải xin bạn chỉ dẫn để hiểu yêu cầu mới đúng. Bạn chỉ dẫn sơ sài, sau đó thay đổi cấu trúc file (từ 1 sheet thành 2 sheet), khiến cho các bạn ở đây, người thì code không đáp ứng được biến thiên dữ liệu, người thì phải code lại.

Tôi thấy đã giải quyết rồi nên tôi không code nữa. Tôi đưa vài bình luận như dưới đây, hi vọng giúp ích cho bạn.

Nói về thuật toán, đầu tiên nói về yêu cầu. Nên viết làm sao để người code dễ nắm bắt thông tin.

INPUT:
Cấu trúc file gồm 2 sheet : data, kq
Có một danh sách trên sheet data
Bạn cần đăng nhập để thấy đính kèm

Người dùng nhập keyword (từ khóa) trên sheet kq vào ô A2 :
Bạn cần đăng nhập để thấy đính kèm


Output:
Ghi kết quả vào sheet kq
Bạn cần đăng nhập để thấy đính kèm


Trình bày như trên thì người code sẽ dễ hiểu hơn. Bạn nên sử dụng hình vẽ minh họa trong bài viết. Cách post hình trên diễn đàn thì bạn tham khảo ở đây:

Về thuật toán: Tôi nghĩ có nhiều cách giải quyết bài toán này, vì nó không khó. Dựa theo những gì các bạn trong topic này đã trình bày, tôi trình bày như sau:
Bạn cần đăng nhập để thấy đính kèm

Đầu tiên cần xây dựng đường ngang 1,2,3,4...
Nhìn vào input đầu vào, có thể thấy dãy số này là các số ký tự cuối cùng sau dấm chấm.
Việc lấy ký tự cuối cùng sau dấu chấm thì có nhiều cách.
Trên data input, có thể thấy danh sách ký tự cuối cùng này bị trùng lặp, mà chúng ta chỉ cần lấy một lần thôi.
Ví dụ sau khi lấy 1,2,3,4-ở các dòng tiếp theo nếu nhìn thấy 1,2,3,4 thì thôi không lấy nữa vì đã có rồi.
Như vậy ở bước lấy ký tự cuối cùng này cần phải kiểm tra, trước đó ta đã lấy ký tự cuối cùng nào giống lần này hay không.
-Dựa vào dữ liệu mô tả này thì:
+)Nếu ký tự cuối cùng là 1 (vd: A1.1.1 hoặc A1.2.1 ) thì sẽ được ghi ở cột B (cột 2) trên sheet kq.
+)Nếu ký tự cuối cùng là 2 (vd: A1.1.2 hoặc A1.2.2 ) thì sẽ được ghi ở cột C (cột 3) trên sheet kq.
...
Từ đây đã có thể thấy, dựa vào ký tự cuối cùng ta có thể tính được là nó sẽ được ghi ở vị trí cột nào trên sheet kq.
INPUT (ký tự cuối cùng)OUTPUT (vị trí cột ghi kết quả)
12
23

Khi ghi kết quả thì tất nhiên sẽ xác định dòng cuối là dòng nào, và lùi xuống một dòng để viết.
Bạn cần đăng nhập để thấy đính kèm
Dạ e xin cám ơn góp ý của anh, e xin rút kính nghiệm và tiếp thu hướng dẫn để lần sau nói rõ hơn ạ
 
Top