Ghép nối dữ liệu

Liên hệ QC

sep_hatxel

Thành viên thường trực
Tham gia
24/5/10
Bài viết
217
Được thích
7
Mình có một vấn đề mong sự quan tâm giúp đỡ của các bạn! Một file excel:

+ Cơ sở dữ liệu ở sheet1. Vị trí ở cột A có kí hiệu lần lượt là 1;2 1;3 1;4 ..v.v.. và có các giá trị tương ứng theo hàng.
+ Khi nhập vào cột A ở sheet2 vào ô bất kì 2 Vị trí nào đó có ở cột A trong sheet1 ghép lại với nhau thì kết quả là các giá trị tương ứng sẽ tự ghép lại với nhau.
Ví dụ:
CSDL ở sheet1:
Ở cột A:
vị trí 1;2 có các giá trị tương ứng là: 1 5 8 9 9
vị trí 1;4 có các giá trị tương ứng là: 4 7 3 0 2
Khi nhập vào cột A ở sheet2 vào ô bất kì nào đó: 2 Vị trí 1;2 và 1;3 ghép lại với nhau dưới dạng 1;2&1;3 thì kết quả là các giá trị
tương ứng tự ghép lại với nhau: 14 57 83 90 92
-Rất mong sự giúp đỡ của các bạn! Xin cảm ơn rất nhiều! Thân ái!
 

File đính kèm

  • ghep noi du lieu.7z
    129.7 KB · Đọc: 21
Mình có một vấn đề mong sự quan tâm giúp đỡ của các bạn! Một file excel:

+ Cơ sở dữ liệu ở sheet1. Vị trí ở cột A có kí hiệu lần lượt là 1;2 1;3 1;4 ..v.v.. và có các giá trị tương ứng theo hàng.
+ Khi nhập vào cột A ở sheet2 vào ô bất kì 2 Vị trí nào đó có ở cột A trong sheet1 ghép lại với nhau thì kết quả là các giá trị tương ứng sẽ tự ghép lại với nhau.
Ví dụ:
CSDL ở sheet1:
Ở cột A:
vị trí 1;2 có các giá trị tương ứng là: 1 5 8 9 9
vị trí 1;4 có các giá trị tương ứng là: 4 7 3 0 2
Khi nhập vào cột A ở sheet2 vào ô bất kì nào đó: 2 Vị trí 1;2 và 1;3 ghép lại với nhau dưới dạng 1;2&1;3 thì kết quả là các giá trị
tương ứng tự ghép lại với nhau: 14 57 83 90 92




-Rất mong sự giúp đỡ của các bạn! Xin cảm ơn rất nhiều! Thân ái!
Thử code này xem

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim d, Vung, I, Tach, K, kK, Kq(1 To 1, 1 To 5) As String
    If Not Intersect(Target, Range("A4:a50000")) Is Nothing Then
        Set d = CreateObject("scripting.dictionary")
        Vung = Sheets("sheet1").Range(Sheets("sheet1").[a4], Sheets("sheet1").[a50000].End(xlUp)).Resize(, 6).Value
            For I = 1 To UBound(Vung)
                If Not d.exists(Vung(I, 1)) Then d.Add Vung(I, 1), I
            Next I
                Tach = Split(Target, "&")
                K = d.Item(Tach(0)):  kK = d.Item(Tach(1))
                    For I = 1 To 5
                        Kq(1, I) = Vung(K, I + 1) & Vung(kK, I + 1)
                    Next I
            Target.Offset(, 1).Resize(, 5) = Kq
    End If
End Sub

( Sao cái máy bàn của mình khi cho code này vào khung thì nó nhảy lung tung hè, làm sao bi giờ mấy Thầy ui? )
 

File đính kèm

  • ghep noi du lieu.rar
    127.8 KB · Đọc: 22
