Cài đặt thời gian để tự mở file excel bằng schedule task

Liên hệ QC

buonphatchan12

Thành viên mới
Tham gia
21/10/20
Bài viết
35
Được thích
1
Chào mọi người cho e hỏi một chút ạ. Em có một file excel cần 17h00 hàng ngày sẽ refresh nguồn và backup sang một sheet mới
1. Bây giờ e muốn công việc này tự động bằng schedule task. Nhưng khi làm thì schedule task không mở được file excel. Vậy có cách nào để mở được file excel bằng schedule task
2. Em có viết 1 đoạn code để refresh sheet là thisworkbook.refreshAll và tự thêm sheet mới copy dữ liệu sang sheet vừa thêm mới. Nhưng có vấn đề là chưa refresh xong ( thường refresh mất khoảng 10-15s) thì code đã chạy như vậy không đúng. Em đã dùng hàm wait trong vba nhưng vẫn không được.
Mong mọi người có thể giúp e vấn đề này được không ạ. Em cám ơn!
 
Lần chỉnh sửa cuối:
Trong tab "Action" bấm "Edit", ở mục Add arguments chèn vô cái đường dẫn file thử xem.

she.jpg
 
Upvote 0
(Chụp cái hình lại cắt mất tiêu cái đầu tiêu đề ứng dụng)

Vậy tên ứng dụng đó là gì?
Bác vào run->điền tên schedule task là nó ra ứng dụng đó mà
Trong tab "Action" bấm "Edit", ở mục Add arguments chèn vô cái đường dẫn file thử xem.

View attachment 256829
Em làm rồi, nó chỉ cho chạy file .exe thôi còn file excel .xlsb .xlsm không được, cho nên mới hỏi mọi người
 
Upvote 0
Bác vào run->điền tên schedule task là nó ra ứng dụng đó mà

Em làm rồi, nó chỉ cho chạy file .exe thôi còn file excel .xlsb .xlsm không được, cho nên mới hỏi mọi người
Thanh niên có thử chưa nhỉ? Tôi thử xong mới dám post lên đây đấy. Nếu sai đường dẫn file Excel thì nó sẽ báo lỗi để mà sửa.
Bài đã được tự động gộp:
 
Upvote 0
View attachment 256833


Tên phần mềm còn viết sai thì làm sao làm được.

Gõ từ khóa đúng vào Google thì chưa tới 1 giây có hướng dẫn chi tiết tận răng.
File nào mở bằng tay được thì đều chạy được hết.

View attachment 256834
1617941062876.png
Máy em nó là schedule tasks :))
Thanh niên có thử chưa nhỉ? Tôi thử xong mới dám post lên đây đấy. Nếu sai đường dẫn file Excel thì nó sẽ báo lỗi để mà sửa.
Bài đã được tự động gộp:
1617941188667.png
Anh thử là .exe Chứ excel thì nó hiện ra thông báo này mà. Không được thì mình mới hỏi chứ
 
Upvote 0
Máy em nó là schedule tasks :))

Bạn chụp màn hình phun không cắt toàn bộ phần mềm đã mở lên xem tên nó là gì. Hoặc vào mục Help >> About... xem tên là gì.

Cái từ khóa bạn gõ để tìm không nói lên gì cả.

1617941514589.png

---
Làm theo hướng dẫn ở trên ấy.

Mục Actions:
- Program: Nhập đường dẫn đầy đủ file chạy của phần mềm Excel.
- arguments: Nhập đường dẫn đầy đủ của file Excel cần mở.

* Lấy đường dẫn Excel.exe như hình
1617941700765.png
1617941714911.png
 
Upvote 0
View attachment 256836
Anh thử là .exe Chứ excel thì nó hiện ra thông báo này mà. Không được thì mình mới hỏi chứ
Bạn có vô tới phần Edit của Action chưa? Đã chỉ định đúng Program/Script là đường dẫn chương trình Excel chưa? Đã nạp đường dẫn file Excel vào ô "Add argument" chưa? Hay là bạn còn chưa biết cái mục Edit đó nằm chỗ nào?

Nếu chưa biết thì click phải lên cái Task của bạn, chọn Properties ấy, sau đó có cái tab Action, rồi chọn tiếp Edit, rồi nó sẽ hiện lên 2 cái ô để nạp vào thông số chạy. Mấy cái này phải chịu khó thử chứ hỏi tới hỏi lui mất thời gian cho bạn.
 
