Gán dữ liệu từ sheet qua sheet (Phức tạp)

Liên hệ QC

othanhquango

Thành viên hoạt động
Tham gia
6/3/09
Bài viết
138
Được thích
7
Chào các bạn. Mình có một vấn đề đâu đầu nhưng không có cách giải quyết. Nay nhờ các cao thủ VBA giúp mình.

Mình có file như đính kèm.
- Mình muốn khi sau khi nhập dữ liệu vào sheet Nhap, nhấn nút UPDATE CHI TIẾT thì tự động nó sẽ tìm đúng sheet cần gán và gán đúng vị trí (biết chiều dài <= 70m => Sheet ChiTiet_Hong, chiều dài >70m => sheet ChiTiet_Tot)
- Vấn đề thứ 2 như sau, phức tạp hơn cái thứ nhất (theo mình là vậy): sau khi nhập dữ liệu vào sheet Xuat nhấn nút UPDATE CHI TIẾT thì tự động nó sẽ tìm đúng sheet, và đúng vị trí của đoạn cần xóa => xóa.

Rất mong sự giúp đỡ của các cao thủ.
Chân thành cảm ơn các bạn.
 

File đính kèm

  • Quan ly cap.rar
    23.5 KB · Đọc: 49
Cao thủ, vừa test sơ bộ thì thấy rất hài lòng. Triển khai rất đúng ý mình, rất chân thành cảm ơn bạn.
Để mình test thêm một thời gian nữa xem thế nào. Vì cái này cần phải có sự chính xác tuyệt đối.
Sửa lại một chút cho đẹp dữ liệu. Ở các sheet tồn dữ liệu nào được nhập trước sẽ được nằm ở trên. Code cũ sau khi xuất thì dữ liệu không còn theo trật tự thời gian nữa.
PHP:
Sub Main()
Application.ScreenUpdating = False
Dim EndR As Long, i As Long, Sh As Worksheet, CodeCol As Long, FindRng As Range, MyAdd As String, CodeRng As Range
EndR = PS.[C65536].End(xlUp).Row
If EndR = 4 Then
    MsgBox "Khong co du lieu"
    Exit Sub
