Chạy code (workbook open) sau khi sheet nguồn có dữ liệu (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Nhattanktnn

Thành viên gắn bó
Tham gia
11/11/16
Bài viết
3,161
Được thích
4,150
Donate (Momo)
Donate
Giới tính
Nam
Chào các anh chị và các bạn!
Mình có file xuất từ hệ thống ERP, sau khi xuất file thì sheet "draft" chạy sql lấy dữ liệu từ hệ thống (khoảng vài giây sau khi file được mở lên mới trả về đủ kết quả - cái này do IT làm và mình không can thiệp được)
Sheet "Result" mình có "chế" báo cáo theo ý muốn của mình, mình dùng workbook open để khi xuất báo cáo từ hệ thống thì Result sẽ lấy kết quả từ Draft
Tuy nhiên, do khi xuất file, sheet "draft" chưa kịp lấy dữ liệu thì sheet "Result" đã chạy code, nên kết quả mở lên file vẫn không có gì
Vậy anh chị và các bạn xem giúp có cách nào để code bên sheet "Result" "đợi" sheet "draft" có dữ liệu thì mới chạy code không?
(Nếu không có cách nào khác thì mình sẽ ấn nút chạy code, tuy nhiên hiểu biết hạn chế nên mình vẫn muốn hỏi xem có cách nào tự động được không?)
File đính kèm là file giả lập số liệu, để mọi người hình dung. Đuôi file gốc là định dạng .xltm
 

File đính kèm

Chào các anh chị và các bạn!
Mình có file xuất từ hệ thống ERP, sau khi xuất file thì sheet "draft" chạy sql lấy dữ liệu từ hệ thống (khoảng vài giây sau khi file được mở lên mới trả về đủ kết quả - cái này do IT làm và mình không can thiệp được)
Sheet "Result" mình có "chế" báo cáo theo ý muốn của mình, mình dùng workbook open để khi xuất báo cáo từ hệ thống thì Result sẽ lấy kết quả từ Draft
Tuy nhiên, do khi xuất file, sheet "draft" chưa kịp lấy dữ liệu thì sheet "Result" đã chạy code, nên kết quả mở lên file vẫn không có gì
Vậy anh chị và các bạn xem giúp có cách nào để code bên sheet "Result" "đợi" sheet "draft" có dữ liệu thì mới chạy code không?
(Nếu không có cách nào khác thì mình sẽ ấn nút chạy code, tuy nhiên hiểu biết hạn chế nên mình vẫn muốn hỏi xem có cách nào tự động được không?)
File đính kèm là file giả lập số liệu, để mọi người hình dung. Đuôi file gốc là định dạng .xltm
Bạn thử thêm thế này xem sao
Mã:
#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Sub Run()
sleep 1000
Call....
End sub
 
Upvote 0
Bạn thử thêm thế này xem sao
Mã:
#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Sub Run()
sleep 1000
Call....
End sub
Cảm ơn bạn, cái hạn chế của sleep hay wait là mình phải đặt một thời gian cố định. thỉnh thoảng xuất dữ liệu cả năm thì thời gian truy xuất lâu, mà nếu để thời gian chờ lâu thì khi xuất dữ liệu ít lại phải chờ mất thời gian
Nên ý mình muốn hỏi là có cách nào nhận biết sheet "draft" đã có dữ liệu thì bắt đầu chạy code
(Mình vẫn nghĩ là không nhưng thử hỏi xem biết đâu... )
 
Upvote 0
Cảm ơn bạn, cái hạn chế của sleep hay wait là mình phải đặt một thời gian cố định. thỉnh thoảng xuất dữ liệu cả năm thì thời gian truy xuất lâu, mà nếu để thời gian chờ lâu thì khi xuất dữ liệu ít lại phải chờ mất thời gian
Nên ý mình muốn hỏi là có cách nào nhận biết sheet "draft" đã có dữ liệu thì bắt đầu chạy code
(Mình vẫn nghĩ là không nhưng thử hỏi xem biết đâu... )
Sao bạn không chờ fle dữ liệu chạy ra hết mới chạy Code trên VBA. Vân toàn làm vậy
 
Upvote 0
Sao bạn không chờ fle dữ liệu chạy ra hết mới chạy Code trên VBA. Vân toàn làm vậy
Giả sử xuất dữ liệu cả năm, nó chờ 1 phút. xuất dữ liệu một tháng, hoặc vài ngày (mình thường xuất như này) thì khoảng 10 giây
Vậy nếu đặt sleep 10 giây thì nó không đúng cho trường hợp cả năm. Còn nếu để 1 hoặc 2 phút thì khi xuất dữ liệu 1 tháng mình phải ngồi đợi 2 phút
 
Lần chỉnh sửa cuối:
Upvote 0
Giải thuật: Kiểm tra dung lượng File, nếu thỏa mãn có dữ liệu thì dung lượng ra sao >> Mở.
 
Upvote 0
Tôi đề nghị bỏ code vào sheet_Activate. Trong workbook open thì active sheet draft (chắc đang trắng). Ngó thấy có dữ liệu thì mở result coi
Nếu không thì xem code xltm có mở không, chèn code của mình và câu lệnh vào và gọi
 
Upvote 0
Chào các anh chị và các bạn!
Mình có file xuất từ hệ thống ERP, sau khi xuất file thì sheet "draft" chạy sql lấy dữ liệu từ hệ thống (khoảng vài giây sau khi file được mở lên mới trả về đủ kết quả - cái này do IT làm và mình không can thiệp được)
Sheet "Result" mình có "chế" báo cáo theo ý muốn của mình, mình dùng workbook open để khi xuất báo cáo từ hệ thống thì Result sẽ lấy kết quả từ Draft
Tuy nhiên, do khi xuất file, sheet "draft" chưa kịp lấy dữ liệu thì sheet "Result" đã chạy code, nên kết quả mở lên file vẫn không có gì
Vậy anh chị và các bạn xem giúp có cách nào để code bên sheet "Result" "đợi" sheet "draft" có dữ liệu thì mới chạy code không?
(Nếu không có cách nào khác thì mình sẽ ấn nút chạy code, tuy nhiên hiểu biết hạn chế nên mình vẫn muốn hỏi xem có cách nào tự động được không?)
File đính kèm là file giả lập số liệu, để mọi người hình dung. Đuôi file gốc là định dạng .xltm
Nên tách 2 phần code,
- Phần 1 đọc dữ liệu
- Phần 2 , xử lý dữ liệu

Nên cứ bấm chạy phần 1, xong thì mới sang phần 2
 
Upvote 0
Một cách khác bạn tham khảo: Kiểm trả hiện trạng kết nối tới ERP, nếu đóng rồi thì bắt đầu xử lý.
 
Upvote 0
Giải thuật: Kiểm tra dung lượng File, nếu thỏa mãn có dữ liệu thì dung lượng ra sao >> Mở.
Nhưng code chung chung là thế nào vậy bác, xuất file là code đếm dung lượng liên tục, và khi nào đạt đến mốc quy định của mình thì sheet result bắt đầu chạy code xuất báo cáo phải không ạ?
Tôi đề nghị bỏ code vào sheet_Activate. Trong workbook open thì active sheet draft (chắc đang trắng). Ngó thấy có dữ liệu thì mở result coi
Nếu vậy nó cũng tương đương với button click mà thầy?
Nếu không thì xem code xltm có mở không, chèn code của mình và câu lệnh vào và gọi
Phần này em không hiểu lắm, thầy hướng dẫn thêm được không?
Nên tách 2 phần code,
- Phần 1 đọc dữ liệu
- Phần 2 , xử lý dữ liệu

Nên cứ bấm chạy phần 1, xong thì mới sang phần 2
Phần đọc dữ liệu ý tưởng cụ thể ra sao vậy bác?
Bài đã được tự động gộp:

Một cách khác bạn tham khảo: Kiểm trả hiện trạng kết nối tới ERP, nếu đóng rồi thì bắt đầu xử lý.
Ý tưởng này quá hay nhưng code này em không biết, bác có thể hướng dẫn sơ cho em được không?
 
Upvote 0
Nhưng code chung chung là thế nào vậy bác, xuất file là code đếm dung lượng liên tục, và khi nào đạt đến mốc quy định của mình thì sheet result bắt đầu chạy code xuất báo cáo phải không ạ?
Nếu vậy nó cũng tương đương với button click mà thầy?

Phần đọc dữ liệu ý tưởng cụ thể ra sao vậy bác?
Ý tưởng này quá hay nhưng code này em không biết, bác có thể hướng dẫn sơ cho em được không?
Ý tưởng của tôi nó tự động theo yêu cầu của bạn là không cần nhấn button
Các ý tưởng khác cũng chỉ là kiểm tra bằng các cách khác nhau, chưa có dữ liệu cũng thoát ra mất, không chạy. Nếu chỉ để kiểm tra thì code của bạn cũng kiểm tra rồi (LRow < 2)

Phần này em không hiểu lắm, thầy hướng dẫn thêm được không?
Nếu file xltm tự động lấy dữ liệu từ ERP, tức là nó có code. Nếu code mở (không bị khoá) thì chèn câu lệnh run codeTui vào cuối code của họ
 
Upvote 0
Nếu file xltm tự động lấy dữ liệu từ ERP, tức là nó có code. Nếu code mở (không bị khoá) thì chèn câu lệnh run codeTui vào cuối code của họ
Dạ để em tìm hiểu thêm có gì em xin hỏi lại thầy. Cái này em đang hơi gà mờ ạ
 
Upvote 0
Mình có file xuất từ hệ thống ERP, sau khi xuất file thì sheet "draft" chạy sql lấy dữ liệu từ hệ thống (khoảng vài giây sau khi file được mở lên mới trả về đủ kết quả - cái này do IT làm và mình không can thiệp được)
Tức là có 2 files phải không bạn?
 
Upvote 0
Tôi đề nghị bỏ code vào sheet_Activate. Trong workbook open thì active sheet draft (chắc đang trắng). Ngó thấy có dữ liệu thì mở result coi
Nếu không thì xem code xltm có mở không, chèn code của mình và câu lệnh vào và gọi

Dữ liệu nó đang ghi xuống sheet nếu nó mới ghi vài dòng, ngó thấy dữ liệu thì xử lý liền coi như bị thiếu dữ liệu rồi bác.
 
Upvote 0
Rút lại giải pháp do cảm thấy lạc đề :wacko:
 
Lần chỉnh sửa cuối:
Upvote 0
file xuất từ hệ thống ERP, sau khi xuất file thì sheet "draft" chạy sql lấy dữ liệu từ hệ thống (khoảng vài giây sau khi file được mở lên mới trả về đủ kết quả - cái này do IT làm và mình không can thiệp được)
Mình chưa hiểu mấy chỗ bôi đậm ở trên:
- Xuất là đi ra ngoài, trong khi tham chiếu gốc bây giờ là file Excel thì phải gọi là lấy (nhập) chứ.
- SQL kia như nào và do IT làm thì phải có file nữa chứ?
 
Upvote 0
Dữ liệu nó đang ghi xuống sheet nếu nó mới ghi vài dòng, ngó thấy dữ liệu thì xử lý liền coi như bị thiếu dữ liệu rồi bác.
Dữ liệu ghi xuống có 2 dạng:
- Ghi từng dòng: Sẽ nhìn thấy vài dòng thật, nhưng đồng thời thấy chớp chớp đang thêm dòng nữa, dòng nữa, ... khi nào ngưng là xong
- Ghi cái đùng nguyên bảng dữ liệu: Thấy dữ liệu là đã ghi xong
 
Upvote 0
Mình chưa hiểu mấy chỗ bôi đậm ở trên:
- Xuất là đi ra ngoài, trong khi tham chiếu gốc bây giờ là file Excel thì phải gọi là lấy (nhập) chứ.
- SQL kia như nào và do IT làm thì phải có file nữa chứ?
Nó có mục xuất file báo cáo này, nó là hình dưới, bác xem xong để em xóa hình nhé
 
Upvote 0
Nhưng code chung chung là thế nào vậy bác, xuất file là code đếm dung lượng liên tục, và khi nào đạt đến mốc quy định của mình thì sheet result bắt đầu chạy code xuất báo cáo phải không ạ?

Nếu vậy nó cũng tương đương với button click mà thầy?

Phần này em không hiểu lắm, thầy hướng dẫn thêm được không?

Phần đọc dữ liệu ý tưởng cụ thể ra sao vậy bác?
Bài đã được tự động gộp:


Ý tưởng này quá hay nhưng code này em không biết, bác có thể hướng dẫn sơ cho em được không?
Tóm lại, giải pháp nhanh và chính xác nhất, là đưa code VBA của bạn cho IT xử lý tiếp nối vào phần đọc dữ liệu draft - là xong. Hoặc trao đổi với IT bên bạn , người ta cho giải pháp nối code theo.
Còn đưa lên đây hỏi kiểu đoán voi thế này , mọi người cũng chỉ đoán và tư vấn thôi
 
Upvote 0
Cái đó là Addin của Excel phải không bạn? Hay là công cụ bên ERP?
Công cụ của ERP luôn bác, code thì IT có thể chế biến lấy dữ liệu từ ERP. Code này em sửa được, nhưng em không biết cách sửa và không biết cuối code có thể gọi code tự viết của mình vào được không
 
Upvote 0
Công cụ của ERP luôn bác, code thì IT có thể chế biến lấy dữ liệu từ ERP. Code này em sửa được, nhưng em không biết cách sửa và không biết cuối code có thể gọi code tự viết của mình vào được không
Vậy thì như này:
- Bạn không nên lấy dữ liệu từ ERP để chung vào file báo cáo của bạn. Nguyên tắc không làm vậy.
- Giờ bạn tách thành 2 files riêng biệt: File chứa dữ liệu lấy từ ERP, và file báo cáo của bạn.

ERP cứ lấy dữ liệu và ghi vào file draft (gì đó).
Bạn cứ code lấy dữ liệu từ file draft kia và tạo báo cáo của mình.

Vậy là được luôn.
 
Upvote 0
Công cụ của ERP luôn bác, code thì IT có thể chế biến lấy dữ liệu từ ERP. Code này em sửa được, nhưng em không biết cách sửa và không biết cuối code có thể gọi code tự viết của mình vào được không
Thử mới biết
Tuy nhiên nên làm theo ý của befaint, cái hình tôi chưa kịp xem
 
Upvote 0
Nhân tiện vụ ERP này mình nhắc lại (đã nói vài lần):
Các bạn trong doanh nghiệp, công ty dùng các phần mềm ERP thì nên và rất nên tìm hiểu các phần mềm tự động hóa đi.

Ví dụ: UiPath, và Microsoft Power Automate (mới có, trước là Microsoft Flow).

Như bài trong chủ đề này dùng UiPath lèo cái xong, thêm thiết lập Automation trong Orchestrator thì hoàn toàn không phải động tay gì cả.
 
Upvote 0
Cách an toàn nhất là dùng phương án token và handshake.
Bảo với bên xuất (tức là i-a-pi gì đó), lúc xuất thì thêm một cái file trống, không có gì, chỉ cần tên file theo dạng ngày tháng gì đó để dễ archive. Cái file ấy coi như token.
Bên nhận có một cái Windows task (chạy ngày, hay giờ gì đó tuỳ thích) cứ thấy hiện diện cái token này thì mở một VBScript, Excel gì gì đó mà tạo báo cáo.
Làm việc xong thì chuyển cái file token vào bên archive (lưu trữ). Và ngồi chờ cái token kế.
 
Upvote 0
Thớt thử code này xem. Sửa lại thời gian đợi cho phù hợp. Code cho sheet Draft:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Static T As Double
If T > 0 Then
    Application.OnTime T, "ExportReport", , False
End If
T = Now() + TimeSerial(0, 0, 2)
Application.OnTime T, "ExportReport"
End Sub
 
Upvote 0
Cảm ơn các thầy các bác đã nhiệt tình giúp đỡ.
Cảm ơn thầy @huuthang_bd rất nhiều, code của thầy chạy tốt với yêu cầu của em ạ!
Em xin cảm ơn tất cả mọi người
 
Upvote 0

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

Back
Top Bottom