Thiết lập file excel lưu trữ lịch sử

Liên hệ QC

CaoNgan99

Thành viên mới
Tham gia
19/12/21
Bài viết
28
Được thích
1
Giới tính
Nữ
Em chào các anh chị !
hiện em có một file em đang xây dựng để lưu trữ lịch sử các đơn hàng.
Tại sheet historys
khi nhấn vào nút "refresh All" sẽ lấy toàn bộ dữ liệu ở sheet summary đổ sang sheet historys từ A2 đến Y, mỗi khi có dữ liệu mới từ sheet summary thì sẽ được thêm nối tiếp vào sheet historys.

từ cột Z đến AQ là cập nhật từ các sheet khác,
Điều cập nhật là nếu tìm thấy dữ liệu tại cột A sheet Historys ở các sheet còn lại (MATER_ITEM, SHIPOUT, ORDER_SCAN, BY_DATE, KITTING, MATERIAL_SHORTAGE, PRINT_STAGE, CUT_STAGE, BCNK, SOL_CANCEL) thì trả về các vùng tương ứng, mỗi lần các sheet khác thay đổi nội dung thì các vùng bên sheet History cũng được cập nhật theo
và nếu dữ liệu ở các sheet summary hay các sheet khác bị mất thì dữ liệu trong sheet historys không bị mất đi

code thì hiện tại em đã nhặt nhạnh khắp nơi để lắp ghép chỉ còn duy nhất một sheet MATER_ITEM là em không thể nào lắp ghép được vì tham số nằm ở cột L chứ không phải cột A nữa, em đã thử rất nhiều lần nó báo lỗi,

Mã:
For t = 1 To UBound(Sarr_Item)
  Tmp_Item = Sarr_Item(t, 1)
  Dic.Add (Tmp_Item), t
  'If DR(i, 19) <> "AWAITING_SHIPPING" Or DR(i, 19) <> "AWAITING_FULFILLMENT" Then 'co the tuy chinh
    Dic95.Add (Tmp_Item), t
    If DR_Item(t, 8) = "AWAITING_FULFILLMENT" Or DR_Item(t, 8) = "AWAITING_SHIPPING" Or DR_Item(t, 8) = "PRODUCTION_OPEN" Or DR_Item(i, 8) = "EXTERNAL_REQ_OPEN" Or DR_Item(t, 8) = "PO_PARTIAL" Or DR_Item(t, 8) = "PO_OPEN" Or DR_Item(t, 8) = "BOOKED" Or DR_Item(t, 8) = "SUPPLY_ELIGIBLE" Or DR_Item(t, 8) = "ENTERED" Then Dic35.Add (Tmp_Item), t
  'End If
Next t

nên em đã đặt công thức vlookup tại cột AM đến AO sheet historys để anh chị xem và sửa giúp em với, vì bình thường em có thể vlookup nhưng dữ liệu có lúc lên đến 60000 dòng chạy rất chậm.

em cám ơn trước ạ
 

File đính kèm

  • History.xlsb
    2.9 MB · Đọc: 26
Lần chỉnh sửa cuối:
A batman1 ơi em đang xem lại bài của a huonghckt và bài a vừa hướng dẫn nhưng em vẫn chưa hiểu hết được, em đang mò mẫm từng chút một nhưng thật sự em đang mong chờ a viết lại theo bài 36 37 vừa được a tóm tắt sau đó em sẽ đọc lại tiếp bài 39, hiện tại em không có khả năng code được sẽ mất rất nhiều thời gian để em tự học nữa ạ, em rất mong a giúp em
Code bài 39 được viết cho một giả thiết nhất định. Nếu bạn đọc giả thiết mà tôi viết trong bài 39 thì bạn sẽ thấy đúng như đã thống nhất ở bài 36, 37.
Tôi phải viết code mới vì code cũ kiểm tra dữ liệu mới hay cũ chỉ trên cơ sở cột A (SOL). Bạn lại muốn trên cơ sở cả dòng - A & B & ... & AB. Hoặc là trên sở chỉ cột A hoặc trên cơ sở CẢ DÒNG A & B & ... & AB. Không phải vô cớ tôi mất rất nhiều thời gian để thống nhất với bạn để bây giờ bạn lại thay đổi ý định.
Trong bài 37 bạn có thêm ý cho rõ thì code trong ThisWorkbook (điểm 3 trong bài 39) chính là thực hiện việc đó.

Tôi có thể giúp bạn viết code, và tôi chỉ quan tâm, liệu code có sai sót gì không. Tôi không quan tâm bạn có hiểu không. Không ai có nhiệm vụ đào tạo bạn. Nếu kiến thức của bạn không đủ để hiểu code thì chả ai giúp được bạn. Tôi đã cố gắng hết sức bằng cách chú thích, giải thích hầu như mỗi dòng code.
 
