Gộp dữ liệu từ nhiều hàng

Liên hệ QC

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,579
Được thích
3,723
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Quan hệ.. và quan hệ..
Xin chào các thành viên GPE
Mình có câu hỏi này muốn hỏi
Tôi có file dữ liệu khách hàng gồm mã khách hàng và các thông tin liên quan
Tuy nhiên 1 khách hàng lại có nhiều dòng (bản ghi khác nhau)
Bây jo muốn gộp hết lại thành 1 dòng với đầy đủ thông tin mà nghĩ chưa ra cách
Các bạn giúp mình nhé
tks
nice day1
 

File đính kèm

Xin chào các thành viên GPE
Mình có câu hỏi này muốn hỏi
Tôi có file dữ liệu khách hàng gồm mã khách hàng và các thông tin liên quan
Tuy nhiên 1 khách hàng lại có nhiều dòng (bản ghi khác nhau)
Bây jo muốn gộp hết lại thành 1 dòng với đầy đủ thông tin mà nghĩ chưa ra cách
Các bạn giúp mình nhé
tks
nice day1

bạn thử xem như vậy được ko
 

File đính kèm

Xin chào các thành viên GPE
Mình có câu hỏi này muốn hỏi
Tôi có file dữ liệu khách hàng gồm mã khách hàng và các thông tin liên quan
Tuy nhiên 1 khách hàng lại có nhiều dòng (bản ghi khác nhau)
Bây jo muốn gộp hết lại thành 1 dòng với đầy đủ thông tin mà nghĩ chưa ra cách
Các bạn giúp mình nhé
tks
nice day1
Dùng VBA :
Tham khảo file và tuỳ biến
 
Thêm một phương án: Sử dụng Array và Dictionary (hôm nay quyết tâm phải nghiên cứu Array và Dictionary, rất mong được các anh chị chỉ giáo thêm)
[GPECODE=vb]Sub MergeData()
Dim Temp, Arr(), i As Long, j As Long, k As Long, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Sheet1.Activate
[H6:L65000].Clear
Temp = Range([A2], [A65000].End(xlUp)).Resize(, 5)
ReDim Arr(1 To UBound(Temp), 1 To 5)
For i = 1 To UBound(Temp)
If Not Dic.exists(Temp(i, 1)) Then
k = k + 1
Dic.Add Temp(i, 1), k
For j = 1 To 5
Arr(k, j) = Temp(k, j)
Next
Else
For j = 1 To 5
If Arr(Dic(Temp(i, 1)), j) = "" Then Arr(Dic(Temp(i, 1)), j) = Temp(i, j)
Next
End If
Next
[K6].Resize(k).NumberFormat = "@"
[L6].Resize(k).NumberFormat = "dd/MM/yyyy"
[H6].Resize(k, 5) = Arr
End Sub[/GPECODE]
 

File đính kèm

Thêm một phương án: Sử dụng Array và Dictionary (hôm nay quyết tâm phải nghiên cứu Array và Dictionary, rất mong được các anh chị chỉ giáo thêm)
[GPECODE=vb]Sub MergeData()
Dim Temp, Arr(), i As Long, j As Long, k As Long, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Sheet1.Activate
[H6:L65000].Clear
Temp = Range([A2], [A65000].End(xlUp)).Resize(, 5)
ReDim Arr(1 To UBound(Temp), 1 To 5)
For i = 1 To UBound(Temp)
If Not Dic.exists(Temp(i, 1)) Then
k = k + 1
Dic.Add Temp(i, 1), k
For j = 1 To 5
Arr(k, j) = Temp(k, j)
Next
Else
For j = 1 To 5
If Arr(Dic(Temp(i, 1)), j) = "" Then Arr(Dic(Temp(i, 1)), j) = Temp(i, j)
Next
End If
Next
[K6].Resize(k).NumberFormat = "@"
[L6].Resize(k).NumberFormat = "dd/MM/yyyy"
[H6].Resize(k, 5) = Arr
End Sub[/GPECODE]

Hình như code này thiếu điều kiện kiểm tra Len(Temp(i,1) ) , hổng biết có đúng không ?
 
Hình như code này thiếu điều kiện kiểm tra Len(Temp(i,1) ) , hổng biết có đúng không ?

Chính xác là vậy!
Ngoài ra nên đưa thằng Temp(i, 1) ra thành 1 biến tạm để tăng tốc
Ví dụ:
Mã:
tmp = CStr(Temp(i, 1))
If Len(tmp) then
  If Not Dic.Exists(tmp) then
    .....
vân vân...
 
Có lẽ dùng giải pháp của bác nhapmon đơn giản, dễ hiểu nhất ạh
 
Hình như code này thiếu điều kiện kiểm tra Len(Temp(i,1) ) , hổng biết có đúng không ?
Chính xác là vậy!
Ngoài ra nên đưa thằng Temp(i, 1) ra thành 1 biến tạm để tăng tốc
Ví dụ:
Mã:
tmp = CStr(Temp(i, 1))
If Len(tmp) then
  If Not Dic.Exists(tmp) then
    .....
vân vân...
Như vậy là muốn Add cái gì đó vào Dic thì nó phải khác rỗng đúng không bạn hungpecc1 và anh ndu? Đây là bài đầu tiên em làm quen với Dic nên thực ra thì em chưa hiểu bản chất.
Cảm ơn mọi người!
 
Như vậy là muốn Add cái gì đó vào Dic thì nó phải khác rỗng đúng không bạn hungpecc1 và anh ndu? Đây là bài đầu tiên em làm quen với Dic nên thực ra thì em chưa hiểu bản chất.
Cảm ơn mọi người!

