Nối dữ liệu có ID giống nhau thành 1 dòng

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
937
Được thích
571
Chào các anh chị

Em có file dữ liệu như đính kèm. trong đó cột A là các ID được thể hiện thành nhiều dòng.
Nhờ các anh chị tạo cho đoạn code để gom các email tại cột B cùng ID vào 1 dòng

Xin chân thành cảm ơn !

1629490532422.png
 

File đính kèm

  • Noi du lieu.xlsb
    29.7 KB · Đọc: 19
Có 1 tình huống nhỏ là nếu cột ID bị tác động, kiểu dữ liệu đang là text chuyển sang là number lúc này code nhận thành 2 ID khác nhau. Các anh chị có thể bẫy lỗi phần này được không ?
Thử thay:

DK = Arr(i, 1)

bằng:

DK = CStr(Arr(i, 1))

.
 
Upvote 0
Có 1 tình huống nhỏ là nếu cột ID bị tác động, kiểu dữ liệu đang là text chuyển sang là number lúc này code nhận thành 2 ID khác nhau. Các anh chị có thể bẫy lỗi phần này được không ?
Mình thấy bạn cũng học code lâu rồi, có tìm hiểu về ADO, SQL rất nhiều mình nghĩ mấy cái này đâu khó gì với bạn đâu
Lỗi phần này thì mình sẽ chuyển nó về cùng dạng text, muốn làm điều đó thì theo code bạn @HUONGHCKT phần DK=Arr(i, 1) bạn sửa thành DK = CStr(Arr(i, 1))
Sửa: Nãy không thấy trả lời của bác @Phuocam :D
 
Upvote 0
1 máy quét 1 thời điểm chỉ có 1 ID => bài này có thể thống kê theo cột Time, => cùng 1 ID, dù là text hay number cũng ra kết quả như nhau
 
Upvote 0
Mình thấy bạn cũng học code lâu rồi, có tìm hiểu về ADO, SQL rất nhiều mình nghĩ mấy cái này đâu khó gì với bạn đâu
Lỗi phần này thì mình sẽ chuyển nó về cùng dạng text, muốn làm điều đó thì theo code bạn @HUONGHCKT phần DK=Arr(i, 1) bạn sửa thành DK = CStr(Arr(i, 1))
Sửa: Nãy không thấy trả lời của bác @Phuocam :D
Mình dùng Excel nhưng chỉ dùng ở mức cơ bản thôi. Công việc hàng ngày cũng ít dùng Excel mà toàn thao tác trên phần mềm. Trước mình có hỏi về ADO, SQL là do các phần mềm đều dùng SQL Server database. Lấy được dữ liệu trực tiếp từ SQL Server ra Excel nên cảm thấy hứng thú và tự hào lắm. Hiện tại Excel phiên bản mới (Office 2019, Offce365) hỗ trợ lấy dữ liệu từ các nguồn database khá dễ dàng nên cũng lơ là ADO hơn.
Đoạn code các bạn trên giúp mình thực sự chưa hiểu hết nên là hỏi thật
Còn về vấn đề mà bạn @Phuocam nêu mình cũng nêu ở phần trả lời trước: Code của Hoàng Tuấn 868 đã xử lý theo tình huống giữ lại ID khi trường email rỗng, còn của HUONGHCKT thì loại bỏ. Mình có cả 2 tình huống này rồi nên không hỏi thêm nữa. Như bạn Maika8008 đã nói user đưa ra vấn đề nhưng chưa chắc chọn được hoặc lường hết các tình huống, các anh chị có kinh nghiệm cứ trao đổi để "vét cạn" các tình huống giúp.
Bài đã được tự động gộp:

1 máy quét 1 thời điểm chỉ có 1 ID => bài này có thể thống kê theo cột Time, => cùng 1 ID, dù là text hay number cũng ra kết quả như nhau
Ý bác là lấy trường thời gian thay cho trường ID để pass qua vấn đề text hay number phải không ?
Bài đã được tự động gộp:

Sub NOI()
Dim Arr(), KQ(), DK, dic As Object
Dim i As Long, j As Long, t&, d&
Nhờ bạn giải thích giúp cách khai báo t&, d&. Mình chưa thấy cách khai báo thế này bao giờ
Ngoài ra việc khai báo dạng Dim Arr(), KQ(), DK, dic As Object thì Arr(), KQ(), DK, dic đều là Object à, thay vì: Dim Arr() As Object, KQ() As Object, DK As Object, dic As Object
 