Upvote 0
Code bài 39 được viết cho một giả thiết nhất định. Nếu bạn đọc giả thiết mà tôi viết trong bài 39 thì bạn sẽ thấy đúng như đã thống nhất ở bài 36, 37.
Tôi phải viết code mới vì code cũ kiểm tra dữ liệu mới hay cũ chỉ trên cơ sở cột A (SOL). Bạn lại muốn trên cơ sở cả dòng - A & B & ... & AB. Hoặc là trên sở chỉ cột A hoặc trên cơ sở CẢ DÒNG A & B & ... & AB. Không phải vô cớ tôi mất rất nhiều thời gian để thống nhất với bạn để bây giờ bạn lại thay đổi ý định.
Trong bài 37 bạn có thêm ý cho rõ thì code trong ThisWorkbook (điểm 3 trong bài 39) chính là thực hiện việc đó.

Tôi có thể giúp bạn viết code, và tôi chỉ quan tâm, liệu code có sai sót gì không. Tôi không quan tâm bạn có hiểu không. Không ai có nhiệm vụ đào tạo bạn. Nếu kiến thức của bạn không đủ để hiểu code thì chả ai giúp được bạn. Tôi đã cố gắng hết sức bằng cách chú thích, giải thích hầu như mỗi dòng code.
Dạ đúng ạ a ghi chú chi tiết là quá hoàn hảo rồi, còn lại em sẽ tự phải tìm hiểu
 
Upvote 0
Code được viết với giả thiết sau đây:
1. Khi nhấn RefreshAll thì thực hiện code sub RefreshAll

a. Duyệt FRU để cập nhật HISTORYS và SUMMARY. Sub RefreshAll sẽ gọi sub duyet_FRU 2 lần để cập nhật HISTORYS và SUMMARY.
- kiểm tra từng dòng (A & B & ... & AB) của FRU có xuất hiện trong HISTORYS hoặc SUMMARY hay không. Nếu đã có thì làm mới B:E, S, K, Y và Z. Nếu chưa có thì thêm dòng đó vào cuối HISTORYS hoặc SUMMARY

- nếu dòng (A & B & ... & AB) nào đó của SUMMARY không có trong FRU thì xóa khỏi SUMMARY

b. Sub RefreshAll cũng gọi sub duyet_KHAC nhiều lần, mỗi lần để duyệt từng sheet SHIPOUT, MATER_ITEM, ... để cập nhật HISTORYS và SUMMARY

2. Trong sub duyet_KHAC do muốn rút gọn code nên tôi có đoạn
Mã:
'    cot_historys
    Select Case sheet_can_duyet_name
        Case "SHIPOUT", "ORDER_SCAN", "BY_DATE", "KITTING", "PRINT_STAGE", "CUT_STAGE", "SOL_CANCEL", "MATERIAL_SHORTAGE", "BCNK": cot_historys = "A"
        Case "MATER_ITEM": cot_historys = "L"
    End Select
'    cot_do
    Select Case sheet_can_duyet_name
        Case "SHIPOUT", "ORDER_SCAN", "BY_DATE", "KITTING", "PRINT_STAGE", "CUT_STAGE", "SOL_CANCEL", "MATER_ITEM": cot_do = "A"
        Case "MATERIAL_SHORTAGE", "BCNK": cot_do = "B"
    End Select
'    kq_tu_cot
    Select Case sheet_can_duyet_name
        Case "SHIPOUT", "BY_DATE", "KITTING", "PRINT_STAGE", "CUT_STAGE", "SOL_CANCEL": kq_tu_cot = "B"
        Case "ORDER_SCAN", "BCNK": kq_tu_cot = "C"
        Case "MATERIAL_SHORTAGE": kq_tu_cot = "N"
        Case "MATER_ITEM": kq_tu_cot = "E"
    End Select
'    socot_kq
    Select Case sheet_can_duyet_name
        Case "SHIPOUT", "BCNK": socot_kq = 2
        Case "ORDER_SCAN", "BY_DATE", "KITTING", "MATERIAL_SHORTAGE", "SOL_CANCEL": socot_kq = 1
        Case "PRINT_STAGE", "CUT_STAGE", "MATER_ITEM": socot_kq = 3
    End Select
'    kq_den_cot
    Select Case sheet_can_duyet_name
        Case "SHIPOUT": kq_den_cot = 1
        Case "ORDER_SCAN": kq_den_cot = 3
        Case "BY_DATE": kq_den_cot = 17
        Case "KITTING": kq_den_cot = 4
        Case "MATERIAL_SHORTAGE": kq_den_cot = 5
        Case "PRINT_STAGE": kq_den_cot = 6
        Case "CUT_STAGE": kq_den_cot = 9
        Case "BCNK": kq_den_cot = 12
        Case "SOL_CANCEL": kq_den_cot = 18
        Case "MATER_ITEM": kq_den_cot = 14
    End Select