End If
For i = 5 To EndR
    If PS.Cells(i, "C").Value = "" Then GoTo DongKeTiep
    Set Sh = IIf(PS.Cells(i, "H").Value = "Tot", Tot, Hg)
    CodeCol = Application.WorksheetFunction.Match(PS.Cells(i, "C").Value, Sh.[1:1], 0)
    If PS.[C1].Value = "Xuat" Then
        Set CodeRng = Sh.Range(Sh.Cells(2, CodeCol), Sh.Cells(65536, CodeCol + 1).End(xlUp))
        Set FindRng = CodeRng.Find(What:=PS.Cells(i, "E").Value, After:=Sh.Cells(2, CodeCol), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
        If FindRng Is Nothing Then GoTo DongKeTiep
        MyAdd = FindRng.Address
        Do
            If PS.Cells(i, "F").Value = FindRng.Offset(, IIf(Sh.Cells(2, FindRng.Column).Value = "S" & ChrW(7889) & " " & ChrW(273) & ChrW(7847) & "u", 1, -1)).Value Then
                With FindRng.Offset(, IIf(Sh.Cells(2, FindRng.Column).Value = "S" & ChrW(7889) & " " & ChrW(273) & ChrW(7847) & "u", 0, -1)).Resize(Sh.Cells(65536, CodeCol).End(xlUp).Row - FindRng.Row + 1, 2)
                    .Value = .Offset(1).Value
                End With
                CopyToNK i
                GoTo DongKeTiep
            End If
            Set FindRng = CodeRng.FindNext(FindRng)
        Loop While FindRng.Address <> MyAdd
    Else
        Sh.Cells(65536, CodeCol).End(xlUp).Offset(1).Resize(, 2).Value = PS.Cells(i, "E").Resize(, 2).Value
        CopyToNK i
    End If
DongKeTiep:
Next
Application.ScreenUpdating = False
End Sub
PHP:
Sub CopyToNK(MyRow As Long)
    With NK.[D65536].End(xlUp).Offset(1, -3)
        .Resize(, 2).Value = PS.Cells(MyRow, "A").Resize(, 2).Value
        .Offset(, 2).Value = PS.[C1].Value
        .Offset(, 3).Resize(, 9).Value = PS.Cells(MyRow, "C").Resize(, 9).Value
    End With
    Union(PS.Cells(MyRow, "A").Resize(, 3), PS.Cells(MyRow, "E").Resize(, 2), PS.Cells(MyRow, "I").Resize(, 3)).ClearContents
End Sub
 

File đính kèm

  • Tong hop du lieu-1.rar
    34.1 KB · Đọc: 19
Upvote 0
Code của bạn quá đỉnh luôn. Lỡ được voi rồi, đòi thêm 2 bà Trưng luôn.

Trên thực tế, khi xuất không bao giờ xuất đúng đoạn đó. Ví dụ trong kho có đoạn 00-200 (dài 200m) nhưng thực tế nhu cầu sử dụng chỉ 150m. Do đó chỉ cần xuất 00-150 hoặc 50-200. Như vậy thì có cách nào giải quyết vấn đề này không nhỉ?
 
Upvote 0
Code của bạn quá đỉnh luôn. Lỡ được voi rồi, đòi thêm 2 bà Trưng luôn.

Trên thực tế, khi xuất không bao giờ xuất đúng đoạn đó. Ví dụ trong kho có đoạn 00-200 (dài 200m) nhưng thực tế nhu cầu sử dụng chỉ 150m. Do đó chỉ cần xuất 00-150 hoặc 50-200. Như vậy thì có cách nào giải quyết vấn đề này không nhỉ?
Tôi nghĩ khi xuất ra bạn phải xuất chính xác. Chứ nếu chỉ tương đối như thế này tôi e rằng sẽ không đảm bảo tính chính xác. Ví dụ, trong kho tồn 2 đoạn 00-200 và 00-190. Vậy khi xuất 00-150 sẽ xuất đoạn nào. Còn phần dư thì sao, 00-200 sau khi xuất 00-150 thì trong kho có còn lại 151-200 không hay là xuất hết ra luôn.
 
Upvote 0
Nếu trong kho còn 00-200 và 00-190 chẳng hạn, mà nhu cầu lại cần 150m. Vậy thì sẽ lấy đoạn có chiều dài lớn hơn nhỏ nhất, phần dư còn lại nhập kho. Trường hợp này là 00-190. Hoặc 1 ví dụ khác là 800-1000, 500-750. Nếu cần 150m thì sẽ lấy 800-1000.

Mà thôi, vấn đề này cực kỳ phức tạp và mang tính tương đối, nên chắc có lẽ chỉ làm được bằng tay. Mình định hướng là sẽ vẫn xuất nguyên đoạn đi, sau đó sẽ nhập lại đoạn còn lại. Nếu code được thì quá tốt vì thực tế công trình phát sinh rất nhiều đoạn, làm tay dễ dẫn đến sai sót.

Hoặc là thiết kế thêm 1 vùng khác trên sheet phát sinh để dành cho trường hợp này: nếu người dùng xuất 1 phần của một đoạn nào đó, người dùng sẽ nhập thông tin đoạn trước khi xuất, thông tin đoạn còn lại.

VD: trước khi xuất 00-200, sau khi xuất 150-200. Thì code clear đoạn cũ và tự add đoạn mới (tất nhiên vẫn chạy tốt nếu đầu số ngược lại 200-00 vẫn hiểu và tìm đúng 00-200 bên sheet chi tiết)
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu trong kho còn 00-200 và 00-190 chẳng hạn, mà nhu cầu lại cần 150m. Vậy thì sẽ lấy đoạn có chiều dài lớn hơn nhỏ nhất, phần dư còn lại nhập kho. Trường hợp này là 00-190. Hoặc 1 ví dụ khác là 800-1000, 500-750. Nếu cần 150m thì sẽ lấy 800-1000.

Mà thôi, vấn đề này cực kỳ phức tạp và mang tính tương đối, nên chắc có lẽ chỉ làm được bằng tay. Mình định hướng là sẽ vẫn xuất nguyên đoạn đi, sau đó sẽ nhập lại đoạn còn lại. Nếu code được thì quá tốt vì thực tế công trình phát sinh rất nhiều đoạn, làm tay dễ dẫn đến sai sót.

Hoặc là thiết kế thêm 1 vùng khác trên sheet phát sinh để dành cho trường hợp này: nếu người dùng xuất 1 phần của một đoạn nào đó, người dùng sẽ nhập thông tin đoạn trước khi xuất, thông tin đoạn còn lại.

VD: trước khi xuất 00-200, sau khi xuất 150-200. Thì code clear đoạn cũ và tự add đoạn mới (tất nhiên vẫn chạy tốt nếu đầu số ngược lại 200-00 vẫn hiểu và tìm đúng 00-200 bên sheet chi tiết)
Việc này chắc phải cần nhiều thời gian. Hiện tôi đang bận. Khi nào rảnh sẽ cố gắng hoàn thiện giúp bạn.
 
Upvote 0
Nếu trong kho còn 00-200 và 00-190 chẳng hạn, mà nhu cầu lại cần 150m. Vậy thì sẽ lấy đoạn có chiều dài lớn hơn nhỏ nhất, phần dư còn lại nhập kho. Trường hợp này là 00-190. Hoặc 1 ví dụ khác là 800-1000, 500-750. Nếu cần 150m thì sẽ lấy 800-1000.

Mà thôi, vấn đề này cực kỳ phức tạp và mang tính tương đối, nên chắc có lẽ chỉ làm được bằng tay. Mình định hướng là sẽ vẫn xuất nguyên đoạn đi, sau đó sẽ nhập lại đoạn còn lại. Nếu code được thì quá tốt vì thực tế công trình phát sinh rất nhiều đoạn, làm tay dễ dẫn đến sai sót.

Hoặc là thiết kế thêm 1 vùng khác trên sheet phát sinh để dành cho trường hợp này: nếu người dùng xuất 1 phần của một đoạn nào đó, người dùng sẽ nhập thông tin đoạn trước khi xuất, thông tin đoạn còn lại.

VD: trước khi xuất 00-200, sau khi xuất 150-200. Thì code clear đoạn cũ và tự add đoạn mới (tất nhiên vẫn chạy tốt nếu đầu số ngược lại 200-00 vẫn hiểu và tìm đúng 00-200 bên sheet chi tiết)
Cuối cùng cũng xong. Bạn download về test thử xem thế nào.
Có voi, có Hai Bà Trưng, hy vọng bạn không đòi thêm chồng của bà Trưng Trắc --=0
 

File đính kèm

  • Tong hop du lieu-2.rar
    37.8 KB · Đọc: 17
Upvote 0
Hic, có thấy gì đâu bạn? File dưới khác ở trên vụ gì? File trước đánh đầu số y hệt cũng không xuất được luôn. Hic
Bạn không up nhầm chứ?

Note: không biết bạn vô tính hay cố ý mà xoá cái validation, chỗ mã hàng ấy nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Hic, có thấy gì đâu bạn? File dưới khác ở trên vụ gì? File trước đánh đầu số y hệt cũng không xuất được luôn. Hic
Bạn không up nhầm chứ?

Note: không biết bạn vô tính hay cố ý mà xoá cái validation, chỗ mã hàng ấy nhỉ?
Tôi không up nhầm. Đã test lại rồi. Bạn kiểm tra lại đi. File mới nhất của tôi cho phép xuất vơi chiều dài ngắn hơn. Ví dụ: Có 00-200 vấn cho xuất 00-150.
Còn Validation là do tôi tưởng name rác nên xóa mất. Chắc bạn tự làm lại được. Nhưng nhớ giữ nguyên Name DataLB của tôi.
File của bạn bị lỗi chỗ nào, để nguyên như vậy up lên tôi sẽ kiểm tra lại.
 
Upvote 0
Thanks bạn, đã test lại. Đúng là cao thủ, những vấn đề này làm tay còn cực kỳ vất vả thế mà bạn code được.

Bạn sửa code lại chút xíu, đoạn còn lại bạn tính sai: Ví dụ 00-200, xuất 200-50, còn lại phải là 50-00 chứ không phải 49-00

Thêm một vấn đề chưa chặt chẽ nữa ở chỗ vd: có đoạn 00-200 (đang nằm bên chi tiết tốt), xuất đi 00-150, còn lại chỉ có 150-200=50m, đúng ra phải nằm ở chi tiết hỏng. Do đó sau khi trừ, bạn phải kiểm tra chiều dài còn lại của đoạn đó trước khi gán. Quy định hiện tại là <=70m là hỏng, nhưng sau này sẽ đổi do đó khi code trước khi trừ bạn nên cho người dùng nhập số met quy định hoặc gì đó đại loại vậy để kiểm tra trước khi gán lại.

Vấn đề nữa là giả sử cần 30m nhưng kho hỏng của loại đó không có đoạn nào thỏa, lúc này phải lấy kho tốt.
VD kho tốt còn đoạn 00-200, nếu nhập 00-30 hay 30-00, hay 170-200, hay 200-170 => do có chiều dài <=70m nên sẽ hiện là hỏng => code sẽ tìm chi tiết hỏng => không có => không làm gì ở dòng này. Nhưng tự tế phải lấy ở kho tốt. Vấn đề này giải quyết ra sao nhỉ?

Hic, bạn coi chừng tẩu hỏa nhập ma nha. Vì thực tế phát sinh rất phức tạp, mình làm tay mà bị sai hoài => bị đền lần sợ rồi. Do tài sản này có giá trị lớn nên phải chính xác 100%. Rất mong sự giúp đỡ của bạn.

Chân thành cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Thanks bạn, đã test lại. Đúng là cao thủ, những vấn đề này làm tay còn cực kỳ vất vả thế mà bạn code được.

Bạn sửa code lại chút xíu, đoạn còn lại bạn tính sai: Ví dụ 00-200, xuất 200-50, còn lại phải là 50-00 chứ không phải 49-00

Thêm một vấn đề chưa chặt chẽ nữa ở chỗ vd: có đoạn 00-200 (đang nằm bên chi tiết tốt), xuất đi 00-150, còn lại chỉ có 150-200=50m, đúng ra phải nằm ở chi tiết hỏng. Do đó sau khi trừ, bạn phải kiểm tra chiều dài còn lại của đoạn đó trước khi gán. Quy định hiện tại là <=70m là hỏng, nhưng sau này sẽ đổi do đó khi code trước khi trừ bạn nên cho người dùng nhập số met quy định hoặc gì đó đại loại vậy để kiểm tra trước khi gán lại.
Tôi sửa lại cách tính đoạn còn lại.
Cái đoạn còn lại là tốt hay hỏng, gán vào đâu lẽ ra bạn nên nói ngay từ đâu để khỏi mất công. Vì thay đổi một chút nhiều khi phải viết lại code chứ không phải là sửa code lại một chút là xong. Còn nữa, nếu như tốt thành hỏng và gán vào sheet hỏng vậy khi xuất ra một đoạn hỏng, nếu không có trong sheet hỏng có tìm trong sheet tốt hay không.
Nếu được, bạn nên rà soát lại tất cả. Tôi sẽ cố gắng làm cho bạn một lần luôn. Khỏi sửa lắc nhắc uổng công.
 

File đính kèm

  • Tong hop du lieu-3.rar
    38 KB · Đọc: 4
Upvote 0
Nếu không có bên sheet hỏng vẫn tìm bên sheet tốt nha bạn, ở trên mình có nói sau khi sửa lại bài viết.

Vấn đề nữa là giả sử cần 30m nhưng kho hỏng của loại đó không có đoạn nào thỏa, lúc này phải lấy kho tốt.
VD kho tốt còn đoạn 00-200, nếu nhập 00-30 hay 30-00, hay 170-200, hay 200-170 => do có chiều dài <=70m nên sẽ hiện là hỏng => code sẽ tìm chi tiết hỏng => không có => không làm gì ở dòng này. Nhưng tự tế phải lấy ở kho tốt. Vấn đề này giải quyết ra sao nhỉ?

Những vấn đề cơ bản thì mình đã nêu ở trên, còn lại thì hiện tại không nhớ nổi vì thực tế có nhiều phát sinh. do đó nhờ bạn khắc phục 02 vấn đều còn lại nữa giúp mình là ok. Một là gán đoạn còn lại sang sheet tương ứng, hai là nếu không có bên hỏng thì lấy bên tốt.

Trên đây là vấn đề mình đã lượt bỏ công đoạn tìm đoạn cáp, xác định đầu số sẽ sử dụng. Chứ thực tế phát sinh số liệu sẽ gởi như sau:
Tổng m cáp (MH xzy gì đó) sử dụng: 1.000m chẳng hạn, bao gồm 3 tuyến 500m, 200m, và 300m. => Tìm các đoạn tương ứng còn tồn kho sao cho dư ngắn nhất (tương tự với các mã hàng khác), từ đó lựa ra đầu số các đoạn=> vấn đề này thì mình nghĩ chắc không cần code làm gì => làm bằng tay (auto fillter), nhìn bằng mắt chi tiết tồn là nhanh nhất và đỡ sai sót.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không có bên sheet hỏng vẫn tìm bên sheet tốt nha bạn, ở trên mình có nói sau khi sửa lại bài viết.



Những vấn đề cơ bản thì mình đã nêu ở trên, còn lại thì hiện tại không nhớ nổi vì thực tế có nhiều phát sinh. do đó nhờ bạn khắc phục 02 vấn đều còn lại nữa giúp mình là ok. Một là gán đoạn còn lại sang sheet tương ứng, hai là nếu không có bên hỏng thì lấy bên tốt.

Trên đây là vấn đề mình đã lượt bỏ công đoạn tìm đoạn cáp, xác định đầu số sẽ sử dụng. Chứ thực tế phát sinh số liệu sẽ gởi như sau:
Tổng m cáp (MH xzy gì đó) sử dụng: 1.000m chẳng hạn, bao gồm 3 tuyến 500m, 200m, và 300m. => Tìm các đoạn tương ứng còn tồn kho sao cho dư ngắn nhất (tương tự với các mã hàng khác), từ đó lựa ra đầu số các đoạn=> vấn đề này thì mình nghĩ chắc không cần code làm gì => làm bằng tay (auto fillter), nhìn bằng mắt chi tiết tồn là nhanh nhất và đỡ sai sót.
Xong rồi. Hy vọng lần này sẽ giúp bạn giải quyết triệt để vấn đề.
 

File đính kèm

  • Tong hop du lieu-4.rar
    48.7 KB · Đọc: 7
Upvote 0
Cảm ơn bạn nhiều nha, để mình check thử. À mà bạn đang ở đâu? Có cơ hội vào Nha Trang alo mình, đi uống cafe cảm ơn he.
--------------------------
Mình test thì thấy bạn để combo chọn sau khi nhập xuất để gán qua sheet hỏng hay sheet tốt. Lại còn có giá trị mặc định là hỏng hay tốt phụ thuộc vào chiều dài đoạn còn lại nữa, điểm này mình rất thích.

Bạn bổ sung chiều dài giúp mình trong form xuất, cụ thể như sau:

Có(đầu), Có(cuối), Chiều dài(m), Xuất (đầu), Xuất (cuối), chiều dài (m), Còn (đầu), còn (cuối), chiều dài(m)

Như vậy thì sử dụng sẽ cụ thể hơn, vì mình khỏi phải ngồi trừ ra xem nó có đủ độ dài không.

À bạn cho mình hỏi, code của bạn có giới hạn số dòng dữ liệu không? Ví dụ bên sheet chi tiết hỏng và tốt, tối đa được bao nhiêu đoạn 1 loại (bao nhiu dòng?). Sheet nhật ký tối đa được bao nhiêu dòng? vì mình đưa vào sử dụng là sư dụng luôn ít nhất là 1 năm. Do đó nếu có thì bạn tăng giới hạn lên giúp mình.

Một lần nữa chân thành cảm ơn sự giúp đỡ rất rất rất là nhiệt tình của bạn.
 

File đính kèm

  • Anh.JPG
    Anh.JPG
    21.3 KB · Đọc: 28
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn nhiều nha, để mình check thử. À mà bạn đang ở đâu? Có cơ hội vào Nha Trang alo mình, đi uống cafe cảm ơn he.
--------------------------
Mình test thì thấy bạn để combo chọn sau khi nhập xuất để gán qua sheet hỏng hay sheet tốt. Lại còn có giá trị mặc định là hỏng hay tốt phụ thuộc vào chiều dài đoạn còn lại nữa, điểm này mình rất thích.

Bạn bổ sung chiều dài giúp mình trong form xuất, cụ thể như sau:

Có(đầu), Có(cuối), Chiều dài(m), Xuất (đầu), Xuất (cuối), chiều dài (m), Còn (đầu), còn (cuối), chiều dài(m)

Như vậy thì sử dụng sẽ cụ thể hơn, vì mình khỏi phải ngồi trừ ra xem nó có đủ độ dài không.

À bạn cho mình hỏi, code của bạn có giới hạn số dòng dữ liệu không? Ví dụ bên sheet chi tiết hỏng và tốt, tối đa được bao nhiêu đoạn 1 loại (bao nhiu dòng?). Sheet nhật ký tối đa được bao nhiêu dòng? vì mình đưa vào sử dụng là sư dụng luôn ít nhất là 1 năm. Do đó nếu có thì bạn tăng giới hạn lên giúp mình.

Một lần nữa chân thành cảm ơn sự giúp đỡ rất rất rất là nhiệt tình của bạn.
Đã sửa lại Form theo yêu cầu của bạn.
Một số điểm bạn cần lưu ý:
1. Không được sửa, xóa name DataLB.
2. Không được thay đổi cầu trúc các bảng dữ liệu nếu bạn không biết cách sửa code lại cho phù hợp với dữ liệu.
3. Tất cả các sheet bạn được sử dụng đến dòng 65535.
4. Vị trí các Mã hàng trong hai sheet ChiTiet_Hong và ChiTiet_Tot phải giống nhau. Ví dụ mã 15000930 ở cột E sheet ChiTiet_Hong thì cũng phải ở cột E sheet ChiTiet_Tot.
5. Nếu phát sinh thêm mã hàng mới, bạn có thể thêm vào sheet ChiTiet_Hong và ChiTiet_Tot nhưng nhớ là phải giữ cấu trúc giống như các mã hiện có và vị trí Mã ở hai sheet vẫn phải giống nhau.
6. Ô E1 sheet PS_Nhap_Xuat là ô quy định chiều dài tiêu chuẩn để xác định một đoạn là tốt hay hỏng.
7. Khi phải cắt một đoạn. Form sẽ hiện lên cho bạn chọn một trong các đoạn bạn có thể chọn để xuất, các đoạn này được sắp xếp theo chiều dài tăng dần. Khi chọn một đoạn nào đó, đoạn còn lại sau khi cắt là Tốt hay Hỏng sẽ được xác định tự động dựa vào chiều dài tiêu chuẩn ở ô E1 sheet PS_Nhap_Xuat. Tuy nhiên, bạn có thể chọn là tốt hay hỏng bằng tay.

Xin nhận lời cảm ơn của bạn. Còn ly cafe cho tôi gửi lại vì tôi ở HCM, khi nào ra Nha Trang sẽ lấy sau --=0
 

File đính kèm

  • Tong hop du lieu-5.rar
    39.3 KB · Đọc: 24
Upvote 0
Web KT
Back
Top Bottom