Upvote 0

buonphatchan12

Có 2 cách cho bạn:​

Cách 1: Sử dụng API của Task Scheduler trong Win Server;
1 click tạo Task Schedule từ Excel VBA: Hướng dẫn tại đây
Dùng SchTasks.Exe Với Cmd từ Shell trong VBA: https://docs.microsoft.com/vi-vn/windows/desktop/TaskSchd/schtasks

Cách 2: Nếu máy tính luôn mở thì sử dụng code VBA sử dụng timeout.exe để đặt thời gian mở ứng dụng của bạn:
Trong code có hai thủ tục, 1 là để tạo task để mở ứng dụng, 2 là dừng task

PHP:
Const TaskSchedulerVB = "TaskSchedulerVB"
Const MyTask = "MyTask"
Public Sub MYTASKRUN()
  On Error Resume Next
  Call MYTASKTERMINATE
  Dim s&, t$
  s = DateDiff("s", VBA.Now - VBA.Date, TimeSerial(17, 0, 0))
  If S < 1 Then
    Exit Sub
  End If
  t = "cmd.exe /S /C timeout /t " & CStr(s) & " && START ""Task17PM"" /B """ & Application.Path & "\EXCEL.EXE"" """ & ThisWorkbook.FullName & """"
  Call VBA.SaveSetting(TaskSchedulerVB, "Tasks", MyTask, s)
  Shell "cmd.exe /S /C START ""NewTask"" /B && " & t, vbHide
  On Error GoTo 0
End Sub

Public Sub MYTASKTERMINATE()
  On Error Resume Next
  Dim s$, p
  s = VBA.GetSetting(TaskSchedulerVB, "Tasks", MyTask)
  If s = vbNullString Then
    Exit Sub
  End If

  For Each p In VBA.GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
                             ("SELECT * FROM Win32_Process WHERE name like ""timeout.exe""", , 48)
    If p.commandline Like "* /t *" & s & "*" Then
      p.Terminate
      DeleteSetting TaskSchedulerVB
      Exit For
    End If
  Next
End Sub
 
Upvote 0
Bạn chụp màn hình phun không cắt toàn bộ phần mềm đã mở lên xem tên nó là gì. Hoặc vào mục Help >> About... xem tên là gì.

Cái từ khóa bạn gõ để tìm không nói lên gì cả.

View attachment 256837

---
Làm theo hướng dẫn ở trên ấy.

Mục Actions:
- Program: Nhập đường dẫn đầy đủ file chạy của phần mềm Excel.
- arguments: Nhập đường dẫn đầy đủ của file Excel cần mở.

* Lấy đường dẫn Excel.exe như hình
View attachment 256839
View attachment 256840

buonphatchan12

Có 2 cách cho bạn:​

Cách 1: Sử dụng API của Task Scheduler trong Win Server;
1 click tạo Task Schedule từ Excel VBA: Hướng dẫn tại đây
Dùng SchTasks.Exe Với Cmd từ Shell trong VBA: https://docs.microsoft.com/vi-vn/windows/desktop/TaskSchd/schtasks

Cách 2: Nếu máy tính luôn mở thì sử dụng code VBA sử dụng timeout.exe để đặt thời gian mở ứng dụng của bạn:
Trong code có hai thủ tục, 1 là để tạo task để mở ứng dụng, 2 là dừng task

PHP:
Const TaskSchedulerVB = "TaskSchedulerVB"
Const MyTask = "MyTask"
Public Sub MYTASKRUN()
  On Error Resume Next
  Call MYTASKTERMINATE
  Dim s&, t$
  s = DateDiff("s", VBA.Now - VBA.Date, TimeSerial(17, 0, 0))
  If S < 1 Then
    Exit Sub
  End If
  t = "cmd.exe /S /C timeout /t " & CStr(s) & " && START ""Task17PM"" /B """ & Application.Path & "\EXCEL.EXE"" """ & ThisWorkbook.FullName & """"
  Call VBA.SaveSetting(TaskSchedulerVB, "Tasks", MyTask, s)
  Shell "cmd.exe /S /C START ""NewTask"" /B && " & t, vbHide
  On Error GoTo 0
End Sub

Public Sub MYTASKTERMINATE()
  On Error Resume Next
  Dim s$, p
  s = VBA.GetSetting(TaskSchedulerVB, "Tasks", MyTask)
  If s = vbNullString Then
    Exit Sub
  End If

  For Each p In VBA.GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
                             ("SELECT * FROM Win32_Process WHERE name like ""timeout.exe""", , 48)
    If p.commandline Like "* /t *" & s & "*" Then
      p.Terminate
      DeleteSetting TaskSchedulerVB
      Exit For
    End If
  Next