Nếu bạn cảm thấy khó hiểu thì thay toàn bộ đoạn trên bằng
Mã:
Select Case sheet_can_duyet_name
    Case "SHIPOUT":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "B"
        socot_kq = 2
        kq_den_cot = 1
    Case "BY_DATE":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "B"
        socot_kq = 1
        kq_den_cot = 17
    Case "KITTING":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "B"
        socot_kq = 1
        kq_den_cot = 4
    Case "PRINT_STAGE":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "B"
        socot_kq = 3
        kq_den_cot = 6
    Case "CUT_STAGE":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "B"
        socot_kq = 3
        kq_den_cot = 9
    Case "SOL_CANCEL":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "B"
        socot_kq = 1
        kq_den_cot = 18
    Case "ORDER_SCAN":
        cot_historys = "A"
        cot_do = "A"
        kq_tu_cot = "C"
        socot_kq = 1
        kq_den_cot = 3
    Case "BCNK":
        cot_historys = "A"
        cot_do = "B"
        kq_tu_cot = "C"
        socot_kq = 2
        kq_den_cot = 12
    Case "MATERIAL_SHORTAGE":
        cot_historys = "A"
        cot_do = "B"
        kq_tu_cot = "N"
        socot_kq = 1
        kq_den_cot = 5
    Case "MATER_ITEM":
        cot_historys = "L"
        cot_do = "A"
        kq_tu_cot = "E"
        socot_kq = 3
        kq_den_cot = 14
End Select

Tức bạn phải nhập cot_historys, cot_do, kq_tu_cot, socot_kq, kq_den_cot cho từng sheet. Khi thêm sheet mới thì thêm cot_historys, cot_do, kq_tu_cot, socot_kq, kq_den_cot cho sheet mới.

Vd.
"thêm 1 sheet SPEED_MACHINE, điều kiện lấy là nếu tìm thấy cột L của historys bên cột B sheet SPEED_MACHINE thì lấy các cột E F G H I trả về vùng AV, AW, AX, AY, AZ sheet HISTORYS, nếu không tìm thấy thì không làm gì cả."

thì
cot_historys = "L" <- lấy giá trị ở cột "L" của HISTORYS hoặc SUMMARY để tìm kiếm
cot_do = "B" <- dò tìm ở cột "B" của sheet thêm là SPEED_MACHINE
kq_tu_cot = "E" <- cột đầu tiên lấy kết quả từ SPEED_MACHINE là cột "E"
socot_kq = 5 <- tính từ cột "E" lấy tổng cộng 5 cột
kq_den_cot = 23 <- mảng Z_AQ sẽ được nhập xuống HISTORYS hoặc SUMMARY vào các cột của Z:AQ. Cột AV sẽ tương ứng với cột 23 trong mảng Z_AQ. Vì thế kq_den_cot = 23.

Tóm lại nếu bạn dùng phiên bản dài dòng hơn như ở trên thì phải thêm 1 CASE
Case "SPEED_MACHINE":
cot_historys = "L"
cot_do = "B"
kq_tu_cot = "E"
socot_kq = 5
kq_den_cot = 23


3. Trong module ThisWorkbook có code trong Sub Workbook_SheetChange. Mỗi khi có sự thay đổi trong sheet nào đó của tập tin mà không phải là HISTORYS và SUMMARY thì code trong Workbook_SheetChange sẽ NGAY LẬP TỨC gọi sub duyet_KHAC, nhưng code trong sub duyet_KHAC chỉ được thực hiện khi tên sheet được liệt kê trong Select ... Case ... End Select. Hiện tại danh sách mới chỉ có: "SHIPOUT", "ORDER_SCAN", "BY_DATE", "KITTING", "PRINT_STAGE", "CUT_STAGE", "SOL_CANCEL", "MATERIAL_SHORTAGE", "BCNK", "MATER_ITEM".

4. Trong module SUMMARY có sub Worksheet_Change. Khi có bất cứ sự thay đổi nào trong SUMMARY, từ cột E tới cột AS, thì code sẽ tính giá trị cho cột BA. Nếu có sự thay đổi trong A:AU thì tính giá trị cho cột BB.

5. Bạn tự test thật kỹ vì con người ai cũng có thể nhầm lẫn. Việc của bạn, chỉ bạn hiểu rõ dữ liệu, nên cách test bạn phải biết, không ai giúp được phần test. Tôi ghi chú rất nhiều. Cần đọc kỹ để hiểu ý nghĩa các biến, những việc mà từng dòng code thực hiện.

Hình như bạn có nói là các sheet như SHIPOUT có ít dòng mà sao tôi thấy thực tế khác xa.
SHIPOUT = 18331 dòng
ORDER_SCAN = 17455 dòng
BY_DATE = 32978 dòng
KITTING = 31209 dòng
A batman1 ơi em có chút hơi khó hiểu về file đính kem a gửi vì nó giống file a huonghctk em xem mãi rồi vì em copy code của a vào lắp ghép thì ko thế chạy a xem lại giúp em với
 
Upvote 0
A batman1 ơi em có chút hơi khó hiểu về file đính kem a gửi vì nó giống file a huonghctk em xem mãi rồi vì em copy code của a vào lắp ghép thì ko thế chạy a xem lại giúp em với
Tôi không hiểu bạn nói gì.

À mà nếu tập tin tôi đính kèm giống y như tập tin của bạn HUONGHCKT thì cứ coi như không có tập tin của tôi đi. Bạn cứ nghiên cứu tập tin của bạn HUONGHCKT là được rồi.
 
Upvote 0
Tôi không hiểu bạn nói gì.

À mà nếu tập tin tôi đính kèm giống y như tập tin của bạn HUONGHCKT thì cứ coi như không có tập tin của tôi đi. Bạn cứ nghiên cứu tập tin của bạn HUONGHCKT là được rồi.
Em xem rồi nhưng giờ em không biết ghép code như thế nào ấy thực tế em đang nghĩ a viết theo file em gửi ở bài 32 được tóm tắt xuống bài 36 bà 37 vì còn nhiều phần mở rộng như cột BC cập nhật ngày thay đổi, hiện tại thì em đang ngồi ghép nhưng khả năng có hạn ghép không nổi, vì code trong file a gửi là code khác bên ngoài bài viết, em không dám đòi hỏi nhiều, em cám ơn a đã giúp ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Em xem rồi nhưng giờ em không biết ghép code như thế nào ấy thực tế em đang nghĩ a viết theo file em gửi ở bài 32 được tóm tắt xuống bài 36 bà 37 vì còn nhiều phần mở rộng như cột BC cập nhật ngày thay đổi, hiện tại thì em đang ngồi ghép nhưng khả năng có hạn ghép không nổi, vì code trong file a gửi là code khác bên ngoài bài viết, em không dám đòi hỏi nhiều, em cám ơn a đã giúp ạ
Code tôi đã viết, việc của bạn chỉ là test thôi. Tập tin đính kèm ở bài 39 đã làm hết mọi việc mà tôi đã thống nhất với bạn. Có code cho RefreshAll, có code để duyệt mỗi tập tin SHIPOUT, MATER_ITEM, ... khi chúng thay đổi, có cập nhật ngày thay đổi trong cột BC, có code để tính giá trị cho SUMMARY!BA, BB thay cho công thức.

Trong bài 39 có tập tin. Bạn đã test chưa mà bạn viết những điêu vô lý như trên? Nếu test rồi mà chỗ nào sai hoặc chưa đúng ý thì phải cho ví dụ cụ thể. Tôi không tranh luận khi bạn chỉ nói chung chung vài câu. Code có hết trong tập tin ở bài 39 rồi, bạn còn muốn code nào nữa? Code có rồi thì nhiệm vụ của bạn là test và cho góp ý. Chứ viết code nào nữa? Ghép code nào nữa?

Muốn test RefreshAll? Thì nhấn nút RefreshAll ở sheet HISTORYS rồi kiểm tra thôi. Muốn test xem có code nào chạy khi vd. SHIPOUT thay đổi? Thì thử thay đổi bằng tay dữ liệu trong sheet SHIPOUT thôi. Muốn xem có ngày trong BC? Thì nhập bằng tay dòng mới trong FRU mà có S = "AWAIT..." rồi nhấn RefreshAll để kiểm tra thôi. Muốn kiểm tra giá trị trong BA, BB của SUMMARY? Thì thử thay đổi bằng tay dòng nào đó trong SUMMARY thôi. Tôi phải dạy bạn cách test à?
 
Upvote 0
Code tôi đã viết, việc của bạn chỉ là test thôi. Tập tin đính kèm ở bài 39 đã làm hết mọi việc mà tôi đã thống nhất với bạn. Có code cho RefreshAll, có code để duyệt mỗi tập tin SHIPOUT, MATER_ITEM, ... khi chúng thay đổi, có cập nhật ngày thay đổi trong cột BC, có code để tính giá trị cho SUMMARY!BA, BB thay cho công thức.

Trong bài 39 có tập tin. Bạn đã test chưa mà bạn viết những điêu vô lý như trên? Nếu test rồi mà chỗ nào sai hoặc chưa đúng ý thì phải cho ví dụ cụ thể. Tôi không tranh luận khi bạn chỉ nói chung chung vài câu. Code có hết trong tập tin ở bài 39 rồi, bạn còn muốn code nào nữa? Code có rồi thì nhiệm vụ của bạn là test và cho góp ý. Chứ viết code nào nữa? Ghép code nào nữa?

Muốn test RefreshAll? Thì nhấn nút RefreshAll ở sheet HISTORYS rồi kiểm tra thôi. Muốn test xem có code nào chạy khi vd. SHIPOUT thay đổi? Thì thử thay đổi bằng tay dữ liệu trong sheet SHIPOUT thôi. Muốn xem có ngày trong BC? Thì nhập bằng tay dòng mới trong FRU mà có S = "AWAIT..." rồi nhấn RefreshAll để kiểm tra thôi. Muốn kiểm tra giá trị trong BA, BB của SUMMARY? Thì thử thay đổi bằng tay dòng nào đó trong SUMMARY thôi. Tôi phải dạy bạn cách test à?
Dạ, em hiểu là em phải test, nhưng ý em là trong file a gửi em không thấy có đoạn code nào như a hướng dẫn, vì vậy khi em muốn thêm đoạn code của a vào thì em không biết thêm vào đâu để chạy, em không có ý tranh luận đâu ạ, em không dám tranh luận mà em chưa hiểu em muốn a chỉ giúp em thôi.
 
Upvote 0
.
File bài #39 bị lộn tiệm. Ở bài #43 người ta nói vậy cũng nên quay về bài #39 tải lại file đó và kiểm tra.

Đăng nhầm file là chuyện bình thường.
 
Upvote 0
Dạ, em hiểu là em phải test, nhưng ý em là trong file a gửi em không thấy có đoạn code nào như a hướng dẫn, vì vậy khi em muốn thêm đoạn code của a vào thì em không biết thêm vào đâu để chạy, em không có ý tranh luận đâu ạ, em không dám tranh luận mà em chưa hiểu em muốn a chỉ giúp em thôi.
Chết thật, tôi cứ đinh ninh là đã đính kèm đúng tập tin.

Nếu bạn viết rõ là bạn không tìm thấy sub RefreshAll, sub duyet_FRU, sub duyet_KHAC trong tập tin thì có thể tôi sẽ giật mình và kiểm tra lại. Còn chung chung thế thì mấy phút trước khi đọc
ý em là trong file a gửi em không thấy có đoạn code nào như a hướng dẫn
tôi mới giật mình và kiểm tra lại. Đó không phải là tập tin với code của tôi mà là code của bạn. Khi tôi viết xong bài này (tôi luôn viết trong notepad, khi xong mới copy -> paste lên GPE) thì mới nhìn thấy bài 48

Bạn hãy tải lại tập tin. Toàn bộ code trong Module1, module SUMMARY và module ThisWorkbook.
 

File đính kèm

  • bHistory(1).xlsb
    4.4 MB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
Chết thật, tôi cứ đinh ninh là đã đính kèm đúng tập tin.

Nếu bạn viết rõ là bạn không tìm thấy sub RefreshAll, sub duyet_FRU, sub duyet_KHAC trong tập tin thì có thể tôi sẽ giật mình và kiểm tra lại. Còn chung chung thế thì mấy phút trước khi đọc

tôi mới giật mình và kiểm tra lại. Đó không phải là tập tin với code của tôi mà là code của bạn. Khi tôi viết xong bài này (tôi luôn viết trong notepad, khi xong mới copy -> paste lên GPE) thì mới nhìn thấy bài 48

Bạn hãy tải lại tập tin. Toàn bộ code trong Module1, module SUMMARY và module ThisWorkbook.
Em cám ơn anh nhé, em đã chạy thử, về phần thêm các sheet thì em dựa vào phần a ghi chú em có thể thêm được rồi
nhưng sheet historys mỗi khi nhấn refresh sẽ lấy tất cả nhưng số dòng hiện có của FRU và thêm nối tiếp vào sheet historys sẽ dẫn đến trùng lặp, chứ không lấy được dữ liệu mới nữa, số dòng trắng sinh ra ở sheet summary cũng tăng tối đa hơn 1 triệu dòng em thử kéo thanh trượt xuống thấy vậy, chỉ cần nhấn nút refresh vài lần sẽ dẫn đến lỗi "notResponding" không phản hồi. A xem giúp em với ạ.
 

File đính kèm

  • bHistory(1).xlsb
    5.3 MB · Đọc: 2
Upvote 0
Em cám ơn anh nhé, em đã chạy thử, về phần thêm các sheet thì em dựa vào phần a ghi chú em có thể thêm được rồi
nhưng sheet historys mỗi khi nhấn refresh sẽ lấy tất cả nhưng số dòng hiện có của FRU và thêm nối tiếp vào sheet historys sẽ dẫn đến trùng lặp, chứ không lấy được dữ liệu mới nữa, số dòng trắng sinh ra ở sheet summary cũng tăng tối đa hơn 1 triệu dòng em thử kéo thanh trượt xuống thấy vậy, chỉ cần nhấn nút refresh vài lần sẽ dẫn đến lỗi "notResponding" không phản hồi. A xem giúp em với ạ.
Muốn test thì trước hết phải có dữ liệu chuẩn.

Bạn thêm một sheet mới và nhập vào A1 công thức
Mã:
=FRU!C2=HISTORYS!C2

Kết quả có FALSE. Nhìn bằng mắt có vẻ là cùng là "Ngày 06 tháng 10 năm 2021". Nhưng thực ra chỉ có HISTORYS!C2 là ngày tháng chuẩn, còn FRU!C2 là ngày tháng nhái ở dạng Text. Vì thế Excel cho là chúng không bằng nhau. Hậu quả ra sao? Lấy ví dụ:

FRU
A2 = 57038842-1, B2 = HNK, C2 = <23.07.2021 ở dạng text>

HISTORYS
A2 = 57038842-1, B2 = HNK, C2 = <23.07.2021 ở dạng Ngày tháng chuẩn>

Do bạn muốn ghép các cột nên từ FRU có dòng 1 = 57038842-1#HNK#<23.07.2021 ở dạng text>..., trong HISTORYS có 57038842-1#HNK#<23.07.2021 ở dạng Ngày tháng chuẩn> ... Rõ ràng 2 chuỗi không như nhau và dòng 1 được coi như dòng mới.

Thử có tất cả các ngày tháng đều chuẩn rồi mới chạy code thì rõ thôi. Trong FRU chỉ có I, J, K chứa ngày tháng chuẩn còn C, D, E, AA, AB, AE, AF, AG chứa ngày tháng nhái.

Tôi thú thực với bạn không một chút ngượng ngùng là tôi không có kinh nghiệm xoay xở với những dữ liệu ngày tháng nhái. Tôi đã nói về vấn đề này từ bài 7 trở đi. Bạn nên viết rõ và nhờ mọi người, chịu khó chờ ai đó có kinh nghiệm làm việc với ngày tháng không chuẩn. Trên GPE những người như thế cứ đi vài bước lại gặp.

Mà theo tôi khi test ở bước đầu để kiểm tra xem code có lỗi không, có đúng ý không, thì nên soạn dữ liệu đầu vào ít thôi - vài ba dòng. Lúc đó dễ theo dõi, dễ kiểm tra hơn nhiều.
 
Upvote 0
Muốn test thì trước hết phải có dữ liệu chuẩn.

Bạn thêm một sheet mới và nhập vào A1 công thức
Mã:
=FRU!C2=HISTORYS!C2

Kết quả có FALSE. Nhìn bằng mắt có vẻ là cùng là "Ngày 06 tháng 10 năm 2021". Nhưng thực ra chỉ có HISTORYS!C2 là ngày tháng chuẩn, còn FRU!C2 là ngày tháng nhái ở dạng Text. Vì thế Excel cho là chúng không bằng nhau. Hậu quả ra sao? Lấy ví dụ:

FRU
A2 = 57038842-1, B2 = HNK, C2 = <23.07.2021 ở dạng text>

HISTORYS
A2 = 57038842-1, B2 = HNK, C2 = <23.07.2021 ở dạng Ngày tháng chuẩn>

Do bạn muốn ghép các cột nên từ FRU có dòng 1 = 57038842-1#HNK#<23.07.2021 ở dạng text>..., trong HISTORYS có 57038842-1#HNK#<23.07.2021 ở dạng Ngày tháng chuẩn> ... Rõ ràng 2 chuỗi không như nhau và dòng 1 được coi như dòng mới.

Thử có tất cả các ngày tháng đều chuẩn rồi mới chạy code thì rõ thôi. Trong FRU chỉ có I, J, K chứa ngày tháng chuẩn còn C, D, E, AA, AB, AE, AF, AG chứa ngày tháng nhái.

Tôi thú thực với bạn không một chút ngượng ngùng là tôi không có kinh nghiệm xoay xở với những dữ liệu ngày tháng nhái. Tôi đã nói về vấn đề này từ bài 7 trở đi. Bạn nên viết rõ và nhờ mọi người, chịu khó chờ ai đó có kinh nghiệm làm việc với ngày tháng không chuẩn. Trên GPE những người như thế cứ đi vài bước lại gặp.

Mà theo tôi khi test ở bước đầu để kiểm tra xem code có lỗi không, có đúng ý không, thì nên soạn dữ liệu đầu vào ít thôi - vài ba dòng. Lúc đó dễ theo dõi, dễ kiểm tra hơn nhiều.
Dạ, em đã xóa bớt dữ liệu chỉ để lại một vài dòng để chạy thử, kết quả cho thấy sheet summary hoạt động ổn hơn chỉ còn lại số dòng trống sinh ra hơn 1 triệu dòng nó gây nặng quá.
Đối với phần sheet historys
đến lúc a nói đến câu này
Do bạn muốn ghép các cột nên từ FRU có dòng 1 = 57038842-1#HNK#<23.07.2021 ở dạng text>..., trong HISTORYS có 57038842-1#HNK#<23.07.2021 ở dạng Ngày tháng chuẩn> ... Rõ ràng 2 chuỗi không như nhau và dòng 1 được coi như dòng mới. -> em mới hiểu hết được a sẽ ghép toàn bộ cột từ A đến AB thành một chuỗi giống như căn cước công dân không trùng nhau để đưa sang nối tiếp vào historys, và do khác nhau là phần ngày tháng không chuẩn
cái này mặc dù em đã chuyển bằng công thức để lấy ngày chuẩn nhưng mỗi lần ấn refresh all vẫn tiếp tục lấy vào một chuỗi khác trùng lặp với chuỗi ký tự đang có.

như vậy giờ a có thể lấy theo cách này được không ạ,
chỉ kiểm tra cột A sheet FRU với cột A sheet historys thôi, ví dụ nếu sheet FRU có 63283769-5 dòng A7 mà historys không có thì lấy 63283769-5 từ A7 sang nối tiếp vào historys đồng thời lấy tiếp từ B7 đến AB7 sang historys, vì cột A (SOL) là cột không bao giờ bị trùng lặp, thay vì a đang phải ghép A đến AB cũng rất vất vả.


giờ em mới hiểu hết được cấu trúc a vừa diễn tả, thực sự em cũng thấy nó phức tạp quá.
 

File đính kèm

  • bHistory(1).xlsb
    4.1 MB · Đọc: 3