Lần chỉnh sửa cuối:
Upvote 0
Code của Hoàng Tuấn 868 đã xử lý theo tình huống giữ lại ID khi trường email rỗng,
- Mình lấy cả trường hợp ID không có Email để có thể kiểm tra vì một lý do nào đấy (có thể do lỗi, có thể do sót) còn có hướng khắc phục.
- Nếu bỏ đi hết những trường hợp không có Email mà bỏ luôn ID thì cứ tưởng đủ hết rồi không kiểm tra lại thì có khi thiếu mà không biết. Tất nhiên mỗi bạn một ý tưởng khác nhau, khi kết hợp lại thì dù sao cũng phần nào ổn hơn chút chút.
Thân.
 
Upvote 0
Nhờ bạn giải thích giúp cách khai báo t&, d&. Mình chưa thấy cách khai báo thế này bao giờ
Ngoài ra việc khai báo dạng Dim Arr(), KQ(), DK, dic As Object thì Arr(), KQ(), DK, dic đều là Object à, thay vì: Dim Arr() As Object, KQ() As Object, DK As Object, dic As Object
Mình hiểu là t&,d& là kiểu varian, Còn Dim KQ(), Arr() là khai báo mảng chưa biết rõ kích thước, DK để trống thì được coi là mặc định Varian.
Không biết là hiểu có đúng không? Kiến thức VBA của mình chỉ là i, t thôi, toàn là học mót và chắp vá trên diễn đàn này và một số trang khác.
Bạn muốn tìm hiểu kỹ hãy đăng 1 topic hỏi các anh chị em có kiến thức sâu rộng về VBA nói riêng và EX nói chung. Chắc là các anh ấy sẽ giải đáp thôi mà.
Chúc vui, khỏe, và an toàn trong đại dịch.
Thân.
 
Upvote 0
Nhờ bạn giải thích giúp cách khai báo t&, d&. Mình chưa thấy cách khai báo thế này bao giờ
Ngoài ra việc khai báo dạng Dim Arr(), KQ(), DK, dic As Object thì Arr(), KQ(), DK, dic đều là Object à, thay vì: Dim Arr() As Object, KQ() As Object, DK As Object, dic As Object
t& là khai báo tắt của t As Long. Danh sách các kiểu biến có thể khai báo tắt như sau:
String $
Integer %
Long &
Single !
Double #
Currency @

Nếu khai báo 1 biến mà không chỉ định kiểu thì vba xem đó là kiểu Variant.

Nếu là mảng thì có thể khai báo có cặp ngoặc hoặc để trống (tức Variant) vì mảng cũng là kiểu Variant.

Nếu 1 biến arr được khai báo là Variant thì có thể tạm dùng vào việc khác nhưng đã khai báo arr() thì chỉ có thể là mảng thôi. Khai báo arr() As Object là không đúng, vba sẽ báo lỗi.

Variant khác với Object (đối tượng): như shape, range, dic, fso... Nếu khai báo dic as Variant mà Set dic là scripting.dictionary thì sẽ bị lỗi.
 
Upvote 0
Bài đã được tự động gộp:


Ý bác là lấy trường thời gian thay cho trường ID để pass qua vấn đề text hay number phải không ?
Với dữ liệu trong file bài 1: 1 thời điểm chỉ có 1 ID => thống kê theo cột "ID" hay "Time"cái nào cũng ra kết quả như nhau cả thôi.
 
Upvote 0
Thử code này anh @MinhKhai
Mã:
Sub GPE_hehehe()
Dim i&, k&, Data(), KetQua(), Dic As Object
On Error Resume Next
Data = Range(Sheets("Data").[A1], Sheets("Data").[A100000].End(3)).Resize(, 4)
ReDim KetQua(1 To UBound(Data), 1 To 3)
Set Dic = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(Data)
    If Data(i, 2) <> Empty Then
        If Not Dic.exists(CStr(Data(i, 1))) Then
            k = k + 1
            Dic(CStr(Data(i, 1))) = k
            KetQua(k, 1) = Data(i, 1)
            KetQua(k, 2) = Data(i, 2)
            KetQua(k, 3) = Data(i, 3)
        Else
            KetQua(Dic.Item(CStr(Data(i, 1))), 2) = KetQua(Dic.Item(CStr(Data(i, 1))), 2) & "," & Data(i, 2)
        End If
    End If
Next
Sheets("KetQua").[A1].Resize(i - 1, 3) = KetQua
Sheets("KetQua").Activate
End Sub
Click RUN => kết quả bên Sheet KetQua

Em có góp ý thêm chút, khi email đi nhiều người e thấy ngăn cách các mail với nhau kiểu như này "; " chứ không phải dấu ","
 

File đính kèm

  • Noi du lieu.xlsb
    48.4 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom