tôi đã ghi lại một macro
nhưng mỗi lần muốn chạy macro nay thi phải chạy lại macro đó
tôi muốn hỏi có thể cho macro này chạy liên tục, mỗi lần cách nhau một khoảng thời gian, giả sử 60s chẳng hạn
các anh chị chỉ giùm
Không biết người khác thế nào chứ riêng tôi thì chẳng khoái giúp những chuyện quá mơ hồ:
- File đính kèm chứa dữ liệu đâu?
- Tại sao phải cần đến con macro chạy theo cách khoảng thời gian?
- macro này làm công việc gì?
vân vân và vân vân
Bạn càng mô tả chỉ tiết (kết hợp có kèm file) thì càng nhận được sự trợ giúp nhanh chóng. Hỏi mơ hồ thế thì chờ vài năm nữa thôi
Tôi hiểu rằng bạn đang muốn thử nghiệm macro. Khi thử nghiệm, người ta hay nghĩ ra nhiều hướng xử lý hay thực hiện mà đôi khi chúng trở thành "quái chiêu".
Nếu đặt trong hoàn cảnh macro của excel, yêu cầu chạy lại theo thời gian là vô nghĩa. Nếu là hệ điều hành, bạn có thể yêu cầu 10 phút lại kêu tít 1 cái thì nên. Còn Excel thì mục đích chính là xử lý số liệu theo quy tắc riêng của bạn. chẳng lẽ quy tắc của bạn là cứ 60 giây thì thực hiện lại sao?
Tôi chỉ muốn trao đổi vài lời, vì biết rằng "quái chiêu" không có nghĩa là sai, mà rất có lợi trong khám phá. Và để khám phá hiệu quả, ta nên đánh giá năng lực, chức năng của phần mềm.
Mình viết cho bạn chương trình tự chạy marco liên tiếp bằng VB.NET
Bạn chỉ việc chạy file OpenMarcoExcel.exe thôi, sau đó nhập tên file, tên marco, thời gian là được.
Chú ý: Thời gian phải lớn hơn thời gian chạy của marco.
Mình đưa cả code của VB.net để bạn tham khảo.
là thế này...
tôi có một sheet nhập liệu, số liệu được nhập liên tiếp...
tôi có một sheet khác lấy dữ liệu từ sheet đó nhưng dùng vlookup thi dung lượng tăng lên quá lớn do dữ liệu nhiều
tôi đã nghĩ ra một cách là dùng advance fiter và ghi lại macrco đó,khi muốn cập nhất số liệu thì cho chạy macro đó nhưng thế hơi bất tiện
nên muốn để cho nó tụ cập nhật liên tiếp sau khoảng từ 10 đến 15s...còn dữ liệu thì hơi nhiều có đến khoảng 50 cột và 10000 hàng lên up lên không tiện
là thế này...
tôi có một sheet nhập liệu, số liệu được nhập liên tiếp...
tôi có một sheet khác lấy dữ liệu từ sheet đó nhưng dùng vlookup thi dung lượng tăng lên quá lớn do dữ liệu nhiều
tôi đã nghĩ ra một cách là dùng advance fiter và ghi lại macrco đó,khi muốn cập nhất số liệu thì cho chạy macro đó nhưng thế hơi bất tiện
nên muốn để cho nó tụ cập nhật liên tiếp sau khoảng từ 10 đến 15s...còn dữ liệu thì hơi nhiều có đến khoảng 50 cột và 10000 hàng lên up lên không tiện
Theo mình thì bạn có thể xử lý theo 2 hướng:
1. Đặt phím tắt cho Macro --> Khi nào cần chạy Macro thì nhấn tổ hợp phím đã gán. Việc này không khó và cũng không đến nỗi bất tiện.
2. Giả sử Macro của bạn có tên là UpdateData. Bạn có thể sử dụng code sau cho đối tượng ThisWorkbook:
PHP:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
UpdateData
Application.EnableEvents = False
ThisWorkbook.Save
Application.EnableEvents = True
End Sub
Với code này, mỗi lần bạn lưu file thì dữ liệu sẽ được cập nhật (trước khi lưu).
dùng phím tắt thì cũng không ổn lắm.vì như file đính kèm này thì còn mất thời gian hơn
dùng lệnh chạy macro trước khi save thì ổn hơn nhưng cũng chưa khắc phục hoàn toàn yêu cầu
có cách nào khác không ạ...hay có giải quyêt nào tốt hơn không???
tại dung lượng dùng mấy lệnh vlookup thì lớn quá, chưa kể khi có nhiều điều kiện lọc và phải tìm đến cột thứ 50...
Mình viết cho bạn chương trình tự chạy marco liên tiếp bằng VB.NET
Bạn chỉ việc chạy file OpenMarcoExcel.exe thôi, sau đó nhập tên file, tên marco, thời gian là được.
Chú ý: Thời gian phải lớn hơn thời gian chạy của marco.
Mình đưa cả code của VB.net để bạn tham khảo.
dùng phím tắt thì cũng không ổn lắm.vì như file đính kèm này thì còn mất thời gian hơn
dùng lệnh chạy macro trước khi save thì ổn hơn nhưng cũng chưa khắc phục hoàn toàn yêu cầu
có cách nào khác không ạ...hay có giải quyêt nào tốt hơn không???
tại dung lượng dùng mấy lệnh vlookup thì lớn quá, chưa kể khi có nhiều điều kiện lọc và phải tìm đến cột thứ 50...
Bạn đưa Macro này vào 1 module riêng, không nên đặt trong Sheet2 và gán phím tắt cho nó. Mỗi lần cần cập nhật chỉ cần nhấn tổ hợp phím vừa đặt. Hơn nữa, bạn có thể đứng ở vị trí bất kỳ và nhấn tổ hợp phím, không cần nhấn nút thì lý do gì mà lại mất thời gian hơn?
Ở đây, mình sửa lại Macro một chút (chữ G trong code có thể thay bởi 1 tên cột khác cho phù hợp với kích thước trên sheet Data):
Mã:
Sub UpdateData()
Application.CutCopyMode = False
Sheet2.Activate
Sheet1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, [J1:J2], [A1:[B][COLOR=red]G[/COLOR][/B]1]
End Sub
Nếu 2 cách trên mà vẫn chưa ưng ý thì bạn có thể sẽ phải dùng đến sự kiện WorkSheet_Change cho sheet Data:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If WorksheetFunction.CountA(Target.EntireRow) = 7 Then UpdateData
End Sub
Với cách này, bạn cần phải thêm câu lệnh Sheet1.Activate vào cuối Sub UpdateData.
Mình cũng đang nghĩ đến phương thức Application.OnTime (câu lệnh Application.OnTime Now + TimeValue("00:00:15"), "UpdateData") nhưng không biết có ổn không và dùng như thế nào mới được (đã thử nhưng chưa ưng ý)
Sao không đưa vào sự kiện Sheet2_Activate?
Nhập bao nhiêu data không cần biết, nhập bao nhiêu lâu không cần biết, khi mở sheet2 ra xem là cập nhật. Cập nhật sớm mỗi 15 giây 1 lần làm gì vì cập nhật để đó không xem?
Sao không đưa vào sự kiện Sheet2_Activate?
Nhập bao nhiêu data không cần biết, nhập bao nhiêu lâu không cần biết, khi mở sheet2 ra xem là cập nhật. Cập nhật sớm mỗi 15 giây 1 lần làm gì vì cập nhật để đó không xem?
Bạn đưa Macro này vào 1 module riêng, không nên đặt trong Sheet2 và gán phím tắt cho nó. Mỗi lần cần cập nhật chỉ cần nhấn tổ hợp phím vừa đặt. Hơn nữa, bạn có thể đứng ở vị trí bất kỳ và nhấn tổ hợp phím, không cần nhấn nút thì lý do gì mà lại mất thời gian hơn?
Ở đây, mình sửa lại Macro một chút (chữ G trong code có thể thay bởi 1 tên cột khác cho phù hợp với kích thước trên sheet Data):
Mã:
Sub UpdateData()
Application.CutCopyMode = False
Sheet2.Activate
Sheet1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, [J1:J2], [A1:[B][COLOR=red]G[/COLOR][/B]1]
End Sub
Nếu 2 cách trên mà vẫn chưa ưng ý thì bạn có thể sẽ phải dùng đến sự kiện WorkSheet_Change cho sheet Data:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If WorksheetFunction.CountA(Target.EntireRow) = 7 Then UpdateData
End Sub
Với cách này, bạn cần phải thêm câu lệnh Sheet1.Activate vào cuối Sub UpdateData.
Mình cũng đang nghĩ đến phương thức Application.OnTime (câu lệnh Application.OnTime Now + TimeValue("00:00:15"), "UpdateData") nhưng không biết có ổn không và dùng như thế nào mới được (đã thử nhưng chưa ưng ý)
nếu dùng như code bạn thay thì có 2 điều bất cập:
Khi thay đổi điều kiện lọc mà chưa thay đổi data sẽ không ra được gì cả
(liệu có cách cho chạy macro ngay sau khi thay đổi giá trị của ô điều kiện lọc không-ở đây là ô J2??)
khi không phải nhập giá trị vào tất cả các cột từ 1 đến 7 (có giá trị bằng 0 sẽ không ra được các giá trị còn lại như file đính kèm)
nếu dùng như code bạn thay thì có 2 điều bất cập:
Khi thay đổi điều kiện lọc mà chưa thay đổi data sẽ không ra được gì cả (liệu có cách cho chạy macro ngay sau khi thay đổi giá trị của ô điều kiện lọc không-ở đây là ô J2??)
khi không phải nhập giá trị vào tất cả các cột từ 1 đến 7 (có giá trị bằng 0 sẽ không ra được các giá trị còn lại như file đính kèm)
Chỗ màu đỏ ở trên có thể giải quyết dễ dàng với sự kiện Worksheet_Change.
Tóm lại là mình vẫn thích cách giải quyết ở bài #7 (đặt phím tắt, sử dụng Workbook_BeforeSave) và ở bài #12 (Worksheet_Activate cho Sheet2) nhất.