Upvote 0
giờ em mới hiểu hết được cấu trúc a vừa diễn tả, thực sự em cũng thấy nó phức tạp quá.
Tôi đã mất rất nhiều bài để thống nhất với bạn chuyện so sánh A hay so sánh cả dòng A & B & ... & AB.

Tôi biết là với một dữ liệu "nào đó" thì cả hai cách là như nhau. Tức dữ liệu không tùy ý mà nó luôn ở "trạng thái" mà cả 2 cách so sánh A hay cả dòng là như nhau.

Chỉ có điều tôi không biết có luôn luôn đảm bảo cái "trạng thái" kia hay không. Rất nhiều người như bạn, không bao giờ mô tả dữ liệu đầu vào, nên những người như tôi không dám chắc chúng như thế nào. Chính vì thế tôi "bắt" bạn phải quyết định, tôi chỉ là người làm hộ. Nhiều người cứ làm như họ hiểu, đúng thực trạng hay không người nhờ ráng chịu. Tôi khác họ. Nếu tôi giúp thì tôi muốn người ta ý thức được những "nguy hiểm" tiềm năng. Để họ không bị bất ngờ khi gặp chúng.

Bây giờ lại chỉ so sánh cột A thì lại như "hồi đầu" tôi viết, đơn giản hơn. Lại phải tối nay tôi mới xem lại và chỉnh sửa.
 
Upvote 0
Chính vì thế tôi "bắt" bạn phải quyết định, tôi chỉ là người làm hộ. Nhiều người cứ làm như họ hiểu, đúng thực trạng hay không người nhờ ráng chịu. Tôi khác họ. Nếu tôi giúp thì tôi muốn người ta ý thức được những "nguy hiểm" tiềm năng
vâng em hiểu ạ, nếu không như vậy khiến cho cách xử lý khác dẫn đến kết quả khác nhau.
 
Upvote 0
vâng em hiểu ạ, nếu không như vậy khiến cho cách xử lý khác dẫn đến kết quả khác nhau.
Code được viết cho giả thiết ở bài 39, chỉ có 1 điểm khác biệt: khi duyệt FRU cho SUMMARY hoặc HISTORYS thì không tìm toàn bộ từng dòng của FRU trong SUMMARY hoặc HISTORYS mà chỉ tìm SOL từ cột A của FRU trong cột A của SUMMARY hoặc HISTORYS.

Khi có lỗi (error) thì phải: cung cấp tất cả các thao tác lần lượt để tôi tạo lại tình huống lỗi.

Khi có kết quả không mong muốn thì phải: cung cấp tất cả các thao tác lần lượt để tôi tạo lại tình huống sai. Cho biết kết quả chạy code sau hàng loạt thao tác ấy là gì, và cho biết theo yêu cầu thì kết quả phải là gì.

Tôi đã lược bỏ 1 triệu dòng thừa trong SUMMARY.
 

File đính kèm

  • dasuabHistory.xlsb
    1.6 MB · Đọc: 19
Upvote 0
Code được viết cho giả thiết ở bài 39, chỉ có 1 điểm khác biệt: khi duyệt FRU cho SUMMARY hoặc HISTORYS thì không tìm toàn bộ từng dòng của FRU trong SUMMARY hoặc HISTORYS mà chỉ tìm SOL từ cột A của FRU trong cột A của SUMMARY hoặc HISTORYS.

Khi có lỗi (error) thì phải: cung cấp tất cả các thao tác lần lượt để tôi tạo lại tình huống lỗi.

Khi có kết quả không mong muốn thì phải: cung cấp tất cả các thao tác lần lượt để tôi tạo lại tình huống sai. Cho biết kết quả chạy code sau hàng loạt thao tác ấy là gì, và cho biết theo yêu cầu thì kết quả phải là gì.

Tôi đã lược bỏ 1 triệu dòng thừa trong SUMMARY.
Dạ, em cám ơn ạ, em sẽ chạy thử cẩn thận để xem có lỗi phát sinh không
 
Upvote 0
Code được viết cho giả thiết ở bài 39, chỉ có 1 điểm khác biệt: khi duyệt FRU cho SUMMARY hoặc HISTORYS thì không tìm toàn bộ từng dòng của FRU trong SUMMARY hoặc HISTORYS mà chỉ tìm SOL từ cột A của FRU trong cột A của SUMMARY hoặc HISTORYS.

Khi có lỗi (error) thì phải: cung cấp tất cả các thao tác lần lượt để tôi tạo lại tình huống lỗi.

Khi có kết quả không mong muốn thì phải: cung cấp tất cả các thao tác lần lượt để tôi tạo lại tình huống sai. Cho biết kết quả chạy code sau hàng loạt thao tác ấy là gì, và cho biết theo yêu cầu thì kết quả phải là gì.