Chỉnh sửa lần cuối bởi điều hành viên:
Thử code này xem
Private Sub Worksheet_Change(ByVal Target As Range)
Dim d, Vung, I, Tach, K, kK, Kq(1 To 1, 1 To 5) As String
If Not Intersect(Target, Range("A4:a50000")) Is Nothing Then
Set d = CreateObject("scripting.dictionary")
Vung = Sheets("sheet1").Range(Sheets("sheet1").[a4], Sheets("sheet1").[a50000].End(xlUp)).Resize(, 6).Value
For I = 1 To UBound(Vung)
If Not d.exists(Vung(I, 1)) Then d.Add Vung(I, 1), I
Next I
Tach = Split(Target, "&")
K = d.Item(Tach(0)): kK = d.Item(Tach(1))
For I = 1 To 5
Kq(1, I) = Vung(K, I + 1) & Vung(kK, I + 1)
Next I
Target.Offset(, 1).Resize(, 5) = Kq
End If
End Sub
( Sao cái máy bàn của mình khi cho code này vào khung thì nó nhảy lung tung hè, làm sao bi giờ mấy Thầy ui? )

Ngày mới tốt lành!
Hix, bạn ơi mình không biết cách dùng ra sao?
 
Ngày mới tốt lành!
Hix, bạn ơi mình không biết cách dùng ra sao?
Bạn tải lại file này, code kia mình quên chưa bẫy lỗi (khuya, buồn ngủ quá)
Cách làm: mở file lên, chọn sheet 2, nhập 2 số cần ghép _ đúng với cú pháp như ví dụ của bạn_ ví dụ 1;2&1;3 rồi ........xem kết quả. Sướng
Híc
 

File đính kèm

  • ghep noi du lieu.rar
    127.8 KB · Đọc: 50
Bác concogia thân mến! Mong bác có thể biến tấu hộ mình đoạn code trên cho trường hợp này được không ạ? Mình nghĩ vấn đề đó sẽ rất đơn giản với bác! Mong bác giúp đỡ! thân ái!
 

File đính kèm

  • Chép dữ liệu từ sheet1 sang sheet2.7z
    129.3 KB · Đọc: 34
Bạn tải lại file này, code kia mình quên chưa bẫy lỗi (khuya, buồn ngủ quá)
Cách làm: mở file lên, chọn sheet 2, nhập 2 số cần ghép _ đúng với cú pháp như ví dụ của bạn_ ví dụ 1;2&1;3 rồi ........xem kết quả. Sướng
Híc
Chào ngày mới! Chúc GPE một ngày thắng lợi!
Bạn concogia thần mến và các bạn trong GPE xem giúp mình với! Sau một thời gian mình sử dụng đoạn code này thì gặp tình huống sau: khi mảng số liệu cần ghép lên khoảng 15000 dòng thì excel trở nên quá nặng và không lưu lại được (kết quả ghép khoảng 15000 dòng và 2000 cột)! Mong các bạn giải thích giúp và hướng dẫn! Mình đang cần làm trường hợp ghép kết quả lên tới khoảng 100000 dòng và 2000 cột! Rất mong chờ sự giúp đỡ của các bạn! Xin cảm ơn!
 
Nguyên văn bởi sep_hatxel
khi mảng số liệu cần ghép lên khoảng 15000 dòng thì excel trở nên quá nặng và không lưu lại được
-Nếu như thế này thì chương trình chạy vẫn ok. File nặng không lưu được là do bản thân cái file đó thôi. Có thể do chứa nhiều định dạng, vùng dữ liệu quá lớn, do virus...Bạn phải tìm nguyên nhân thì mới khắc phục được.
-Nếu lỗi do ở chương trình, thì mình có thể cải tiến giúp bạn được. Nhưng trước hết, bạn xem lỗi do đâu cái đã.
 
-Nếu như thế này thì chương trình chạy vẫn ok. File nặng không lưu được là do bản thân cái file đó thôi. Có thể do chứa nhiều định dạng, vùng dữ liệu quá lớn, do virus...Bạn phải tìm nguyên nhân thì mới khắc phục được.
-Nếu lỗi do ở chương trình, thì mình có thể cải tiến giúp bạn được. Nhưng trước hết, bạn xem lỗi do đâu cái đã.
Chào bạn và GPE! Mong GPE giải thích hộ mình trường hợp này ạ: Khi sheet1 mình tăng thêm số liệu lên 13396 dòng thì thì sheet2 mình copy từ sheet1 sang thì không còn chạy nữa (chạy bằng code)? Nhưng khi giảm xuống 1 dòng dữ liệu ở sheet1 còn 13395 dòng thì sheet2 vẫn chạy ổn. Mong GPE xem giúp đỡ phần mã code cần phải cải tiến ở đâu để có thể chạy được chương trình với số liệu nhiều dòng hơn ở sheet1! Mình xin chân thành cảm ơn!
 

File đính kèm

  • ghep noi du lieu.7z
    58.9 KB · Đọc: 23
Chào bạn và GPE! Mong GPE giải thích hộ mình trường hợp này ạ: Khi sheet1 mình tăng thêm số liệu lên 13396 dòng thì thì sheet2 mình copy từ sheet1 sang thì không còn chạy nữa (chạy bằng code)? Nhưng khi giảm xuống 1 dòng dữ liệu ở sheet1 còn 13395 dòng thì sheet2 vẫn chạy ổn. Mong GPE xem giúp đỡ phần mã code cần phải cải tiến ở đâu để có thể chạy được chương trình với số liệu nhiều dòng hơn ở sheet1! Mình xin chân thành cảm ơn!
Bạn tăng chỗ này lên xem sao
PHP:
Target.Offset(, 1).Resize(, 16383)
thành đại
PHP:
Target.Offset(, 1).Resize(, 65000)
 
Bạn tăng chỗ này lên xem sao
PHP:
Target.Offset(, 1).Resize(, 16383)
thành đại
PHP:
Target.Offset(, 1).Resize(, 65000)
Vâng! Mình đã làm như bạn nhưng không được bạn ạ! Mình đã thử thay đổi các số liệu nhưng mà đều không thành công! Không biết vấn đề là ở chỗ nào?
 
Chào bạn và GPE! Mong GPE giải thích hộ mình trường hợp này ạ: Khi sheet1 mình tăng thêm số liệu lên 13396 dòng thì chạy nữa (chạy thì sheet2 mình copy từ sheet1 sang thì không còn chạy nữa ( chạy bằng code)? Nhưng khi giảm xuống 1 dòng dữ liệu ở sheet1 còn 13395 dòng thì sheet2 vẫn chạy ổn. Mong GPE xem giúp đỡ phần mã code cần phải cải tiến ở đâu để có thể chạy được chương trình với số liệu nhiều dòng hơn ở sheet1! Mình xin chân thành cảm ơn!
-Trong file có code trong sheet và code trong module, không hiểu bạn chạy code nào không được?
-Code không chạy là do nhiều lý do. Câu hỏi của bạn chưa rõ nên khó trả lời. Đoạn code trong module bạn viết:
Mã:
Sub copyValue()
For I = 4 To 36
     Range("a" & I).Value = Range("a" & I).Value
Next
End Sub
thì dù số dòng là bao nhiêu, code đó cũng không chạy ra kết quả ( do không xác định được địa chỉ nguồn và đích)
 
-Trong file có code trong sheet và code trong module, không hiểu bạn chạy code nào không được?
-Code không chạy là do nhiều lý do. Câu hỏi của bạn chưa rõ nên khó trả lời. Đoạn code trong module bạn viết:
Mã:
Sub copyValue()
For I = 4 To 36
     Range("a" & I).Value = Range("a" & I).Value
Next
End Sub
thì dù số dòng là bao nhiêu, code đó cũng không chạy ra kết quả ( do không xác định được địa chỉ nguồn và đích)
Vâng, cảm ơn bạn rất nhiều vì đã quan tâm! Code gốc là code trong module : code này khi mình dán dữ liệu bất kì của cột A trong sheet1 vào cột A trong sheet2 thì dòng dữ liệu từ sheet1 sẽ được copy sang sheet2, bình thường thì mình phải dán lần lượt từng dữ liệu một nên thay cho công việt đó mình dùng code trong sheet là mình cho chạy dán một thể luôn dữ liệu vào cột A của sheet2.
Với file mình gửi trên thì khi dữ liệu của cột A trong sheet1 tới 13395 dòng thì mình cho chạy code trong sheet và vẫn chạy ra kết quả dán từ sheet1 sang sheet2, nhưng khi mình tăng thêm một dữ liệu ở cột A trong sheet1 lên 13396 dòng thì code không còn chạy ra kết quả dán nữa ? Mình không hiểu nguyên do là từ đâu ?
 
Bạn cần nói rõ hơn: bạn chạy đoạn code nào?

Nếu chạy code trong module, thì không thể ra kết quả như bạn mô tả được. Bạn kiểm tra lại xem có chỗ nào nhầm lẫn không?
Cảm ơn bạn! Mình xin mô tả chi tiết như sau:
*Thứ nhất:
Sheet1 là sheet dữ liệu gốc, có cột A là các mã : (2;1&1;1), ( 3;1&1;1),..v.v… Mỗi mã tương ứng là một dòng có chứa các dữ liệu trong dòng. (trong file mình gửi kèm có 13392 mã ở cột A tương ứng là có 13392 dòng dữ liệu). Ở sheet2: mình copy-paste hoặc gõ một mã bất kì có ở sheet1 vào một ô của cột A trong sheet2 (gõ vào ô thứ 4 trở lên) thì toàn bộ dòng dữ liệu của mã đó có ở sheet1 sẽ được xuất sang sheet2 tại dòng có chứa ô được gõ mã vào. Ví dụ: coppy-paste hoặc gõ mã 2;1&1;1 vào ô [A4] trong sheet2 thì toàn bộ dòng dữ liệu của mã 2;1&1;1 ở sheet1 sẽ xuất sang sheet2. Để thực hiện cho công việc trên thì code trong module thực hiện xuất dữ liệu của mã từ sheet1 sang sheet2.
*Thứ hai: Trong nhiều trường hợp ở sheet2: cột A đã có chứa sẵn các mã cần xuất sang với số lượng mã lớn, nếu copy-paste tại chỗ hoặc gõ lần lượt từng mã một thì rất mất nhiều thời gian và công sức nên thay cho công việc đó thì code trong sheet2 thực hiện: coppy và paste các mã có sẵn ở cột A tại chỗ luôn, khi đó code trong module cũng được thực hiện.
* Thứ ba: Khi số lượng mã ở sheet1 là 13392 mã, copy-paste mã vào cột A ở sheet2 thì việc xuất dữ liệu mã đó từ sheet1 sang sheet2 vẫn thực hiện bình thường. Nhưng khi số lượng mã ở sheet1 tăng lên 13393 mã (hoặc lớn hơn nữa) thì việc copy-paste mã để xuất dữ liệu sang sheet2 không còn thực hiện được nữa. Các bạn xem giúp hộ mình vì sao lại như vậy?
- Mong các bạn kiểm tra và xem giúp hộ mình! Xin cảm ơn các bạn!
 
Thứ nhất:
Mình hỏi trước khi trả lời vì thấy code trong module của bạn là không thể chạy được khác với những gì bạn miêu tả.
Thứ hai:
Đoạn code trong module mắc lỗi ở chỗ không xác định rõ sheet nguồn và sheet đích. Bạn cần bổ sung.
Thứ ba:
Khi code trong module chạy sẽ kích hoạt sự kiện Worksheet_Change làm cho code trong sheet2 chạy. Đoạn code này có thể mắc lỗi ở dòng:
Mã:
Vung = Sheets("sheet1").Range(Sheets("sheet1").[a4], Sheets("sheet1").[a1000000].End(xlUp)).Resize(, 2500).Value
khi biến mảng có số phần tử quá lớn. Khi bạn tăng số dòng từ 13395 lên 13396, biến vung vượt giới hạn cho phép nên bị lỗi "out of memory". Muốn kiểm tra, bạn thử bỏ dòng On Error Resume Next sẽ thấy ngay. Để khắc phục lỗi này: ta phải giảm số phần tử của biến mảng bằng cách chia nhỏ vùng, rồi xử lý lần lượt từng vùng. Cũng có thể có phương án tăng bộ nhớ cho máy, nhưng theo mình không thiết thực lắm.
 
Lần chỉnh sửa cuối:
Cảm ơn bạn! Mình xin mô tả chi tiết như sau:
*Thứ nhất:
Sheet1 là sheet dữ liệu gốc, có cột A là các mã : (2;1&1;1), ( 3;1&1;1),..v.v… Mỗi mã tương ứng là một dòng có chứa các dữ liệu trong dòng. (trong file mình gửi kèm có 13392 mã ở cột A tương ứng là có 13392 dòng dữ liệu). Ở sheet2: mình copy-paste hoặc gõ một mã bất kì có ở sheet1 vào một ô của cột A trong sheet2 (gõ vào ô thứ 4 trở lên) thì toàn bộ dòng dữ liệu của mã đó có ở sheet1 sẽ được xuất sang sheet2 tại dòng có chứa ô được gõ mã vào. Ví dụ: coppy-paste hoặc gõ mã 2;1&1;1 vào ô [A4] trong sheet2 thì toàn bộ dòng dữ liệu của mã 2;1&1;1 ở sheet1 sẽ xuất sang sheet2. Để thực hiện cho công việc trên thì code trong module thực hiện xuất dữ liệu của mã từ sheet1 sang sheet2.
*Thứ hai: Trong nhiều trường hợp ở sheet2: cột A đã có chứa sẵn các mã cần xuất sang với số lượng mã lớn, nếu copy-paste tại chỗ hoặc gõ lần lượt từng mã một thì rất mất nhiều thời gian và công sức nên thay cho công việc đó thì code trong sheet2 thực hiện: coppy và paste các mã có sẵn ở cột A tại chỗ luôn, khi đó code trong module cũng được thực hiện.
* Thứ ba: Khi số lượng mã ở sheet1 là 13392 mã, copy-paste mã vào cột A ở sheet2 thì việc xuất dữ liệu mã đó từ sheet1 sang sheet2 vẫn thực hiện bình thường. Nhưng khi số lượng mã ở sheet1 tăng lên 13393 mã (hoặc lớn hơn nữa) thì việc copy-paste mã để xuất dữ liệu sang sheet2 không còn thực hiện được nữa. Các bạn xem giúp hộ mình vì sao lại như vậy?
- Mong các bạn kiểm tra và xem giúp hộ mình! Xin cảm ơn các bạn!
E hèm, tới giờ này vẫn....dậm chân tại chỗ. Thôi thế này nhé:
1- Đưa lại file lên, muốn làm cái quái gì với nó thì......viết rõ ràng ra. Nếu dung lượng lớn quá thì cho biết số hàng & số cột thôi không cần phải có hết (vài trăm dòng minh họa là đủ )
2- Cái code trong moduel của bạn chắc chắn nó chẳng "cóp py cóp piếc" gì từ sheet này dán qua sheet kia được đâu. Bạn cứ cho biết ý định của bạn khi viết cái code đó, anh em sẽ giúp bạn
Bài của bạn mình đã sử dụng mảng, tốc độ nhanh nhất rồi, nếu dữ liệu phải sử lý nhiều quá thì nó "rờ ua rua huyền bò" thì cũng là chuyện thường (có thời gian uống cà - phê & hút thuốc cũng sướng)
Mơ hồ hiểu cái ý đồ của bạn mình cho chạy thử với 700 cột mất khoảng 5 giây, còn hàng thì mình thử đưa lên 20000 dòng vẫn...."chạy tốt"
Thân
 
Web KT

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

Back
Top Bottom