|
こんばんは。
VBSとVBAを組み合わせてみました。
>
>ブックを二つ用意します。
>
>1のブック dsptime.xls
> 機能 ユーザーフォームに時間経過を表示する機能を持つ
>
>2のブック setcell.xls
> 機能 setcell.xlsの最左端シートのA列に1から20000までの数値を書き込む
>
3VBSスクリプト vbstest.vbs
機能 setcell.xlsの最左端シートのA列に1から20000までの数値を書き込む時間を 計測し、setcell.xlsの最左端シートのセルB1処理時間を出力する
>
>dsptime.xls
>
>ユーザーフォーム(Userform1)を一つ用意してください。
> このUserform1には、
> Label1 開始時間の表示
> Label2 現在の時間を表示
> という二つのラベルを用意してください。
>
> ふたつのラベルには、hh:mm:ss形式で時刻を表示しますので、それに
> 足りうる幅をラベルは有します。
>
>コードです。
>
>
>Thisworkbookのモジュールに
Option Explicit
Public 時間 As Date
Sub set_proc()
Application.OnTime Now(), "thisworkbook.dspform"
End Sub
'==================================================================
Sub dspform()
UserForm1.Show
End Sub
'==================================================================
Sub unloadform()
' Userform1の消去
Unload UserForm1
End Sub
'==================================================================
Sub hideform()
' 時間表示を停止する
UserForm1.dsp = False
End Sub
'==================================================================
Sub set_tm(rng As Range)
' 開始から、停止までの時間を指定されたセルに設定する
rng.Value = 時間
End Sub
>
Userform1のモジュールは、ちょっと変更。
>'===================================================================
Option Explicit
Public dsp As Boolean
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const temae_set = -1
Const hyoji = &H40
Const nonesz = &H1
Const nonemv = &H2
'===================================================================
Private Sub UserForm_Activate()
Dim hwnd As Long, ret As Long
hwnd = FindWindow("ThunderDFrame", Me.Caption)
ret = SetWindowPos(hwnd, temae_set, 0, _
0, 0, 0, hyoji Or nonemv Or nonesz)
dsp = True
Label1.Caption = Format([now()], "hh:mm:ss")
Do While dsp = True
Label2.Caption = Format([now()], "hh:mm:ss")
DoEvents
Sleep 300
Loop
ThisWorkbook.時間 = CDate(Label2.Caption) - CDate(Label1.Caption)
Me.Hide
End Sub
'===================================================================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> 1 Then
Cancel = True
End If
End Sub
>setcell.xlsのコード
標準モジュールから、Thisworkbookのモジュールに変更
'=====================================================================
Option Explicit
Sub set_cell()
Dim g0 As Long
ThisWorkbook.Activate
Worksheets(1).Activate
Range("a:a").ClearContents
For g0 = 1 To 20000
With Cells(g0, 1)
.Select
.Value = g0
End With
Next
End Sub
最後にvbstest.vbsのコード
'=====================================================================
Dim g0 ,ex,dbk,fs
set fs=createobject("scripting.filesystemobject")
with CreateObject("excel.application")
.visible=true
with .workbooks.Open(fs.GetParentFolderName(wscript.scriptfullname) & "\setcell.xls")
Set ex = CreateObject("excel.application")
Set dbk = ex.Workbooks.Open(fs.GetParentFolderName(wscript.scriptfullname) & "\dsptime.xls")
dbk.set_proc
.set_cell
.worksheets(1).Range("b1").NumberFormatLocal = "hh:mm:ss"
dbk.hideform
dbk.set_tm .worksheets(1).Range("b1")
dbk.unloadform
dbk.Close False
ex.Quit
end with
end with
set ex=nothing
set dbk=nothing
set fs=nothing
>
上記のブックとVBSスクリプトを全て同じフォルダ上に保存した後、
vbstest.vbsを実行してみてください。
尚、この投稿からコピーする場合は、VBSコードの
.visible=true
頭の空白が全角になっているので、半角に修正して保存しなければならないので
注意が必要です(全角のままだとエラーになります)
この手のことを実現するには、結構、工夫が必要ですね!!
試してみてください。
(この場合は、時間表示のユーザーフォームが非アクティブにしても
時間は、正常に取得できました)
|
|