Tôi đã lược bỏ 1 triệu dòng thừa trong SUMMARY.
A batman1 ơi sau một thời gian em chạy thử thì có vấn đề phát sinh.
Sub duyet_KHAC(ByVal sheet_can_duyet_name As String) ' khi sheet_can_duyet_name co thay doi thi cap nhat HISTORYS va SUMMARY
khi có thay đổi dữ liệu ở các sheet khác thì sẽ tự động cập nhật, cái này rất tiện lợi đối với sheet có vài trăm dòng thì chạy rất nhanh, nhưng khi có hàng nghìn dòng trở lên mỗi lần có 1 dòng thay đổi thì excel sẽ hiển thị "calculating" mất 10 đến 15 phút mới xong, sau đó vẫn phải nhấn nút "refresh all" thì dữ liệu mới cập nhật chuẩn được còn không nhấn nút một số trường hợp sẽ phát sinh #N/A bên sheet HISTORYS
vì vậy a có thể giúp em trong lúc các sheet có dữ liệu thay đổi thì không tự tính "calculating" tức là có thể nhập thoải mái cho đến khi nào nhập xong dữ liệu ở các sheet khác rồi nhấn nút refresh all thì dữ liệu mới được cập nhật.
cũng khá lâu em mới hỏi được anh vì lúc đó em cũng chưa biết nguyên nhân để diễn tả cho a hiểu.
 
Upvote 0
Sub duyet_KHAC(ByVal sheet_can_duyet_name As String) ' khi sheet_can_duyet_name co thay doi thi cap nhat HISTORYS va SUMMARY
khi có thay đổi dữ liệu ở các sheet khác thì sẽ tự động cập nhật, cái này rất tiện lợi đối với sheet có vài trăm dòng thì chạy rất nhanh, nhưng khi có hàng nghìn dòng trở lên mỗi lần có 1 dòng thay đổi thì excel sẽ hiển thị "calculating" mất 10 đến 15 phút mới xong, sau đó vẫn phải nhấn nút "refresh all" thì dữ liệu mới cập nhật chuẩn được
Bạn cần tập viết cụ thể, chính xác. Bạn nói về nút Refresh All. Nó nằm ở đâu vậy? Tôi xem qua thì trong sheet HISTORYS có nút "Refresh", không có "Refresh All". Trong OUTPUT có "Refresh All" nhưng nó không được gán cho sub nào. Hay là bạn muốn nói tới NÚT "Refresh" (không có All), được gán cho SUB Refresh All? NÚT Refresh All hay SUB Refresh All là 2 chuyện khác nhau hoàn toàn. Hãy tập nói, viết thật chính xác.

Ý bạn là khi chỉnh sửa các sheet nào thì không tự động chạy Sub duyet_KHAC? Bạn nên nhớ là tôi giúp bạn hơn 4 tháng trước và không ai có thể nhớ khi đó mình làm gì, vấn đề cụ thể ra sao, có những khúc mắc gì. Vì thế phải giải thích cụ thể. Bạn không muốn chạy Sub duyet_KHAC khi các sheet KHÁC đang có chỉnh sửa? Tức cụ thể là các sheet "ORDER_SCAN", "BY_DATE", "KITTING", "PRINT_STAGE", "CUT_STAGE", "SOL_CANCEL", "MATERIAL_SHORTAGE", "BCNK" ...? Nếu thế thì:

1. Trong module ThisWorkbook xóa
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name <> "HISTORYS" And Sh.Name <> "SUMMARY" Then duyet_KHAC Sh.Name
End Sub

2. Khi nào muốn làm mới thì nhấn NÚT Refresh trên sheet HISTORYS để chạy SUB Refresh All.
 
Upvote 0
Bạn cần tập viết cụ thể, chính xác. Bạn nói về nút Refresh All. Nó nằm ở đâu vậy? Tôi xem qua thì trong sheet HISTORYS có nút "Refresh", không có "Refresh All". Trong OUTPUT có "Refresh All" nhưng nó không được gán cho sub nào. Hay là bạn muốn nói tới NÚT "Refresh" (không có All), được gán cho SUB Refresh All? NÚT Refresh All hay SUB Refresh All là 2 chuyện khác nhau hoàn toàn. Hãy tập nói, viết thật chính xác.

Ý bạn là khi chỉnh sửa các sheet nào thì không tự động chạy Sub duyet_KHAC? Bạn nên nhớ là tôi giúp bạn hơn 4 tháng trước và không ai có thể nhớ khi đó mình làm gì, vấn đề cụ thể ra sao, có những khúc mắc gì. Vì thế phải giải thích cụ thể. Bạn không muốn chạy Sub duyet_KHAC khi các sheet KHÁC đang có chỉnh sửa? Tức cụ thể là các sheet "ORDER_SCAN", "BY_DATE", "KITTING", "PRINT_STAGE", "CUT_STAGE", "SOL_CANCEL", "MATERIAL_SHORTAGE", "BCNK" ...? Nếu thế thì:

1. Trong module ThisWorkbook xóa
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name <> "HISTORYS" And Sh.Name <> "SUMMARY" Then duyet_KHAC Sh.Name
End Sub

2. Khi nào muốn làm mới thì nhấn NÚT Refresh trên sheet HISTORYS để chạy SUB Refresh All.
Dạ đúng rồi ạ, để em kiểm tra kỹ xem có lỗi gì nữa không
 
Upvote 0
Web KT

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

Back
Top Bottom