Giúp em gộp các ô thành 1 chuỗi

Liên hệ QC

hoangson8768

Thành viên mới
Tham gia
20/6/10
Bài viết
48
Được thích
1
Em có 1 dãy số hóa đơn ở cột A và em phải làm tay thành kết quả ở ô B3
Các thầy giúp em dùng lệnh hay code vba như thế nào để được kết quả đó không ạ, em làm tay đau hết măt :(
Em up lại file cực kỳ chi tiết hơn ạ
 

File đính kèm

Lần chỉnh sửa cuối:
Mình làm thử code sau, bạn xem thử được ko nhé. Do mới học VBA nên nhờ mọi người góp ý thêm nhé.
___________________________________
Function combine(a As Range)
kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
kq = kq & "/" & Mid(Cells(k, a.Column), 6, Len(Cells(k, a.Column)) - 5)
Next k
combine = kq
End Function
 
Mình làm thử code sau, bạn xem thử được ko nhé. Do mới học VBA nên nhờ mọi người góp ý thêm nhé.
___________________________________
Function combine(a As Range)
kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
kq = kq & "/" & Mid(Cells(k, a.Column), 6, Len(Cells(k, a.Column)) - 5)
Next k
combine = kq
End Function
Cần khai báo biến tường minh.
Mã:
Dim Kq As String, k As Long
 
Mình đã thử rồi nhưng do ở chỗ làm không tải file lên được nên chỉ có thể đưa code cho bạn thử thôi.
 
Mình làm thử code sau, bạn xem thử được ko nhé. Do mới học VBA nên nhờ mọi người góp ý thêm nhé.
___________________________________
Function combine(a As Range) As String
kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
kq = kq & "/" & Mid(Cells(k, a.Column), 6, Len(Cells(k, a.Column)) - 5)
Next k
combine = kq
End Function
Tôi chưa Test thử code của bạn nhưng thấy hàm của bạn còn thiếu phần khai báo biến (bạn Mr.Bum đã bổ sung) và còn thiếu kiểu trả về của hàm.
Function combine(a As Range) As String
Dim Kq As String, k As Long
Kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
Kq = Kq & "/" & Mid(Cells(k, a.Column), 6, Len(Cells(k, a.Column)) - 5)
Next k
combine = Kq
End Function
 
Em đã làm rồi nhưng nó chỉ đúng khi cột A có những invoice như vậy khi các invoice khác có ký tự nhiều hơn thì nó sẽ ra kết quả sai anh à :(
 
những invoice của em nó không mặc định như vậy, em không biết có code nào lọc được các ký tự giống nhau ra rồi ngăn cách với nhau "/" :(
 
những invoice của em nó không mặc định như vậy, em không biết có code nào lọc được các ký tự giống nhau ra rồi ngăn cách với nhau "/" :(
Bạn thử lại xem!
Xin phép sửa code của Vu Dinh Duy tý tẹo!
Function combine(a As Range) As String
Dim Kq As String, k As Long
Kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
Kq = Kq & "/" & Mid(Cells(k, a.Column), 1, Len(Cells(k, a.Column)))
Next k
combine = Kq
End Function
 
Bạn thử lại xem!
Xin phép sửa code của Vu Dinh Duy tý tẹo!

Kết quả của em là thế này mà bác 3000102130-1/02130-2/02130-3/02230/02330/02430/12430/22430, của bác là nó combine tất cả vào với nhau , còn kết quả của em chỉ lấy cái invoice đầu làm đại diện còn các invoice sau chỉ lấy từ ký tự khác nhau :(
 
Em đã làm rồi nhưng nó chỉ đúng khi cột A có những invoice như vậy khi các invoice khác có ký tự nhiều hơn thì nó sẽ ra kết quả sai anh à :(

Với dữ liệu cột A, bạn nên đưa lên đây thêm 1 vài trường hợp nữa cho nó tổng quát. Chỉ có vài dòng như thế người ta không hiểu đâu
---------------
Tôi e rằng toàn bộ code trong topic này đều sai hết (có thể là đã hiểu sai ý tác giả)
 
Kết quả của em là thế này mà bác 3000102130-1/02130-2/02130-3/02230/02330/02430/12430/22430, của bác là nó combine tất cả vào với nhau , còn kết quả của em chỉ lấy cái invoice đầu làm đại diện còn các invoice sau chỉ lấy từ ký tự khác nhau :(
Tham khảo thêm code này:
Mã:
Function Gop(Rng As Range) As String
Dim iR As Long, Tmp1 As String, Tmp2 As String
Dim Dic As Object, kR As Byte
Set Dic = CreateObject("Scripting.Dictionary")
    For iR = 1 To Rng.Rows.Count
        If Len(Rng(iR)) > 4 Then
            Tmp1 = Left(Rng(iR), 5)
            If Not Dic.Exists(Tmp1) Then
                kR = kR + 1
                Dic.Add Tmp1, kR
                Tmp2 = Tmp2 & "/" & Rng(iR)
            Else
                Tmp2 = Tmp2 & "/" & Replace(Rng(iR), Tmp1, "")
            End If
        End If
    Next iR
Gop = Right(Tmp2, Len(Tmp2) - 1)
Dic.RemoveAll
End Function
Nếu 5 ký tự đầu giống nhau thì ghép phần đuôi, còn khác nhau thì lấy chuỗi mới.
Nếu không đúng thì bạn đưa file đầy đủ lên.
 

File đính kèm

Minh sửa lại một chút, bạn xem đã đúng yêu cầu chưa. Cách này có hơi thủ công ban đầu một chút nhé:
____________________
Function combine(a As Range, b As Long) As String
Dim kq As String, k As Long
kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
kq = kq & "/" & Mid(Cells(k, a.Column), b + 1, Len(Cells(k, a.Column)) - b)
Next k
combine = kq
End Function
_______________________
Ở ô B3 bạn nhập công thức "=combine(A3:A10,5)". Số 5 là số ký tự giống nhau từ trái qua. Bạn phải đếm xem các ô trong toàn bộ vùng dữ liệu có bao nhiêu ký tự giống nhau tính từ trái qua và nhập vào công thức. Không được hay nhưng do khả năng mình còn hạn chế chỉ có thể làm được vậy thôi.
 
trường hợp của em 1 lô hàng có rất nhiều số invoice
ví dụ:
Th1: Với 1 lô hàng có các invoice:
123456
123457
123458
123444
123433
Khi khai báo hải quan em phải combine là 123456/57/58/44/43
Th2:Với 1 lô hàng có các invoice:
881234
885678
889999
88-456
Khi khai báo hải quan em combine là: 881234/5678/9999/-456
Th3: Với lô hàng có các invoice:
555559-1
5555510-2
5555511
5555512
Khi khai báo hải quan em combine là:555559-1/10-2/11/12

Đó là 1 vài trường hợp trong công viẹc khai báo hải quan các lô hàng nhiều invoice em phải làm, só lượng cũng tương đối nhiều, nên em rất cần các thầy cho em 1 giải pháp hợp lý
thanks
 
Tham khảo thêm code này:
Mã:
Function Gop(Rng As Range) As String
Dim iR As Long, Tmp1 As String, Tmp2 As String
Dim Dic As Object, kR As Byte
Set Dic = CreateObject("Scripting.Dictionary")
    For iR = 1 To Rng.Rows.Count
        If Len(Rng(iR)) > 4 Then
            Tmp1 = Left(Rng(iR), 5)
            If Not Dic.Exists(Tmp1) Then
                kR = kR + 1
                Dic.Add Tmp1, kR
                Tmp2 = Tmp2 & "/" & Rng(iR)
            Else
                Tmp2 = Tmp2 & "/" & Replace(Rng(iR), Tmp1, "")
            End If
        End If
    Next iR
Gop = Right(Tmp2, Len(Tmp2) - 1)
Dic.RemoveAll
End Function
Nếu 5 ký tự đầu giống nhau thì ghép phần đuôi, còn khác nhau thì lấy chuỗi mới.
Nếu không đúng thì bạn đưa file đầy đủ lên.

Vẫn chưa đúng ạ, vì các số invoice của em nó có các số giống nhau không mặc định, lúc 5 số đầu giống nhau, lúc thì 2 số, lúc thì 7 số đầu giống nhau
 
Minh sửa lại một chút, bạn xem đã đúng yêu cầu chưa. Cách này có hơi thủ công ban đầu một chút nhé:
____________________
Function combine(a As Range, b As Long) As String
Dim kq As String, k As Long
kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
kq = kq & "/" & Mid(Cells(k, a.Column), b + 1, Len(Cells(k, a.Column)) - b)
Next k
combine = kq
End Function
_______________________
Ở ô B3 bạn nhập công thức "=combine(A3:A10,5)". Số 5 là số ký tự giống nhau từ trái qua. Bạn phải đếm xem các ô trong toàn bộ vùng dữ liệu có bao nhiêu ký tự giống nhau tính từ trái qua và nhập vào công thức. Không được hay nhưng do khả năng mình còn hạn chế chỉ có thể làm được vậy thôi.

Cảm ơn bác nhiều, tuy hơi thủ công nhưng đúng theo yêu cầu của em, với trường hợp hơn 10 số đầu giống nhau em đếm hơi vất :) , nhưng mà có vấn đề em để mặc định lệnh "combine(A3:A500,5)" nó báo VALUE chắc nó tính cả các ô có khoảng trắng nên bị lỗi
 
bạn muốn mặc định thì thêm xét điều kiện If vào Code:
_____________________________
Function combine(a As Range, b As Long) As String
Dim kq As String, k As Long
kq = Cells(a.Row, a.Column)
For k = a.Row + 1 To a.Rows.Count + a.Row - 1
If Cells(k, a.Column) <> "" Then
kq = kq & "/" & Mid(Cells(k, a.Column), b + 1, Len(Cells(k, a.Column)) - b)
End If
Next k
combine = kq
End Function
____________________________________________________
Bạn nên gửi nhiều dữ liệu lên thì các cao thủ sẽ giúp bạn cách hay hơn.
 
Lần chỉnh sửa cuối:
trường hợp của em 1 lô hàng có rất nhiều số invoice
ví dụ:
Th1: Với 1 lô hàng có các invoice:
123456
123457
123458
123444
123433
Khi khai báo hải quan em phải combine là 123456/57/58/44/43
Th2:Với 1 lô hàng có các invoice:
881234
885678
889999
88-456
Khi khai báo hải quan em combine là: 881234/5678/9999/-456
Th3: Với lô hàng có các invoice:
555559-1
5555510-2
5555511
5555512
Khi khai báo hải quan em combine là:555559-1/10-2/11/12

Đó là 1 vài trường hợp trong công viẹc khai báo hải quan các lô hàng nhiều invoice em phải làm, só lượng cũng tương đối nhiều, nên em rất cần các thầy cho em 1 giải pháp hợp lý
thanks
Bới vậy mới nói bạn đưa dữ liệu lên nhiều nhiều 1 chút (vài trăm dòng đi), đồng thôi đưa luôn kết quả mà bạn mong muốn đạt được
Tiếp sau đó ta sẽ nghiên cứu luôn 1 lần
Tôi thì hiểu rõ bạn muốn gì, có điều tôi vẫn chưa hình dung được dữ liệu thật của bạn nó thể nào để mà tính đây!
 
Bới vậy mới nói bạn đưa dữ liệu lên nhiều nhiều 1 chút (vài trăm dòng đi), đồng thôi đưa luôn kết quả mà bạn mong muốn đạt được
Tiếp sau đó ta sẽ nghiên cứu luôn 1 lần
Tôi thì hiểu rõ bạn muốn gì, có điều tôi vẫn chưa hình dung được dữ liệu thật của bạn nó thể nào để mà tính đây!

dữ liệu thật của em 100% là số hết, tất cả đều là các số invoice sắp xếp trên 1 cột như vậy, và việc của em chỉ cần combine những số đấy vào để đưa lên dữ liệu hải quan thôi ạ
 
dữ liệu thật của em 100% là số hết, tất cả đều là các số invoice sắp xếp trên 1 cột như vậy, và việc của em chỉ cần combine những số đấy vào để đưa lên dữ liệu hải quan thôi ạ

Chán bạn quá! Ai chẳng biết là số, vấn đề là tôi muốn xem cách bố trí dữ liệu nó như thế nào. Liệu các số "gần giống" nhau có nằm gần nhau không... vân vân... và... mây mây... và còn nhiều thứ phải xem "tận mặt" mới nói chuyện được
Mà thôi, lòng vòng mãi, tôi "biến" đây!
 
Web KT

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

Back
Top Bottom