End Sub
Bạn có vô tới phần Edit của Action chưa? Đã chỉ định đúng Program/Script là đường dẫn chương trình Excel chưa? Đã nạp đường dẫn file Excel vào ô "Add argument" chưa? Hay là bạn còn chưa biết cái mục Edit đó nằm chỗ nào?

Nếu chưa biết thì click phải lên cái Task của bạn, chọn Properties ấy, sau đó có cái tab Action, rồi chọn tiếp Edit, rồi nó sẽ hiện lên 2 cái ô để nạp vào thông số chạy. Mấy cái này phải chịu khó thử chứ hỏi tới hỏi lui mất thời gian cho bạn.
1617953242240.png

Em làm được rồi ạ
Nhưng vấn đề 2 ở bài 1 em có hỏi là em sau khi refreshAll thì phải có 1 khoảng thời gian đợi cập nhật nguồn.
Thì cần làm như nào để khi kết thúc quá trình mới thực hiện code tiếp theo
Em có dùng Application.Wait (Now() + TimeValue("00:00:50")) nhưng không được ạ!
 
Upvote 0
1/ Lấy thông tin ở status bar rồi xử lý.

2/ Hoặc bỏ cái query đó đi, viết code mới, ngon hơn nhiều.
Có nghĩa là khi khởi động file thì sẽ phải refresh nguồn để cập nhật số liệu mới. Xong rồi thêm sheet mới cùng mới thư mục file vừa refresh ( để lưu dữ liệu cập nhật hàng ngày) nhưng thời gian chờ để refresh nguôn là khoảng 1-2 phút, như thế chưa cập nhật dữ liệu xong thì code đã chạy rồi như vậy dữ liệu backup lại nó không đúng!. A có cách nào hỗ trợ vấn đề này giúp e không ạ
 
Upvote 0
Có nghĩa là khi khởi động file thì sẽ phải refresh nguồn để cập nhật số liệu mới. Xong rồi thêm sheet mới cùng mới thư mục file vừa refresh ( để lưu dữ liệu cập nhật hàng ngày) nhưng thời gian chờ để refresh nguôn là khoảng 1-2 phút, như thế chưa cập nhật dữ liệu xong thì code đã chạy rồi như vậy dữ liệu backup lại nó không đúng!. A có cách nào hỗ trợ vấn đề này giúp e không ạ

Đoán 99% là bạn đang dùng công cụ Query lấy dữ liệu từ một link nào đó.

Đã trả lời ở trên rồi còn gì. Có 2 cách đó.
 
Upvote 0
1/ Lấy thông tin ở status bar rồi xử lý.

2/ Hoặc bỏ cái query đó đi, viết code mới, ngon hơn nhiều.

Sub run_sql_sub(sql)
Dim i, kq, r As Long
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

With cn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
ThisWorkbook.FullName _
& ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
.Open
End With

rs.Open sql, cn
Application.ScreenUpdating = False
ActiveSheet.Range("A5:XX10000").ClearContents

For i = 0 To rs.Fields.Count - 1
Range("A5").Offset(0, i).Value = rs.Fields(i).Name
Next

kq = Range("A6").CopyFromRecordset(rs)
Application.ScreenUpdating = True
rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
Sub runsql()
run_sql_sub Trim(Sheet2.Range("A1"))
End Sub

mình thay đổi connectionstring để kết nối với sql nhưng 1618021730458.png
có cách nào kết nối vào chỉ lấy dữ liệu xuống không ạ. Cám ơn nhiều
 
Upvote 0

buonphatchan12

Có 2 cách cho bạn:​