Hổng phải vậy, rổng cũng Add vào được.. những chả lẽ ta lại đi lấy dữ liệu rổng ---> Chính thế phải loại nó ra thôi
(trường hợp cột mã không có gì mà các cột cạnh bên lại có tùm lum thứ, khi xuất ra coi sao được)
 
Như vậy là muốn Add cái gì đó vào Dic thì nó phải khác rỗng đúng không bạn hungpecc1 và anh ndu? Đây là bài đầu tiên em làm quen với Dic nên thực ra thì em chưa hiểu bản chất.
Cảm ơn mọi người!
Bạn dùng code của bạn test thử luôn, tạo 1 vài cell rống là biết liền ah,
Không gì bằng tự mình thí nghiệm hết __--__
Mặt khác bạn thử xem câu lệnh bạn viết là :
Mã:
Arr(k, j) = Temp([B][COLOR=#ff0000]k[/COLOR][/B], j)
với câu lệnh
Mã:
Arr(k, j) = Temp([COLOR=#ff0000][B]i[/B][/COLOR], j)
sẽ khác nhau ,bạn test xem
 
Bạn dùng code của bạn test thử luôn, tạo 1 vài cell rống là biết liền ah,
Không gì bằng tự mình thí nghiệm hết __--__
Mặt khác bạn thử xem câu lệnh bạn viết là :
Mã:
Arr(k, j) = Temp([B][COLOR=#ff0000]k[/COLOR][/B], j)
với câu lệnh
Mã:
Arr(k, j) = Temp([COLOR=#ff0000][B]i[/B][/COLOR], j)
sẽ khác nhau ,bạn test xem
Tôi vừa thử và đã hiểu ra vấn đề.
Còn chỗ màu đỏ thì đúng là tôi gõ nhầm, chủ ý ban đầu là i chứ không phải là k.
 
Tôi vừa thử và đã hiểu ra vấn đề.
Còn chỗ màu đỏ thì đúng là tôi gõ nhầm, chủ ý ban đầu là i chứ không phải là k.

Nói thêm về cái vụ Len(tmp) mà thật ra nó cũng chả liên quan gì đến Dictionary (chỉ liên quan đến Array)
- Ta biết rằng code hoạt động trên Array cho tốc độ rất nhanh, vậy nên cũng không cần phải End(xlUp) gì gì đó để xác định cell cuối cùng
- Ta có thể định vị vùng dữ liệu dư ra 1 chút (A1:F1000 chẳng hạn) rồi cứ chạy code
- Chính vì dữ liệu thừa ra nên để tăng tốc ta nên cho điều kiện If Len(...) vào ---> Có dữ liệu thì tiếp tục
- Mặc khác, End(xlUp) có thể sai đáng tiếc nếu bảng tính đang ở chế độ AutoFilter
--------------------
(Từ ngày "làm bạn" với thằng Array, tôi nghỉ chơi luôn thằng End(xlUp) rồi, ngoại trừ 1 số ít trường hợp bất khả kháng)
 
Nói thêm về cái vụ Len(tmp) mà thật ra nó cũng chả liên quan gì đến Dictionary (chỉ liên quan đến Array)
- Ta biết rằng code hoạt động trên Array cho tốc độ rất nhanh, vậy nên cũng không cần phải End(xlUp) gì gì đó để xác định cell cuối cùng
- Ta có thể định vị vùng dữ liệu dư ra 1 chút (A1:F1000 chẳng hạn) rồi cứ chạy code
- Chính vì dữ liệu thừa ra nên để tăng tốc ta nên cho điều kiện If Len(...) vào ---> Có dữ liệu thì tiếp tục
- Mặc khác, End(xlUp) có thể sai đáng tiếc nếu bảng tính đang ở chế độ AutoFilter
--------------------
(Từ ngày "làm bạn" với thằng Array, tôi nghỉ chơi luôn thằng End(xlUp) rồi, ngoại trừ 1 số ít trường hợp bất khả kháng)
Còn việc sử dụng hàm CLng hoặc CStr thì nhằm mục đích gì vậy anh? Có phải là để chuyển hẳn qua 1 kiểu dữ liệu nào đó (Long, String) để phòng trường hợp Number được lưu ở dạng Text không vậy?
 
Còn việc sử dụng hàm CLng hoặc CStr thì nhằm mục đích gì vậy anh? Có phải là để chuyển hẳn qua 1 kiểu dữ liệu nào đó (Long, String) để phòng trường hợp Number được lưu ở dạng Text không vậy?

Chính xác là vậy!
Khi add vào Dictionray, tôi luôn dùng CStr(..) để chủ động chuyển mọi thứ sang Text ---> Ai mà biết cái gì trong trái ổi
Ví dụ:
Mã:
Sub Test()
  Dim Dic As Object
  Set Dic = CreateObject("Scripting.Dictionary")
  Dic.Add [COLOR=#ff0000][B]1[/B][/COLOR],  ""
  Dic.Add [COLOR=#ff0000][B]"1"[/B][/COLOR],  ""
End Sub
Nó tưởng thằng 1"1" là khác nhau đấy nhé
vân vân... còn nhiều trường hợp khác nữa mà ta phải chủ động dùng CLng, CStr chuyển dữ liệu cho chắc
 
Còn việc sử dụng hàm CLng hoặc CStr thì nhằm mục đích gì vậy anh? Có phải là để chuyển hẳn qua 1 kiểu dữ liệu nào đó (Long, String) để phòng trường hợp Number được lưu ở dạng Text không vậy?

Theo mình nếu mà dùng Cstr thì nên viết : Cstr(Trim(...)) thì " an toàn " hơn 1 tẹo
 
Web KT

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

Back
Top Bottom