Category: Development - Excel / VB > Development - VB.NET Tags: ---
【VB.NET】簡単に経過時間を表示するには、「これ」どうですか?
今回のサンプルは VB.NET の
「経過時間の表示」 についてです。
ぐるぐる回しながら大量のデータを扱う場合
一体どのくらい時間がかかったのかを知る必要があります。
なぜならば、1件処理するための時間が把握できれば
トータルどのくらいの時間がかかるかを予測することができるからです。
処理実行直後、
「あとこのくらいかかるよ」
と使用者に暫定的な時間であっても知らせることで
「待つ」という感覚を和らげることができる。
ひいては無用なストレスをかけないことにもつながりますからね。
と言うことで
と、こんな感じ!
では解説を
今回の処理は
「C:\TestFolder」の中にある
頭に「Test」と付いているエクセルのワークブックを
「C:\TestMoveFolder」と言うフォルダの中にコピーする。
この時、ペーストするファイルには頭に「Test_」という文字も付加します。
ここからが今回の「経過時間」の表示に関するステップ
まずは処理の開始直後に取得した時間
Dim StartDatetime As DateTime = Now
から現在の時間を使用して何秒かかったかを計算
Dim MyTime As Long = DateDiff(DateInterval.Second, StartDatetime, Now)
次に経過した時間を処理した件数で除算(割り算)することで
1件当たりにかかった時間を算出します。
Dim MyAVGTime As Long = Math.Round(MyTime / i)
次の「If i Mod 50 = 0」とは 処理した件数 i が 50 で割り切れるかチェック
つまり 50件 処理したら
フォームのメッセージエリアにメッセージを表示させるということ。
先に計算した「MyTime」は、あくまでも秒数ですから見やすくするために
DateAdd(DateInterval.Second, MyTime, DateValue("00:00:00"))
を使用します。
上記の構文を使用することで
何時間何分何秒かかったかを一目で見ることができますよね。
ここからは蛇足ですが
「DoEvents()」をわざわざ使用していますが...
まぁ、通常であれば処理に負担をかける
この処理を組み込むことは避けたいと思いがちですが、
今回の処理は大量のデータを処理する
というポイントがこれ組み込んだ理由づけですかね。
それは「時間のかかる処理での応答なしを防止する」ということ。
表示しているフォームが「応答なし」と表示されてしまうと
「あれ?処理が止まっちゃっているの??」
と使用者に思われてしまいますので
それを回避するための対策になっています。
う~ん、
システム構築(小さなプログラムモジュールでもそうですが)
組み上げるシステム構築者の立場より
使用するエンドユーザの立場になってプログラムを作る必要がある
と私は考えています。
多少作るのに面倒でも
使う人にやさしいプログラムの方が浸透しやすいですからね。
と言うことで今回はこれにて
(o^□^o)ノ
※今回の開発環境「Microsoft Visual Studio 2008」WindowsOS「WindowsXP」
「経過時間の表示」 についてです。
ぐるぐる回しながら大量のデータを扱う場合
一体どのくらい時間がかかったのかを知る必要があります。
なぜならば、1件処理するための時間が把握できれば
トータルどのくらいの時間がかかるかを予測することができるからです。
処理実行直後、
「あとこのくらいかかるよ」
と使用者に暫定的な時間であっても知らせることで
「待つ」という感覚を和らげることができる。
ひいては無用なストレスをかけないことにもつながりますからね。
と言うことで
Public Class TestClass Private Sub TestForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim StartDatetime As DateTime = Now Dim i As Integer = 0 Dim MyFileArray As ArrayList = _ New ArrayList(My.Computer.FileSystem.GetFiles("C:\TestFolder", FileIO.SearchOption.SearchTopLevelOnly, "Test*.xls")) MyFileArray.Sort() For Each MyFile In MyFileArray Dim MyOutFile As String = "C:\TestMoveFolder\Test_" & System.IO.Path.GetFileNameWithoutExtension(MyFile) & ".xls" i += 1 My.Computer.FileSystem.CopyFile(MyFile, MyOutFile, True) Dim MyTime As Long = DateDiff(DateInterval.Second, StartDatetime, Now) Dim MyAVGTime As Long = Math.Round(MyTime / i) If i Mod 50 = 0 Then Me.msg.Text = Format(i, "#,##0") & " 件のエクセルワークブックをコピーしました。" & vbCrLf & _ "経過時間:" & DateAdd(DateInterval.Second, MyTime, DateValue("00:00:00")) & vbCrLf & _ "平均時間:" & DateAdd(DateInterval.Second, MyAVGTime, DateValue("00:00:00")) Me.Refresh() End If DoEvents() Next Me.msg.Text = "" Me.Refresh() MessageBox.Show("処理が終了しました。 ", "【正常終了】", MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub Private Sub TestForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Me.Dispose() End Sub End Class |
と、こんな感じ!
では解説を
今回の処理は
「C:\TestFolder」の中にある
頭に「Test」と付いているエクセルのワークブックを
「C:\TestMoveFolder」と言うフォルダの中にコピーする。
この時、ペーストするファイルには頭に「Test_」という文字も付加します。
ここからが今回の「経過時間」の表示に関するステップ
まずは処理の開始直後に取得した時間
Dim StartDatetime As DateTime = Now
から現在の時間を使用して何秒かかったかを計算
Dim MyTime As Long = DateDiff(DateInterval.Second, StartDatetime, Now)
次に経過した時間を処理した件数で除算(割り算)することで
1件当たりにかかった時間を算出します。
Dim MyAVGTime As Long = Math.Round(MyTime / i)
次の「If i Mod 50 = 0」とは 処理した件数 i が 50 で割り切れるかチェック
つまり 50件 処理したら
フォームのメッセージエリアにメッセージを表示させるということ。
先に計算した「MyTime」は、あくまでも秒数ですから見やすくするために
DateAdd(DateInterval.Second, MyTime, DateValue("00:00:00"))
を使用します。
上記の構文を使用することで
何時間何分何秒かかったかを一目で見ることができますよね。
ここからは蛇足ですが
「DoEvents()」をわざわざ使用していますが...
まぁ、通常であれば処理に負担をかける
この処理を組み込むことは避けたいと思いがちですが、
今回の処理は大量のデータを処理する
というポイントがこれ組み込んだ理由づけですかね。
それは「時間のかかる処理での応答なしを防止する」ということ。
表示しているフォームが「応答なし」と表示されてしまうと
「あれ?処理が止まっちゃっているの??」
と使用者に思われてしまいますので
それを回避するための対策になっています。
う~ん、
システム構築(小さなプログラムモジュールでもそうですが)
組み上げるシステム構築者の立場より
使用するエンドユーザの立場になってプログラムを作る必要がある
と私は考えています。
多少作るのに面倒でも
使う人にやさしいプログラムの方が浸透しやすいですからね。
と言うことで今回はこれにて
(o^□^o)ノ
※今回の開発環境「Microsoft Visual Studio 2008」WindowsOS「WindowsXP」
|
|