teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

バグ修正

2016/07/21 09:17

投稿

hihijiji
hihijiji

スコア4152

answer CHANGED
@@ -23,10 +23,8 @@
23
23
 
24
24
  Dim count As Long
25
25
  For count = 0 To numOfTimes
26
- With TARGET_APP
27
- .Wait TimeSerial(Hour(myTime), Minute(myTime), Second(myTime) + waitingTime * count)
26
+ Application.Wait TimeSerial(Hour(myTime), Minute(myTime), Second(myTime) + waitingTime * count)
28
- .Run procedureName
27
+     TARGET_APP.Run procedureName
29
- End With
30
28
  Next count
31
29
 
32
30
  End Sub

1

コード追記

2016/07/21 09:17

投稿

hihijiji
hihijiji

スコア4152

answer CHANGED
@@ -1,4 +1,73 @@
1
1
  EXCEL-VBAはシングルスレッドでしか動かないので、タイマーで制御するような使い方は困難です。
2
2
  例えば、
3
3
  ・別のEXCELプロセスを起動して、その別プロセスから10秒毎に元のプロセスのプロシージャをコールする。
4
- など一工夫必要になります。
4
+ など一工夫必要になります。
5
+
6
+ 以下追記しました。
7
+ --timer.xlsmの標準モジュール--
8
+ ```lang-vbscript
9
+ Option Explicit
10
+
11
+ Dim TARGET_APP As Application
12
+ Dim TARGET_BOOK As Workbook
13
+
14
+ Public Sub SetTarget(bookName As String)
15
+ Set TARGET_BOOK = GetObject(bookName)
16
+ Set TARGET_APP = TARGET_BOOK.Application
17
+ End Sub
18
+
19
+ Public Sub StartTimer(procedureName As String, numOfTimes As Long, waitingTime As Long)
20
+
21
+ Dim myTime As Date
22
+ myTime = Now()
23
+
24
+ Dim count As Long
25
+ For count = 0 To numOfTimes
26
+ With TARGET_APP
27
+ .Wait TimeSerial(Hour(myTime), Minute(myTime), Second(myTime) + waitingTime * count)
28
+ .Run procedureName
29
+ End With
30
+ Next count
31
+
32
+ End Sub
33
+ ```
34
+
35
+ --TextBook.xlsmの標準モジュール--
36
+ ```lang-vbscript
37
+ Option Explicit
38
+ Dim TIMER_BOOK As Workbook
39
+ Const TIMER_BOOK_FILENAME = "D:\timer.xlsm"
40
+
41
+ Public Sub Test()
42
+ Dim fso As Object
43
+ Set fso = CreateObject("Scripting.FileSystemObject")
44
+
45
+ Dim tmpFileName As String
46
+ tmpFileName = fso.GetSpecialFolder(2) & "\" & fso.GetBaseName(fso.GetTempName) & ".xlsm"
47
+
48
+ FileCopy TIMER_BOOK_FILENAME, tmpFileName
49
+
50
+ Dim otherApp As Application
51
+ Set otherApp = New Application
52
+
53
+ Set TIMER_BOOK = otherApp.Workbooks.Open(tmpFileName)
54
+ With TIMER_BOOK.Application
55
+ .Run "SetTarget", ThisWorkbook.FullName
56
+ .Run "StartTimer", "MoveNext", 10, 10
57
+ End With
58
+
59
+ End Sub
60
+
61
+ Public Sub End_Test()
62
+ If (Not TIMER_BOOK Is Nothing) Then
63
+ Dim bookName As String
64
+ bookName = TIMER_BOOK.FullName
65
+ TIMER_BOOK.Application.Quit
66
+ Kill bookName
67
+ End If
68
+ End Sub
69
+
70
+ Public Sub MoveNext()
71
+ '省略
72
+ End Sub
73
+ ```