Cách 1: Sử dụng API của Task Scheduler trong Win Server;
1 click tạo Task Schedule từ Excel VBA: Hướng dẫn tại đây
Dùng SchTasks.Exe Với Cmd từ Shell trong VBA: https://docs.microsoft.com/vi-vn/windows/desktop/TaskSchd/schtasks

Cách 2: Nếu máy tính luôn mở thì sử dụng code VBA sử dụng timeout.exe để đặt thời gian mở ứng dụng của bạn:
Trong code có hai thủ tục, 1 là để tạo task để mở ứng dụng, 2 là dừng task

PHP:
Const TaskSchedulerVB = "TaskSchedulerVB"
Const MyTask = "MyTask"
Public Sub MYTASKRUN()
  On Error Resume Next
  Call MYTASKTERMINATE
  Dim s&, t$
  s = DateDiff("s", VBA.Now - VBA.Date, TimeSerial(17, 0, 0))
  If S < 1 Then
    Exit Sub
  End If
  t = "cmd.exe /S /C timeout /t " & CStr(s) & " && START ""Task17PM"" /B """ & Application.Path & "\EXCEL.EXE"" """ & ThisWorkbook.FullName & """"
  Call VBA.SaveSetting(TaskSchedulerVB, "Tasks", MyTask, s)
  Shell "cmd.exe /S /C START ""NewTask"" /B && " & t, vbHide
  On Error GoTo 0
End Sub

Public Sub MYTASKTERMINATE()
  On Error Resume Next
  Dim s$, p
  s = VBA.GetSetting(TaskSchedulerVB, "Tasks", MyTask)
  If s = vbNullString Then
    Exit Sub
  End If

  For Each p In VBA.GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
                             ("SELECT * FROM Win32_Process WHERE name like ""timeout.exe""", , 48)
    If p.commandline Like "* /t *" & s & "*" Then
      p.Terminate
      DeleteSetting TaskSchedulerVB
      Exit For
    End If
  Next
End Sub

buonphatchan12

Có 2 cách cho bạn:​

Cách 1: Sử dụng API của Task Scheduler trong Win Server;
1 click tạo Task Schedule từ Excel VBA: Hướng dẫn tại đây
Dùng SchTasks.Exe Với Cmd từ Shell trong VBA: https://docs.microsoft.com/vi-vn/windows/desktop/TaskSchd/schtasks

Cách 2: Nếu máy tính luôn mở thì sử dụng code VBA sử dụng timeout.exe để đặt thời gian mở ứng dụng của bạn:
Trong code có hai thủ tục, 1 là để tạo task để mở ứng dụng, 2 là dừng task

PHP:
Const TaskSchedulerVB = "TaskSchedulerVB"
Const MyTask = "MyTask"
Public Sub MYTASKRUN()
  On Error Resume Next
  Call MYTASKTERMINATE
  Dim s&, t$
  s = DateDiff("s", VBA.Now - VBA.Date, TimeSerial(17, 0, 0))
  If S < 1 Then
    Exit Sub
  End If
  t = "cmd.exe /S /C timeout /t " & CStr(s) & " && START ""Task17PM"" /B """ & Application.Path & "\EXCEL.EXE"" """ & ThisWorkbook.FullName & """"
  Call VBA.SaveSetting(TaskSchedulerVB, "Tasks", MyTask, s)
  Shell "cmd.exe /S /C START ""NewTask"" /B && " & t, vbHide
  On Error GoTo 0
End Sub

Public Sub MYTASKTERMINATE()
  On Error Resume Next
  Dim s$, p
  s = VBA.GetSetting(TaskSchedulerVB, "Tasks", MyTask)
  If s = vbNullString Then
    Exit Sub
  End If

  For Each p In VBA.GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
                             ("SELECT * FROM Win32_Process WHERE name like ""timeout.exe""", , 48)
    If p.commandline Like "* /t *" & s & "*" Then
      p.Terminate
      DeleteSetting TaskSchedulerVB
      Exit For
    End If
  Next
End Sub
Anh ơi, code này chỉ chạy khi mình play code. còn khi code chạy mở file, và đóng file lại, thì ngày hôm sau đúng giờ đó lại không tự mở file ạ. Có cách nào khắc phục không anh
 
Upvote 0
Web KT

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

Back
Top Bottom